Sind deine Blöcke alle unterschiedlich texturiert?
Hier mal ein Pseudocode Beispiel einer 'maximal ineffizienten Render Pipeline':
|
Quellcode
|
1
2
3
4
5
|
// Schlecht:
foreach block in blockList:
BindTexture(block.texture)
DrawMesh(block.mesh)
UnbindTexture(block.texture)
|
Wenn jeder Block seine eigene Textur hat, und die vor jedem Rendern eines Blocks aktiviert wird,
ist das wohl der größte Flaschenhals, da das Binden einer Texture mit am langsamsten ist (gleich nach dem Binden von RenderTargets).
Was also schon mal helfen würde, wäre alle Texturen (wenn sie gleich groß sind) in eine
2D Array Texture zu packen
und dann im Shader für jeden Block den jeweiligen Layer auswählen (falls du dich schon etwas mit Shadern auskennst und 2D Array Textures von Irrlicht unterstützt werden).
|
Quellcode
|
1
2
3
4
5
6
|
// Besser:
BindShader(blockShader)
BindTexture(blockArrayTexture)
DrawMeshInstanced(blockMeshTemplate, numberOfBlocks)
UnbindTexture(blockArrayTexture)
UnbindShader(blockShader)
|
Ansonsten kann ich nur noch mal wiederholen, was bereits erwähnt wurde: Lieber 10 mal 10000 Dreiecke rendern anstatt 10000 mal 10 Dreiecke Rendern.
Falls sich das nicht vermeiden lässt (weil alle Blöcke dynamisch transformiert werden sollen) würde es helfen, den Vertex/Index Buffer (der ja bei den Blöcken immer der selbe sein sollte)
einmal zu binden und dann nur noch
Draw Calls rauszuhauen. Das Binden eines Vertex/Index Buffers kann nämlich auch kritischer sein, als der eigentliche Draw Call.
Desweiteren ist hier natürlich
Hardware Instancing empfehlenswert, was ja auch schon genannt wurde.
Natürlich ist es einfacher alle Objekte unabhängig von einander zu zeichnen, aber die GPU mag eben große aber dafür weniger Datenblöcke :-)
Das Stichwort heißt hier
Throughput.
Natürlich ist auch
View Frustum Culling kombiniert mit
Bounding Volume Hierarchies nicht zu verachten ;-)
Wenn du etwas ähnliches wie Minecraft machen willst, ist es sicher vernünftig, sich die Technik mal genauer anzuschauen.
Ansonsten kannst du dich ja mal mit den oben genannten Verfahren auseinandersetzen.
Gruß,
Lukas