[gelöst] Batching-Strategie
Verfasst: 26.06.2009, 11:50
Edit: Lösung weiter unten: http://zfx.info/viewtopic.php?p=5422#p5422
Hallo Grafik-Gurus,
ich hab da mal ein Problem: Für meine kleine Engine (vgl. Vorstellungsbereich) arbeite ich zur Zeit mit Quake3-BSPs. Das kann sich irgendwann ändern, das Welt-Modul der Engine kann einfach ausgetauscht werden, weil objekt-orientiert und so. Das Format versorgt mich aufgrund des Alters von vornherein mit wenigen Polygonen, Frustum-Culling und PVS tragen dazu auch ganz gut bei. Trotzdem: Langsam wie Sau! Wer das Format kennt, wird ahnen wieso: Ich render die sogenannten Faces. Das heißt für einmal Welt zeichnen gerne mal 1300 DrawIndexedWhatever-Calls, wahrscheinlich in bestimmten Karten noch einiges mehr.
Meine X700 (Shader 2.0) Grafikkarte ist damit natürlich arg belastet, nur Welt rendern drückt stellenweise auf 15 Frames runter. Eine bessere Karte ist aber grade keine Option und ohnehin nicht die Lösung des Problems. Die Lösung ist, ich brauche besseres Batching, oder anders: mehr Polygone pro Draw-Call.
Ich muss also die Faces zu Batches zusammenfassen, da bleibt aber die Frage, nach welchem Schema?
1. Grundlegend natürlich getrennt nach Material, also pro Batch das gleiche Material, sonst müßte ich halt mehr Material-Handling machen und das auch noch den Shadern aufzwingen. Da diese konzeptionell getrennt sind von der eigentlichen Engine soll das nicht geschehen, also bleibts bei 1 Material pro Batch.
2. Quake3 hat Lightmaps in den BSPs. Zwar keine moderne Technik mehr, aber ein angenehmer Effekt für wenig aufwand, warum also nicht nutzen? Aber Lightmaps sind getrennt von Materialien. Gleiche Frage: 1 Lightmap pro Batch oder das Handling mehrer Lightmaps zu den Shadern weitergeben? Hier bin ich etwas unentschieden, tendiere aber wie zu der 1-je-Batch-Variante. Oder keine Lightmaps und alles aus den restlichen Daten beleuchten. Da fehlt mir allerdings Kenntnis ob die Lichter, mit denen die Lightmaps erzeugt wurden, noch vollständig in den Entities vorhanden sind. Auch könnte es sein, dass Faces mit gleichem Material oft die gleiche Lightmap verwenden, d.h. die 1-je-Batch-Variante wäre fast optimal, weil sie nur wenig mehr Batches hätte als Varianten mit mehr Lightmaps.
3. Batchgröße, sowohl in der Welt als auch nach Vertex/Triangle-Count. Größere Batches machen natürlich weniger Drawcalls, dafür mehr Dreiecke, die gar nicht zu sehen sind, aber der reine Vertex/Triangle-Count ist nicht das problem glaube ich. Batche ich aber zuviel zusammen, kann ich mir bald das Frustum- und Occlusion-Culling sparen, weil ich annähernd das halbe Level zeichen wenn vor mir eine gewisse Auswahl an Materialien zu sehen ist.
Vor allem zu 2. und 3. wäre ich über Erfahrungsberichte und Einschätzungen dankbar. Noch als Denkhilfe: Mit ca 500 Draw-Calls pro Frame schaff ich 60 Fps, aber das Budget sinkt sicher noch wegen Rendertarget-Switches etc. Das ganze muss dann noch aufgeteilt werden, da Welt und Entities ja für die Shadowmaps nochmals gerendert werden, zum Teil wahrscheinlich mehrmals. Ich rechne ganz grob mit weniger als 50 Calls Budget zum Zeichnen der Welt, natürlich mit wenigen Lichtern die Schatten werfen.
Ein Vergleich mit anderen Levelformaten wäre auch ganz nett, gibts da was wo das Batching schon besser organisiert ist? Ich würde langfristig wahrscheinlich auch portal-basiert rendern, es muss also kein PVS haben.
Hallo Grafik-Gurus,
ich hab da mal ein Problem: Für meine kleine Engine (vgl. Vorstellungsbereich) arbeite ich zur Zeit mit Quake3-BSPs. Das kann sich irgendwann ändern, das Welt-Modul der Engine kann einfach ausgetauscht werden, weil objekt-orientiert und so. Das Format versorgt mich aufgrund des Alters von vornherein mit wenigen Polygonen, Frustum-Culling und PVS tragen dazu auch ganz gut bei. Trotzdem: Langsam wie Sau! Wer das Format kennt, wird ahnen wieso: Ich render die sogenannten Faces. Das heißt für einmal Welt zeichnen gerne mal 1300 DrawIndexedWhatever-Calls, wahrscheinlich in bestimmten Karten noch einiges mehr.
Meine X700 (Shader 2.0) Grafikkarte ist damit natürlich arg belastet, nur Welt rendern drückt stellenweise auf 15 Frames runter. Eine bessere Karte ist aber grade keine Option und ohnehin nicht die Lösung des Problems. Die Lösung ist, ich brauche besseres Batching, oder anders: mehr Polygone pro Draw-Call.
Ich muss also die Faces zu Batches zusammenfassen, da bleibt aber die Frage, nach welchem Schema?
1. Grundlegend natürlich getrennt nach Material, also pro Batch das gleiche Material, sonst müßte ich halt mehr Material-Handling machen und das auch noch den Shadern aufzwingen. Da diese konzeptionell getrennt sind von der eigentlichen Engine soll das nicht geschehen, also bleibts bei 1 Material pro Batch.
2. Quake3 hat Lightmaps in den BSPs. Zwar keine moderne Technik mehr, aber ein angenehmer Effekt für wenig aufwand, warum also nicht nutzen? Aber Lightmaps sind getrennt von Materialien. Gleiche Frage: 1 Lightmap pro Batch oder das Handling mehrer Lightmaps zu den Shadern weitergeben? Hier bin ich etwas unentschieden, tendiere aber wie zu der 1-je-Batch-Variante. Oder keine Lightmaps und alles aus den restlichen Daten beleuchten. Da fehlt mir allerdings Kenntnis ob die Lichter, mit denen die Lightmaps erzeugt wurden, noch vollständig in den Entities vorhanden sind. Auch könnte es sein, dass Faces mit gleichem Material oft die gleiche Lightmap verwenden, d.h. die 1-je-Batch-Variante wäre fast optimal, weil sie nur wenig mehr Batches hätte als Varianten mit mehr Lightmaps.
3. Batchgröße, sowohl in der Welt als auch nach Vertex/Triangle-Count. Größere Batches machen natürlich weniger Drawcalls, dafür mehr Dreiecke, die gar nicht zu sehen sind, aber der reine Vertex/Triangle-Count ist nicht das problem glaube ich. Batche ich aber zuviel zusammen, kann ich mir bald das Frustum- und Occlusion-Culling sparen, weil ich annähernd das halbe Level zeichen wenn vor mir eine gewisse Auswahl an Materialien zu sehen ist.
Vor allem zu 2. und 3. wäre ich über Erfahrungsberichte und Einschätzungen dankbar. Noch als Denkhilfe: Mit ca 500 Draw-Calls pro Frame schaff ich 60 Fps, aber das Budget sinkt sicher noch wegen Rendertarget-Switches etc. Das ganze muss dann noch aufgeteilt werden, da Welt und Entities ja für die Shadowmaps nochmals gerendert werden, zum Teil wahrscheinlich mehrmals. Ich rechne ganz grob mit weniger als 50 Calls Budget zum Zeichnen der Welt, natürlich mit wenigen Lichtern die Schatten werfen.
Ein Vergleich mit anderen Levelformaten wäre auch ganz nett, gibts da was wo das Batching schon besser organisiert ist? Ich würde langfristig wahrscheinlich auch portal-basiert rendern, es muss also kein PVS haben.