Seite 1 von 1
[DX9] Texturen am sinnvollsten nutzen
Verfasst: 11.02.2015, 16:09
von Zudomon
Die Frage ist, welches Texturformat sollte ich am besten nutzen?
Also ganz prinzipiell werde ich später das Format verpacken, damit man nicht so einfach auf die Texturen zugreifen kann und um einfach noch Zusatzinformationen zu haben, die man so nicht hätte.
Allerdings bin ich mir noch nicht sicher, welches Format ich grundlegend nutzen soll. Die Texturen an sich liegen in verschiedenen Formaten vor, werden dann aber, beim ersten start als DDS gespeichert.
Zu beachten ist, dass ich möglichst höchste Priorität auf Ladezeit lege. Anschließend wäre mir erst die Dateigröße wichtig.
Allerdings ist auch die Frage, ob ein 4 MB PNG nicht doch schneller zu laden geht, als ein 89 MB DDS. Wobei bei ersterem wohl dann auch noch Mipmaps erstellt werden müssen. Wäre es da eigentlich auch sinnvoll, das selbst nochmal über Shader zu implementieren, da Mipmaps anscheinend ja doch einige Zeit brauchen. Sind wohl noch nicht auf GPU. Zumal wir ja auch über Gamma Korrektur bei den Mipmaps geredet haben.
Außerdem wäre auch noch eine Frage, ob es sinnvoller ist, die Texturen als Paket zusammen zu packen. Ich könnte mir vorstellen, dass das die Ladezeit erhöht.
Vielleicht könnt ihr etwas Licht ins dunkel bringen :D
Re: [DX9] Texturen am sinnvollsten nutzen
Verfasst: 11.02.2015, 16:59
von Spiele Programmierer
Über die Ladezeit kann man schwierig allgemeine Aussagen treffen.
Das hängt von vielen Faktoren ab, zum Beispiel Speichermedium, ob und welches Antivirenprogramm installiert ist oder wie fragmentiert die Festplatte ist. Insgesamt würde ich immer kleinere Daten favorisieren, weil es auch noch Speicherplatz schont(zb. beim Download) und in der Zeit der Multiprozessorsysteme und einer optimierten Lib(wie zb. für Jpeg "libjpeg-turbo") auch kaum langsamer bis schneller sein sollte.
Ich denke, Texturpackete wären auf jeden Fall zu bevorzugen. Ich vermute sehr stark, dass es leicht schneller zu laden wäre - aber bestimmt nicht langsamer. Und es ist auch ein Vorteil für den Nutzer, den viele kleine Dateien brauchen in der Regel mehr Speicheroverhead und gleichzeitig auch noch unverhältnismäßig viel länger beim Kopieren/Verschieben als eine Große. Ich hasse Programme die aus tausenden Minidateien bestehen.
Wenn du selbst kein Format entwickeln willst, würde ich eine Mischlösung aus DDS, JPEG und PNG verwenden, je nach Anforderung. JPEG für "normale" Texturen. PNG für Dinge die Verlustfrei sein müssen und DDS für exotische Formate oder Texturkompression(auf der GPU). MipMaps könntest du prinzipiell überall als seperate Images speichern, wenn du sie vorberechnen willst. Wenn du eh alle Texturen in ein eine große Datei packst, besteht auch nicht der Nachteil, dass es bei JPEG/PNG zu sehr vielen kleinen einzelnen Dateien führen würde. Außer du willst besondere Texturfilter benutzen(jenseits Box Filter ;)), würde ich mir das aber wahrscheinlich sparen und die Daten lieber zur Laufzeit berechnen. Das sollte eigentlich echt schnell gehen und lässt sich extrem gut Parallelisieren und auch Vektorisieren.
Re: [DX9] Texturen am sinnvollsten nutzen
Verfasst: 11.02.2015, 18:09
von Krishty
http://zfx.info/viewtopic.php?f=7&t=846
Zusammenfassung: DDS liegt beim Programmstart bereits fertig im RAM (weil der Windows Page Cache sich erinnert, dass dein Prozess die Datei beim letzten Mal benutzt hat). PNG und andere Formate müssen erstmal von dieser RAM-Kopie dekomprimiert werden und verbrauchen darum sowohl mehr Speicher als auch mehr Rechenzeit. Das ändert sich erst, wenn dein Prozess so viel Speicher verbraucht, dass der Page Cache die Dateien nicht im RAM vorhalten kann – dann profitiert PNG von der geringeren Datenmenge, die geladen werden muss, aber NUR, falls es optimiert wurde.
Re: [DX9] Texturen am sinnvollsten nutzen
Verfasst: 11.02.2015, 18:26
von Spiele Programmierer
Sehr interessant. Allerdings stellt sich mit die Frage, wie es ist wenn man optimierte Routinen einsetzt und alle Prozessorkerne nutzt, falls du das nicht gemacht hast. Bei 2 bis 4 Prozessorkernen(was schon Standard wird), sollte sich die CPU-Zeit ziemlich gut halbieren bzw. vierteln, denke ich.
Es wäre auch interessant mal JPEG auszuprobieren. Das könnte deutlich schneller sein.
EDIT:
Das mit dem Cache gilt aber auch nur bei mehrfachen Starts in einer Reihe.
Wenn man die Exe zum ersten mal seit dem letzten Neustart öffnet, muss Windows ja auf jeden Fall alle Daten irgendwie von der Festplatte in den RAM laden.
Re: [DX9] Texturen am sinnvollsten nutzen
Verfasst: 11.02.2015, 18:59
von Krishty
Nur, wenn du es *direkt* nach dem Start öffnest. Sonst nutzt Windows die Zeit zwischen Systemstart und Programmstart dafür.
Re: [DX9] Texturen am sinnvollsten nutzen
Verfasst: 11.02.2015, 19:12
von Spiele Programmierer
Naja, dann müsste Windows aber in die Zukunft schauen können.
Vielleicht öffne ich das Programm ja gar nicht sondern zum Beispiel Visual Studio - oder andersrum und dann sind die Daten wieder nicht im RAM. Es sind ja auch nicht kleine Daten, ich kann mir kaum vorstellen, dass Windows hoch spekulativ ein paar GB in den RAM lädt.
Re: [DX9] Texturen am sinnvollsten nutzen
Verfasst: 11.02.2015, 19:20
von Krishty
Geh unter Windows 7 in den Task Manager, Tab "Performance", und schau dort unter "Physical Memory (MB)" in die Spalte "Cached". Das sind deine Gigabytes, die Windows spekulativ in den RAM geladen hat. Superfetch ist dabei seit Windows 7 ziemlich genau – es kann relativ zuverlässig vorhergesagt werden, ob ein Programm direkt nach dem Systemstart startet, oder regelmäßig zu ähnlicher Tageszeit. (Nachtrag: Offenbar
speichern sie die Nutzungsmuster nach Wochentagen.) Zusätzlich liegen da zuletzt verwendete Programme und zuletzt verwendete Dateien.
Nach Abzug des Browsers, der immer läuft, und des Browser-Caches mit ZFX reicht das vielleicht nicht für alle 60 GiB Assets von Assassin's Creed – aber zumindest für die paar GiB der Levels, in denen du während der letzten Spiel-Sessions warst. Das Caching erfolgt mit wenigen MiB pro Sekunde in einem Hintergrundthread, die ganze Windows-Laufzeit über. (Dass da Feintuning gefehlt hat war einer der Hauptgründe, warum die Festplatte unter Vista ständig ratterte.) Wenn überraschend ein Prozess gestartet wird, würde es mich nicht wundern, wenn sie sofort volle Pulle zu cachen anfangen, um dem Prozess zuvorzukommen oder zumindest dessen synchrone I/O zu asynchroner zu optimieren.