# "Allgemeine" Performance verbessern (LWJGL 2)



## pcfreak9000 (20. Nov 2016)

Hallo,
ich bastel mir gerade eine 2D Spieleengine mit der LWJGL. Ich denke, ich habe schon viel optimiert, aber vielleicht fällt euch noch was ein.
Was ich bereits habe:
- ich benutze den SpriteBatch und den Shader von:
https://github.com/mattdesl/lwjgl-basics
- Alle GameObjects sind in einer HashMap, die als Key den layer hat, wo das GameObject gerendert werden soll
- GameObjects werden nur gerendert, wenn sie in Sichtweite meiner Camera sind
- keine unnötigen Objektinstanzierungen in der Gameloop
- keine unnötigen neuen Zuordnungen von Variablen (zB Float x; mir fällt der richtige Name gerade nicht ein, oder ist er das?) in der Gameloop -> 99% als Felder

Geplant:
- Textureatlas benutzen/besseren Support einbauen

Beim testen dieses Setups schaffe ich (i7-4790, GTX 770) 1.000.000 Sprites die die gleiche Textur benutzen mit 15-18 FPS.
Ich denke zwar, dass das schon ein netter Wert ist, aber ganz sicher bin ich mir da nicht. Und neulich habe ich ein Video gesehen (



 , ob es genau das Video ist weiß ich nicht mehr aber es ist das Spiel), wo diejenige Person eine ca 6000*2000 Welt hat, und es scheint als es würde flüssig laufen. Wie kann ich das erreichen? Kann ich vlt Multithreading verwenden? Rendering geht ja leider nur im Hauptthread 

Danke für eine Antwort.

EDIT: GL_DEPTH_TEST ist deaktiviert und GL_CULL_FACE ist aktiviert (GL_FRONT)

PS.: Ist vom Handy geschrieben, entschuldigt etwaige Fehler...


----------



## pcfreak9000 (21. Nov 2016)

So, ich habe noch ein bisschen herumhebastelt und es geschafft! 20.000.000 (gleich texturierte) GameObjects bei 250 FPS (dort habe ich die FPS gecapt).

Ich habe jetzt eine Klasse Chunk, die jetzt die GameObject HashMap hat, in der alle GameObjects des Chunks drin sind. Die Scene hat jetzt eine HashMap, die als Key Chunkkoordinaten hat und als Value einen Chunk. Beim Rendern rendere ich jetzt nur noch GameObjects, die in einem Chunk in der Nähe sind, und zwar so, das ich nicht alle Chunks durchgehe wie vorher die GameObjects, sondern mir die passenden Chunks via Chunkkoordinaten aus der Scene hole. Am Ende des Renderns eines GameObjects schaue ich dann noch, ob soch die Chunkkoordinaten des GameObjects geändert haben und wenn ja entferne ich es aus dm alten Chunk und füge es dem neun hinzu, sodass damit aich Bewegungen berücksichtigt werden.

Der Ram wird blos sehr doll auselastet... ich muss mal schauen, ob sich da noh was optimieren lässt.


----------



## RalleYTN (22. Nov 2016)

pcfreak9000 hat gesagt.:


> Der Ram wird blos sehr doll auselastet... ich muss mal schauen, ob sich da noh was optimieren lässt.


Das mehr RAM verwendet wird ist normal bei guter performance. ist halt der trade off.
Wenn du wirklich noch etwas sparen möchtest, solltest du darauf achten so wenig unnötige Daten wie möglich zu haben. Zum Beispiel statt nem Vector3f einfach nur 3 floats verwenden. Beim Objekt Vector3f ist nämlich overhead den du nicht brauchst. Allgemein primitive Datentypen statt Objekten verwenden, falls möglich.


----------

