Verwenden von 16-Bit-Indexpuffern - USHORT vs UINT


7

In D3D11 können sie weiterhin 16-Bit- und 32-Bit- Indexpuffer erstellen .

Nur wenige Modelle verwenden mehr als das Maximum (20.000 KB), das ein USHORT-Indexpuffer verarbeiten kann. Aber zahle ich wirklich schlechte Leistungskosten, wenn ich immer ein INT-Format (32 Bit) verwende?

Speichereinsparungen sind nicht so viel (2 Bytes pro Index!). Für ein 20k-Tri-Modell sind das nur 40 kB Speicher, die wir für die Verwendung von USHORT sparen (im Vergleich zu wahrscheinlich viel mehr nur für die Scheitelpunktdaten für dasselbe Modell).

Lohnt es sich dann wirklich, jemals USHORT-Indexpuffer zu verwenden, oder ist dies nur ein Überbleibsel aus der Zeit, als Computer in den 90er Jahren weniger Speicher hatten?


3
Wenn Sie 100 solcher Modelle laden, sparen Sie 40 MB Arbeitsspeicher. In bestimmten Situationen lohnt es sich, so viel Speicher wie möglich zu sparen (obwohl alles
spielabhängig

2
@thedaian: Das ist eine Antwort.

3
@thedaian, soweit ich das beurteilen kann, ist deine Zahl um den Faktor 10 ^ 8 niedriger. 100 * 40 kB ergeben 4 MB. Auf jeden Fall würde ich mir mehr Sorgen um den Umgang mit 2 Millionen Dreiecken im Allgemeinen machen. 20k ist viel für die meisten Modelle, man kann mit 1k und einer guten Bump Map sehr weit kommen.
aaaaaaaaaaaa

2
Auch die Bandbreite ist wichtig. 4 MB gespeichert sind 4 MB weniger zum Hochladen in den GPU-Speicher. Wie oft Sie dies tatsächlich tun, liegt bei Ihnen.
Justicle

1
Sie können 64k-Dreiecke mit einem 16-Bit-Indexpuffer haben - verwenden Sie einfach einen Dreiecksstreifen anstelle einer Dreiecksliste.
Adam

Antworten:


10

Sie müssen berücksichtigen, dass GPUs beim Abrufen der Daten zum Einspeisen in die Vertex-Shader viele kleine Aufrufe erfordern, da sie nur wenige Dreiecke gleichzeitig zwischenspeichern können und das Abrufen von Daten aus dem VRAM ein sehr langsamer Vorgang ist. Wenn Sie also die Hälfte der Bytes für die Indizes verwenden, kann die GPU doppelt so viele Indizes abrufen, damit der Cache Dreiecke rendert.

4 MB Kann eine kleine Speichermenge für Speicherplatz sein. Wenn Sie jedoch einen komplexen Aufruf ausführen müssen, um nur wenige Bytes von ihnen zu verarbeiten, kann dies die Leistung spürbar beeinträchtigen. Heutzutage sind Grafikkarten leistungsstark genug, um sie in Spielen, in denen nicht viel Geometrie verarbeitet werden muss, irrelevant zu machen. Sie können einige Benchmarks durchführen, um ein Modell mit beiden Indexgrößen zu rendern, wenn Sie es wirklich wissen möchten.

Die Ladezeiten sind auch mit 16-Bit-Indizes und tatsächlich jedem Schreiben oder Lesen schneller, es sei denn, Sie können die Speicherausrichtung und das richtige Paging effektiv steuern. Es geht also nicht nur um den benötigten Speicher, sondern auch darum, wie viel es braucht, um damit umzugehen. Wenn Sie mit dynamischen Puffern arbeiten, die irgendwann zwischen Frames über den Bus zur GPU verschoben werden müssen, sollten Sie nach Möglichkeit 16-Bit-Indizes verwenden. Wenn Sie noch kleinere Geometrien rendern, können Sie viele Indizes in einem einzigen 16-Bit-Indexpuffer stapeln, damit sie alle in einem einzigen Aufruf auf die GPU kopiert werden.

Hier finden Sie einige Informationen zur Funktionsweise der neueren ATI-GPUs:

Schulungsressourcen für ATI Stream-Entwickler (Entschuldigung, ich konnte das genaue Dokument nicht finden) Ich habe nicht viel über die NVidia-Dokumente gelesen, aber ich denke, sie funktionieren mehr oder weniger mit einem ähnlichen Ansatz.


5

Während sich die Speicher- und CPU-Geschwindigkeit im Laufe der Jahre verbessert hat, stoßen Spiele immer noch häufig an die Grenzen von Hardware und Software. Wenn Sie 100 solcher Modelle laden, sparen Sie 4 Megabyte Speicherplatz. In bestimmten Situationen lohnt es sich, so viel Speicher wie möglich zu sparen. Das könnte ausreichen, um ein anderes Modell zu laden, oder um ein paar weitere Soundeffekte oder einen anderen Song einzuspielen. Für die meisten AAA-Spiele ist diese Art von Einsparungen entscheidend, um die Dinge besser als die Konkurrenz zu machen.

Natürlich ist alles spielabhängig und für viele Projekte nicht wirklich wert. Wenn Sie die Hardware jedoch so weit wie möglich vorantreiben möchten, sollten Sie nach Möglichkeiten suchen, um so viel Speicher wie möglich zu sparen, damit Sie Platz für weitere coole Dinge haben.


4

Es geht nicht nur um Erinnerung; Einige Hardware-Komponenten können keine 32-Bit-Indizes unterstützen und müssen die Vertex-Pipeline in Software ausführen, wenn Sie sie verwenden. Es wird seltener, aber Sie können immer noch gelegentlich böse Überraschungen erleben, wenn Sie auf eine stoßen. 16-Bit-Indizes können im Allgemeinen auch schneller ausgeführt werden. Dies kann wichtig sein, wenn Sie unter Leistungsdruck stehen. Sie müssen jedoch den Vorteil der zusätzlichen Leistung von 16-Bit-Indizes im Vergleich zum Kompromiss, dass möglicherweise eine Aufteilung erforderlich ist, bewerten und abwägen ein Modell, weil es keine einzige Antwort auf diese gibt, die in allen Situationen richtig ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.