Hi,
ich habe es jetzt geschafft, ein "Spiel" zu schreiben, in dem man durch eine zufällig generierte Welt laufen kann. Die Welt wird auch immer nachgeladen, wenn man in eine Richtung läuft. Ich habe die Welt in Quadrate aufgeteilt, jedes durch einzelne Instanz einer Terrain-Klasse repräsentiert. Aktuell läuft das folgendermaßen: Wenn man in eine Richtung geht, werden die Klassen-Instanzen der Quadrate, die am weitesten entfernt sind und in der entgegengesetzten Richtung liegen, durch neue Klassen-Instanzen ausgetauscht, deren Quadrate in der Bewegungsrichtung direkt hinter den bereits vorhandenen Quadraten liegen. Das Problem ist nur, dass das Nachladen "ziemlich lange" dauert. Das kann ich wohl auch nicht beschleunigen. Aktuell sind alle Pointer zu den einzelnen Terrain-Klassen-Instanzen in einem Array gespeichert.
Ich habe leider gerade keine Idee, wie ich die Berechnungen für das Nachladen, die zwischen dem Rendern der Frames stattfinden, in einen anderen Thread auslagern kann, sodass das Rendern von den Quadraten, die bereits berechnet sind, trotzdem nebenbei laufen kann und man keine kurzen Ruckler hat, wenn man sich bewegt und Quadrate nachgeladen werden müssen. Wenn ich das in einen anderen Thread auslagere, macht mir der CPU-Cache einen Strich durch die Rechnung, da in dem Render-Thread ja immer noch die alten Pointer im Cache sind. Ich habe ich schon überlegt, einfach ein zweites Array für die Pointer zu benutzen, das ich als volatile definiere, um dann die geänderten Pointer zu kopieren. Ich bin mir aber nicht sicher, ob das eine sinnvolle Lösung ist, da ich nicht weiß, was passiert, wenn die Pointer dorthin zeigen, wo im Cache noch Daten der alten Klasse vorhanden sind.
Allgemein weiß ich auch nicht, ob und wie ich die Berechnungen für Bewegungen von NPCs, Objekten etc. in einen anderen Thread auslagern kann, da diese ja synchron mit den anderen Frames sein sollen. Oder müssen sie das gar nicht sein? Wenn es zu viele NPS/Objekte/andere Spieler werden, sinken die FPS ja drastisch, wenn alles in einem Thread läuft.
Ich will keinen kompletten Quellcode als Antwort auf diesen Thread, mir reichen auch Hinweise, welche C++-Funktionen, die ich vielleicht noch nicht kenne, für mein Anliegen nützlich wären bzw. wie man das im Allgemeinen machen kann.
Grüße,
Magogan
Edit: Kleine Korrekturen.
ich habe es jetzt geschafft, ein "Spiel" zu schreiben, in dem man durch eine zufällig generierte Welt laufen kann. Die Welt wird auch immer nachgeladen, wenn man in eine Richtung läuft. Ich habe die Welt in Quadrate aufgeteilt, jedes durch einzelne Instanz einer Terrain-Klasse repräsentiert. Aktuell läuft das folgendermaßen: Wenn man in eine Richtung geht, werden die Klassen-Instanzen der Quadrate, die am weitesten entfernt sind und in der entgegengesetzten Richtung liegen, durch neue Klassen-Instanzen ausgetauscht, deren Quadrate in der Bewegungsrichtung direkt hinter den bereits vorhandenen Quadraten liegen. Das Problem ist nur, dass das Nachladen "ziemlich lange" dauert. Das kann ich wohl auch nicht beschleunigen. Aktuell sind alle Pointer zu den einzelnen Terrain-Klassen-Instanzen in einem Array gespeichert.
Ich habe leider gerade keine Idee, wie ich die Berechnungen für das Nachladen, die zwischen dem Rendern der Frames stattfinden, in einen anderen Thread auslagern kann, sodass das Rendern von den Quadraten, die bereits berechnet sind, trotzdem nebenbei laufen kann und man keine kurzen Ruckler hat, wenn man sich bewegt und Quadrate nachgeladen werden müssen. Wenn ich das in einen anderen Thread auslagere, macht mir der CPU-Cache einen Strich durch die Rechnung, da in dem Render-Thread ja immer noch die alten Pointer im Cache sind. Ich habe ich schon überlegt, einfach ein zweites Array für die Pointer zu benutzen, das ich als volatile definiere, um dann die geänderten Pointer zu kopieren. Ich bin mir aber nicht sicher, ob das eine sinnvolle Lösung ist, da ich nicht weiß, was passiert, wenn die Pointer dorthin zeigen, wo im Cache noch Daten der alten Klasse vorhanden sind.
Allgemein weiß ich auch nicht, ob und wie ich die Berechnungen für Bewegungen von NPCs, Objekten etc. in einen anderen Thread auslagern kann, da diese ja synchron mit den anderen Frames sein sollen. Oder müssen sie das gar nicht sein? Wenn es zu viele NPS/Objekte/andere Spieler werden, sinken die FPS ja drastisch, wenn alles in einem Thread läuft.
Ich will keinen kompletten Quellcode als Antwort auf diesen Thread, mir reichen auch Hinweise, welche C++-Funktionen, die ich vielleicht noch nicht kenne, für mein Anliegen nützlich wären bzw. wie man das im Allgemeinen machen kann.
Grüße,
Magogan
Edit: Kleine Korrekturen.
Zuletzt bearbeitet: