Fremden Code zu lesen ist meiner Meinung nach keine gute Idee. Du wirst mit genügend Ausdauer (also mehrere Tage Zeitaufwand) zwar wirklich was dabei lernen, aber sicher nicht das, weswegen Du da hingekommen bist. Dazu ist es einfach zuviel Code.
Mein Kurzabriss zu performantem Rendern:
- alles mit nur einem DrawCall zu zeichnen ist unmöglich und auch unwichtig.
- wenige DrawCalls sind wichtig. Für gute Performance auf aktuellen Rechnern solltest Du ganz grob folgende Zahlen im Blick behalten:
DX9, 60fps: 5k Drawcalls
DX9, 30fps: 10k
DX10+, 60fps: 10k
Konsolen: deutlich mehr, aber das ist nur ne fiktive Zahl, weil Du da nie hinkommst.
- abgesehen von den DrawCalls ist noch einiges mehr wichtig:
- State Changes: kann obige Zahlen durchaus halbieren, wenn man nicht aufpasst. Daher immer nach State Changes sortieren
- Reihenfolge: ZBuffer, RenderTarget, Input Declaration, Shader, Texturen, Buffer, Parameter
- denk Dir was SCHLAUES zum Sortieren und Vermeiden doppelter Wechsel aus, sonst kostet Dich das mehr Rechenzeit als Du sparst
- GPU-Seite: ist auf aktuellen Gaming-Rechnern nur selten das Problem. Aber falls doch:
- Pixel Shader - eine aktuelle GPU bietet Dir bei FullHD etwa 100 Texturzugriffe und 500 MatheOps pro Pixel bei 60fps.
- und Vorsicht: GPUs variieren gewaltig. Eine Laptop-GPU hat vielleicht nur ein Zehntel davon, ein SLI-Monster-Gespann dagegen das Vierfache
- das ist trotzdem eine gewaltige Leistung, aber ein schlichtes 5x5PCF einer Lichtquelle frisst schon ein Viertel davon.
- Du kannst für eine Szene durchaus im Kopf grob überschlagen, wieviel Last auf der GPU liegt.
- Vertex Shader ist seltener ein Problem - einige 100k Dreiecke sind keine Belastung
- plus Schatten-Passes und allen sonstigen Neben-Passes kommt man da schnell auf ein paar Millionen Dreiecke
- und es ist trotzdem kein Problem.
- es gibt absonderliche Konstrukte, bei denen andere GPU-Teile als die reine Fragment-Leistung das Limit werden
- aber eh Du soweit bist, erkennst Du die Konstrukte auch selbst
- und zum Schluss: statische Daten sind zu bevorzugen, aber eine gewisse Menge Daten, die einmal oder sogar mehrmals pro Frame hochgeladen werden, bringen Deine Performance nicht um.
- solange Du auf die richtigen Ressourcen- und Map-Flags achtest. Unter DX9 sind die: POOL_DEFAULT, USAGE_DYNAMIC, LOCK_DISCARD oder LOCK_NOOVERWRITE
Alle Zahlen sind nur Hausnummern, auch das Doppelte oder die Hälfte ist durchaus im Rahmen. Aber das sollte als Grund-Aufstellung erstmal reichen.
Bye, Thomas