Batch-Performance und Culling
-
Ich hab doch mal eine sehr allgemeine Frage.
In unserer Engine haben wir ein (wie ich finde sehr simples) Szenenmanagement:
-BoundingVolumen Hierachie
--jedes MeshNode hat ein BV
--mehrere MeshNodes werden vom Artist in eine Gruppe gepackt, diese bildet auch ein BV
--wenn er Spaß hat packt er mehrere Gruppen auch noc in ne Gruppe, toll!
Das sollte natürlich alles im Zusammenhang der räumlichen Verteilung der MeshNodes stehen, ist klar.-Oben drauf gibts da noch die Möglichkeit alle Top Gruppen in Pages zu verwalten.
Jetzt meine Fragen:
Ist Culling auf einem Octree nicht schneller, oder was ist da so Stand der Technik?Wir haben derzeit ca. 300 - 400 DrawCalls in einem Frame und alles spricht dafür, dass die CPU so langsam an ihre Grenzen kommt. Das schließe ich aus folgenden Tatsachen ca. 40 FPS, ~1 Mio. Tris, ~200% Overdraw (earlyZ macht das schon), 1024*768 Resolution. Kein bischen Ausschlaggebend für die Framerate sind jedoch die Shader (alles durchgetestet), noch der tatsächliche Overdraw, sondern allein die Anzahl Batches = Objekte im VF. (API = DX9.0c)
Das kommt mir etwas wenig vor. Der Rechner läuft mit nem Core2Duo(3Ghz) und ner Geforce9800GTX+. Ich will ja auch noch nen paar ShadowMaps (CSM oder PSSM) für das Tageslicht dynamisch berechnen, ne PlainReflectionMap (für nassen Boden, Wasser fützen etc.) und ein bis Cubemaps für Fassadenraflektionen an Gebäuden.
Gibts da nen paar bekannte Pitfalls auf die ihr mich noch hinweisen könnt? -damit es nicht voll daneben geht
Moderne Spiele (Crysis,GTA4) schaffen doch auch 1 bis 3 KiloBatches(pro Frame, nicht je Pass), oder sehe ich das falsch? -ich lande dann vermutlich bei 5 FPS oder so.
Und noch ne dumme Frage:
Es gibt haufenweise Literatur über CuttingEdge Shadertechnik, aber kaum etwas über CuttingEdge CPU Performance Hints und Szenenmanagement und wenn dann liest man was über den 1001ten BSP Algorithmus oder das unter DX9 und sowieso nur begrenzt brauchbare Hardware Instancing. Sind das die wahren Geheimnisse der Industrie?MfG Wally
-
welche fps habt ihr wenn ihr die draw-calls (drawindexed) auskommentiert? (aber alles andere weiterhin so macht wie bisher).
-
welche fps habt ihr wenn ihr die draw-calls (drawindexed) auskommentiert? (aber alles andere weiterhin so macht wie bisher).
Ähhm, das geht Richtung 1000 im "Leerlauf".
Ich hab da so ein Paper von der GDC (aus dem AGP Zeitalter) gelesen. Damals hies es 25.000 batches/s lasten eine 1Ghz CPU vollkommen aus. Durch die PCIe Architekur sollte sich da doch auch was geändert haben, oder?
Und selbst nach dem Satz dürfte das CPU-Limit mit 40FPS bei 300 batches noch nicht ereicht sein.
Ach noch ne Frage fällt mir gerade ein:
wie gut ist das MS Effectframework eigentlich gemanaged, was macht es bei redunanten Statechanges?MfG Wally
-
Wally schrieb:
welche fps habt ihr wenn ihr die draw-calls (drawindexed) auskommentiert? (aber alles andere weiterhin so macht wie bisher).
Ähhm, das geht Richtung 1000 im "Leerlauf".
also nur die drawindexed auskommentiert? shader setzen usw ist drinnen? falls das der fall waere und nun sind es 1000fps dann seit ihr doch gpu limitiert.
Ich hab da so ein Paper von der GDC (aus dem AGP Zeitalter) gelesen. Damals hies es 25.000 batches/s lasten eine 1Ghz CPU vollkommen aus. Durch die PCIe Architekur sollte sich da doch auch was geändert haben, oder?
Und selbst nach dem Satz dürfte das CPU-Limit mit 40FPS bei 300 batches noch nicht ereicht sein.
Ach noch ne Frage fällt mir gerade ein:
wie gut ist das MS Effectframework eigentlich gemanaged, was macht es bei redunanten Statechanges?MfG Wally
ja, ca 2k calls pro frame ist das limit, problem liegt in DiretX bzw windows, jeder call ist teuer durch sicherheitssysteme von windows. das muss man limitieren.
aber ERST muss man ganz sicher rausfinden was dsa problem ist.
sonst optimierst du und hast am ende 0 gewinn, was schade waere.
(wobei deine analyse schonmal lobenswert ist, aber du musst mehr investieren)