Rendergeschwindigkeit optimieren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Huhu!
Ich will mal einen neuen Thread aufmachen, damit das, was ich zu erzählen habe nicht überall verstreut in irgendwelchen anderen Threads beim OT landet.
StoneQuest läuft scheiße, weiß ich ja selbst. Aber ich würde es gerne auch auf Low-End Hardware zum laufen bekommen. Ein paar Erfolge habe ich bereits geschafft und ich wollte hier einfach ein bisschen sammeln und rumprobieren. Vielleicht könnt ihr mir da ja auch noch ein paar Tipps geben.

Also zur Ausgangssituation:
SQ soll auf dem Laptop meiner Freundin, der mit einem Intel Graphics HD 3000 ausgestattet ist, laufen können. Zur Zeit liege ich auf Low bei 10-20 FPS.
Am meisten Speed (auf Low) scheinen die Objekte selbst zu machen. Deaktiviere ich allerdings alles, so dass nur noch das Fullscreenquad für Deferred und Tonemapping übrig bleibt, dann komme ich auch nur auf 55 FPS. Wobei unterdessen waren es 73 FPS, weil ich noch unnötige Rendertargetkopien gemacht habe.

Aber nun mal ein paar Erkenntnisse, die ich sammeln konnte:
Ich habe den Deferred und Tonemapping Shader auf eine LowEnd Version runtergebrochen und auch mit Optimierungen kompilieren lassen und wenn ich mich nicht täusche, bringt das gar nichts. Also die Anzahl der Instruktionen hat sich bei beiden Shadern etwa geviertelt. Aber leider hatte es nichts gebracht. Da muss ich nachher nochmal genau schauen, ob es nun am reinen Overdraw liegt oder was da los ist.

In der Vergangenheit hab ich festgestellt, dass Shader von der Geschwindigkeit her tödlich sind, sobald da Kontrollstrukturen wie Bedingungen oder Schleifen auftauchen. Also auf jeden Fall flatten oder unrollen für Low-End Geräte!

Damals hatte ich auch viele Passes, wo dann z.B. erst G-Buffer befüllt wird, dann Deferred, dann Tonemapping, dann den einen Post Effekt, dann den anderen, usw. Fasst man die ganzen Post Effekte zu möglichst einem Shader zusammen, bringt das schon was.
Das Forward Rendering war damals, soweit ich mich erinnere, nicht unbedingt schneller auf der alten Hardware.
Aber ich merke schon wieder, wenn ich drüber nachdenke, dass ist alles so schwer zu sagen, weil da immer so viele Parameter mit rein spielen.

Jedenfalls ansonsten, Dreiecke sparen, zumindest vorsichtiger einsetzen...

Zum Schluss noch etwas, was mir bisher am übelsten aufgestoßen ist, keinesfalls den VRAM überschreiten. Auch wenn es keine Fehlermeldung gibt... die Geschwindigkeitseinbußen sind dann echt übel. Vor allem schafft der Treiber es manchmal, trotzdem noch das ganze flüssig bereit zu stellen, haut aber dann wieder Lags rein, wo man sich fragt, was hab ich denn da fürn Müll programmiert?!

Wo ich auch noch an vielen Stellen schauen muss, dass ich mich um ein angemessenes Vertexformat kümmere. Zu Beginn hab ich es mir einfach gemacht und ein Format, welches Position, Normalen, Texcoord1 & 2, Tangent und Binormale erzeugt. Ich glaube, auch hier gilt, je weniger, desto besser. Und vielleicht sollte man sich auch nicht scheuen, einfach Dinge über den Vertex-Shader zu berechnen. Wenn man z.B. eine Platte hat, dessen Werte von [0..1] gehen und darauf Planar eine Textur gemappt wird, dann kann man sich die Texturkoordinaten sparen und einfach die Positionsdaten benutzen. Solche Dinge mache ich schon an einigen Stellen.

Die Binormale nutze ich im Shader auch nirgendwo mehr. Allerdings überlege ich, die Normalen und Tangenten zu einem TBN Quaternion zusammen zu fassen. Das ist zumindest noch im Hinterkopf. Vielleicht könnte man sogar noch mehr sparen, indem man X und Y der Normale speichert. In den Z Wert noch einen Rotationswinkel für die Tangente angibt und das Vorzeichen für Z nutzt um zu sagen, ob die Binormale geflippt ist.

Naja, soweit, so gut. Ist vielleicht ein bisschen wirsch jetzt vorgetragen. Aber vielleicht kommt ja dann mit der Zeit Struktur zu den einzelnen Themen rein.
Zuletzt geändert von Zudomon am 21.04.2016, 22:03, insgesamt 2-mal geändert.
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Tiles »

An der reinen Geometrie kann man imho am wenigsten einsparen. Ressourcenfresser sind Shader und Texturen. Wie siehts denn bei dir mit den Drawcalls aus? Das war immer das Erste auf das ich geschaut habe beim optimieren. Drawcalls runterbringen. Und natürlich Occlusion Culling. Wo erst gar nicht gezeichnet wird muss auch nichts eingespart werden.
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Rendergeschwindigkeit optimieren

Beitrag von Matthias Gubisch »

Dann fange ich mal an:

Kontrollstatemants im Shader oder auch Compute Code (zumindest bei Nvida bis zur 780er CudaCode nachvollzogen) sind absolut tödlich. Das liegt zum größten Teil an der Architektur der Grafikkarten und wie Shader abgearbeitet werden. Hier gibt es bei den meisten GPU Herstellern ganz nette optimization Papers wo das alles ganz gut erklärt ist.

Viele kleine Dumme Shader sind oft schneller als große Intelligent. Das liegt daran dass sich auf so einer Grafikkarte viele Shader einen Satz aus Register, SharedMemory usw teilen. Je weniger Memory und Register dein Shader benötigt desto mehr können parallel ausgeführt werden.

Grundsätzlich würde ich dir raten mal zu Profilen welche Shader denn am längsten laufen und diese dann geziehlt zu untersuchen. Manchmal reichen schon ein paar wenige Umstellungen oder weniger Variablen anzulegen um das alles deutlich flotter zu bekommen.

TextureReads und Drawcalls sind auch noch extreme Zeitfresser nachdenen ich suchen würde.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

@Tiles
Drawcalls hab ich bei meiner Überlegung vorhin ganz vergessen! :D
Also auf Low hab ich 90 - 500... je nach Blickrichtung.
Bei 130 Drawcalls sind etwa 830 VertexShader Konstanten und 240 Pixelshaderkonstanten, jeweils 4D Float Vektoren, die gesetzt werden.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

@Matthias Gubisch
Ja, ich hab schon gemerkt, Profilen ist das wichtigste. Und sich vor allem auch alles irgendwie ausgeben lassen. FPS kann man vielleicht noch einigermaßen gefühlt erahnen, aber nicht, wie viele Texturreads nun für ein Frame gemacht wurden.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Ich konnte nun nochmal ein bisschen testen.

Also es macht keinen Unterschied, ob der Deferred Shader 74 oder 1 Instruktion hat. Trotzdem bekomme ich "nur" 73 FPS. Rendere ich das Quad gar nicht, kommt er auf 90 FPS. Ich dachte, dass immer nur wichtig ist, wie viele Instruktionen der PS berechnen muss. Aber das bloße abklappern der Pixel scheint auch schon eine Menge aus zu machen.
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Rendergeschwindigkeit optimieren

Beitrag von Matthias Gubisch »

Das Laden und Starten des Shaders hat ja auch bereits einen Overhead.
Die Instruktionen sind zwar auch entscheidend für die Geschwindigkeit, viel interessanter ist aber die Struktur des Shaders als wieviele Parallel ausgeführt werden können.

Wenn du mit deinem 73 Instruction Shader die ShaderCores komplett auslasten kannst merkst du nur wenig bis gar keinen unterschied zur Komplettauslastung mit nur 1 Instruktion
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Ja, apropo Overhead!

Bei jedem Rendern von Geometrie aktualisiere ich ja die Konstanten usw. und stelle da gerade fest, wo ich mal im Einzelschritt alles durchgehe, dass ich da noch ein SetLength drin habe, um die Konstanten zu zählen! Also er vergrößert quasi bei allem, was an Konstanten geändert wird, das Array um ein Element. :o Das hab ich irgendwann wohl mal vergessen vernünftig zu machen. Vielleicht macht das auch schon so viel aus. Mal umbauen...

EDIT: Okay, das hat Geschwindigkeitsmäßig wohl nichts ausgemacht... scheint wohl doch keinen großen Overhead bedeutet zu haben.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Matthias Gubisch hat geschrieben:Das Laden und Starten des Shaders hat ja auch bereits einen Overhead.
Die Instruktionen sind zwar auch entscheidend für die Geschwindigkeit, viel interessanter ist aber die Struktur des Shaders als wieviele Parallel ausgeführt werden können.
Ist es nicht wahrscheinlicher, dass er am Bandbreitenlimit ist? Gerade bei mobilen Karten?

Ist denn Alpha-Blending deaktiviert? Das verdoppelt locker die Bandbreite.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Rendergeschwindigkeit optimieren

Beitrag von Matthias Gubisch »

Krishty hat geschrieben:
Matthias Gubisch hat geschrieben:Das Laden und Starten des Shaders hat ja auch bereits einen Overhead.
Die Instruktionen sind zwar auch entscheidend für die Geschwindigkeit, viel interessanter ist aber die Struktur des Shaders als wieviele Parallel ausgeführt werden können.
Ist es nicht wahrscheinlicher, dass er am Bandbreitenlimit ist? Gerade bei mobilen Karten?

Ist denn Alpha-Blending deaktiviert? Das verdoppelt locker die Bandbreite.
Klar, ich wollte eigentlich nur daruf Hinweisen dass der Shader wohl nicht die Ursache dafür ist dass sich an den FPS nix ändert egal wie lang er ist. Die Bandbreite könnte eine Ursache sein. Wie du bereits schreibst sogar die die am Wahrscheinlichsten ist und damit zuerst mal angesehen werden sollte.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Bandbreite könnte ich mir auch vorstellen, allerdings macht es keinen Unterschied, ob ich in einen kleineren Ausschnitt rendere... oder macht das keinen Unterschied, wenn das RT nicht kleiner wird?

AlphaBlending, Alphatesting und ZBuffer ist deaktiviert, nur Stencil ist an...

EDIT: Ich werde die "Auflösungen" dann mal rausschmeißen, ist eigentlich eh quatsch gewesen, weil es ja keinen echten Fullscreen gibt. Werde dann stattdessen einbauen, dass man z.B. auch in halber Auflösung rendern kann. Dabei aber dann auch die Textur neu initialisieren, so dass dann statt auf einen Ausschnitt der Textur zu rendern, immer die ganze Textur genutzt wird. Das sollte ja beim Deferred Rendering die Bandbreite reduzieren.
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Tiles »

Stencil
Ist Stencil Shadow nicht eine der uneffektivsten und ressourcenhungrigsten Schattenmethoden überhaupt?
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Tiles hat geschrieben:
Stencil
Ist Stencil Shadow nicht eine der uneffektivsten und ressourcenhungrigsten Schattenmethoden überhaupt?
Wer hat denn was von Stencil Shadow geschrieben? :shock:
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Tiles »

Mein Fehler. War wohl ein Freudscher Verleser. Rühren, weitermachen ^^
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Hab nun drin, dass man die Auflösung runterregeln kann. Und ich würde sagen, dass bringt auf dem Laptop doch schon einiges.
Jetzt machen dort auf LOW aber Hauptsächlich noch die Objekte mucken... aber ich vermute mal, dass es an dem erwähnten und überdimensionierten Vertexformat liegt.
TDK
Beiträge: 54
Registriert: 06.04.2012, 11:15

Re: Rendergeschwindigkeit optimieren

Beitrag von TDK »

Du benutzt Direct3D 9.x, richtig? Würde ich schon als Flaschenhals #1 bezeichnen.

Du setzt viel zu viele Konstanten. Ein Constant Buffer für ein Material je Objekt und nur Änderungen vornehmen, wenn es sein muss. Pro Material ein Constant Buffer setzen, fertig.
Die Anzahl der Draw Calls ist zu hoch, zumindest im 500er-Bereich. 1000 Draw Calls waren in Direct3D 9 schon eine arge Last, wenn ich mich recht entsinne. Benutzt du Instancing?
Intel GPUs haben meiner Erfahrung nach schon immer Probleme mit Verfahren, die in ein anderes Render Target als das des Back Buffers schreibt.
Eine Intel HD 3000 ist nicht wirklich das Wahre. Insofern ist die Leistung eigentlich in Ordnung mit etwa 15-25FPS. Selbst meine HD5670 war damals ständig am Limit.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Genau, Direct3D 9... ich hoffe, bald mal auf OpenGL zu kommen. :D

Instancing benutze ich nicht.
Was die Anzahl der Konstanten angeht, so gehen eigentlich die meisten für das setzen der Modelmatrix für jedes Objekt drauf.
Dabei setze ich 5 VS und 1 PS Konstante pro Objekt. Meinst du wirklich, dass das zu viel ist?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Schrompf »

Nicht überbewerten. Die Splitterwelten haben auch mit DX9 und nur ganz zartem Parallelisieren um die 5000 DrawCalls bei 30fps rausgehauen. Ich würde ja mal NVidia NSight oder sowas runterladen und profilen, an wem es überhaupt liegt. Auf ner Intel HD 3000 hatte auch Splatter nur 40fps, also würde ich jede Art von CPU-Optimierung erstmal liegen lassen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Könnte es etwas bringen, wenn man die Vertexattribute darauf hin optimiert, dass beim Shadowmaprendering Objekte ohne Normalen/Tangenten benutzt werden? Also dass man die Objekte einmal mit vollen Vertexattributen und einmal für Shadowmaps optimiert erzeugt?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Schrompf »

Bei Deinen Millionen Polys könnte das was bringen, aber nur, wenn das Vertexformat im Buffer dadurch auch kleiner wird. Wenn Du einfach nur vermeidest, die unnötigen Vertex-Attribute anzumelden, macht das genau Null Unterschied.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Theoretisch erlaubt Direct3D den Treibern, Vertex-Information von Array of Structure zu Structure of Array zu transponieren, damit ungenutzte Attribute auch nicht die Caches verschmutzen.

Theoretisch sollten vor allem mobile Treiber clever genug sein, das auch zu tun.

Praktisch bleibt dir nur Ausprobieren. Hast du jetzt einen Profiler installiert?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Nein, meine damaligen Versuche, Profiler zu Integrieren haben nicht geklappt... irgendwann lief das PerfHUD auch einfach nicht mehr... also das hat eh immer rumgezickt, aber irgendwann hat es gar nicht mehr funktioniert.

@Schrompf
Ja, das einfacher vermeiden, anzumelden ist ja so schon drin... aber ich glaube auch, dass das nichts bringt. Deswegen meine ich ja, nochmal komplett ein eigenen Bufferabschnitt dafür anlegen.

@Krishty
Oder vielleicht mit verschiedenen Vertexstreams, wo man dann einfach die ungenutzten Arrays abstellt. Aber ich habe noch nie mit mehrere Vertexstreams gearbeitet (mal abgesehen vom Instanzing)
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

peak.jpg
Zwei Peaks habe ich jetzt schon mal genauer Untersucht. Ich verwende eine Shadowmap, 2048x2048, 16 Bit mit 4 Kanäle... auf diese wird hinterher eine Dilation angewendet. Der Shader ist nicht sehr aufwendig. Den Peak, den ich hier im Screen nochmal auf das Original zurückgebaut habe, lässt sich zumindest auf die Höhe der anderen höchsten Peaks reduzieren. Das Problem hier war, dass ich Automatisches generieren von MipMaps für dieses RenderTarget aktiviert hatte.

Peak 2 ist mir auch klar, allerdings weiß ich da so schnell keine Lösung. Auch hier ist die Shadowmap betroffen. 3 Kanäle nutze ich für 3 verschiedene Maps. Da nicht immer alle aktualisiert werden und ich dafür hohe Werte als Vorinitialisierung brauche, hatte ich das über einen Shader gelöst. Das Clearen einzelner Kanäle findet dann über das Colorwriting statt. Setze ich das Colorwriting nicht, 230 auf 180 µs.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Zudomon hat geschrieben:Peak 2 ist mir auch klar, allerdings weiß ich da so schnell keine Lösung. Auch hier ist die Shadowmap betroffen. 3 Kanäle nutze ich für 3 verschiedene Maps. Da nicht immer alle aktualisiert werden und ich dafür hohe Werte als Vorinitialisierung brauche, hatte ich das über einen Shader gelöst. Das Clearen einzelner Kanäle findet dann über das Colorwriting statt. Setze ich das Colorwriting nicht, 230 auf 180 µs.
Ins Blaue geraten: Colorwrite kostet, weil dann die vorherigen Werte aus dem VRAM gelesen, mit den neuen Werten verschmolzen, und zurückgeschrieben werden müssen. Ohne Colorwriting kann wahrscheinlich via Burst Write geschrieben werden (oder im Fall von Clearing, asynchrones memfill). Wäre es eine Option, das auf drei Kanäle zu verteilen?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Schrompf »

Und beim Lesen einer solchen ShadowMap in einem Kanal einer mehrfach benutzten Textur verschwendest Du auch noch ordentlich Speicherbandbreite. Obwohl das nicht so tragisch ist, weil die Texture Caches da ne Menge abfangen. Kannst Du das evtl. auf drei Texturen mit je einem Kanal aufspalten? Sind ja wahrscheinlich eh float32-Texturen oder sowas, von denen es auch Ein-Kanal-Varianten gibt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Krishty hat geschrieben:
Zudomon hat geschrieben:Peak 2 ist mir auch klar, allerdings weiß ich da so schnell keine Lösung. Auch hier ist die Shadowmap betroffen. 3 Kanäle nutze ich für 3 verschiedene Maps. Da nicht immer alle aktualisiert werden und ich dafür hohe Werte als Vorinitialisierung brauche, hatte ich das über einen Shader gelöst. Das Clearen einzelner Kanäle findet dann über das Colorwriting statt. Setze ich das Colorwriting nicht, 230 auf 180 µs.
Ins Blaue geraten: Colorwrite kostet, weil dann die vorherigen Werte aus dem VRAM gelesen, mit den neuen Werten verschmolzen, und zurückgeschrieben werden müssen. Ohne Colorwriting kann wahrscheinlich via Burst Write geschrieben werden (oder im Fall von Clearing, asynchrones memfill). Wäre es eine Option, das auf drei Kanäle zu verteilen?
So hab ich mir das auch schon gedacht. Ja ich bin echt am überlegen, dass zu splitten... und vielleicht dann sogar einfach 8 Bit und dafür jeweils zwei Kanäle zu nutzen.
Nachteil ist, dass ich die Dilation auf alle Kanäle gleichzeitig anwenden kann.
Vorteil wäre, dass die dritte Shadowmap ruhig in niedrigerer Auflösung rendern könnte.
Die erste Shadowmap wird jeden Frame geupdated, ist die Nahe. Die zweite, die Entfernte und die dritte, eine Art AO Map, wird immer abwechselnd berechnet. Da ist auch die Frage, wie sinnvoll das ganze letztendlich ist, da die AO Map nur ganz wenige Objekte hat, habe ich dann jeden zweiten Frame einige Drawcalls mehr.
Schrompf hat geschrieben:Und beim Lesen einer solchen ShadowMap in einem Kanal einer mehrfach benutzten Textur verschwendest Du auch noch ordentlich Speicherbandbreite. Obwohl das nicht so tragisch ist, weil die Texture Caches da ne Menge abfangen. Kannst Du das evtl. auf drei Texturen mit je einem Kanal aufspalten? Sind ja wahrscheinlich eh float32-Texturen oder sowas, von denen es auch Ein-Kanal-Varianten gibt.
Also es wird von allen drei Texturen im Deferred Pass gelesen. Momentan ist da der Alpha Kanal verschwendet. Float16 sind das.


Ich habe jetzt übrigens auch am Laptop testen können. Auf Low, also ohne Schatten. Also am Ende der Deferred Pass, Tonemap und Final Pass ( wo das TAA verbaut ist ) sind, hauen da ganz schön rein. Außerdem das HUD, was ich seit ein paar Tagen extra rendere und dann nochmal drüber haue. Gerade letzteres hat nur wenige PS-Instruktion. Ich denke mal, dass da schlicht das Bearbeiten der Pixel so viel ausmacht und gar nicht mal die Anzahl der Shaderinstruktions (zumal auf LOW ja die Auflösung reduziert ist). Also wird es sicher was bringen, wenn ich da mal versuche, die ganzen Schritte irgendwie in weniger Fullscreenpasses unter zu bringen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Zudomon hat geschrieben:Außerdem das HUD, was ich seit ein paar Tagen extra rendere und dann nochmal drüber haue. Gerade letzteres hat nur wenige PS-Instruktion. Ich denke mal, dass da schlicht das Bearbeiten der Pixel so viel ausmacht und gar nicht mal die Anzahl der Shaderinstruktions (zumal auf LOW ja die Auflösung reduziert ist). Also wird es sicher was bringen, wenn ich da mal versuche, die ganzen Schritte irgendwie in weniger Fullscreenpasses unter zu bringen.
Das ist eine Vermutung, und prüfen würdest du sie jetzt, indem du den tatsächlichen Bandbreitenbedarf misst (gibt's Pixels Retired oder so?) und mit der theoretischen Höchstleistung der GPU vergleichst.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Krishty hat geschrieben:(gibt's Pixels Retired oder so?)
Ich glaube nicht.
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
Aber jetzt extra noch mehr messen, ne, da überlege ich mir nun lieber, wie ich das jetzt so noch reduzieren kann. Das Problem ist halt immer, dass ich auch nicht so viel Plan von den ganzen Dingen habe, aber auch keine Lust habe, mich da rein zu wühlen... ;)
Aber wenigstens geht die Analyse heutzutage bei mir ja schon über das messen der FPS hinaus :lol:
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

D3DDEVINFO_D3D9BANDWIDTHTIMINGS structure

FillRateUtilizedPercent
Type: FLOAT
Pixel fill throughput percentage. This is the number of pixels that are filled compared to the theoretical pixel fill.
... und los
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Krishty hat geschrieben:
D3DDEVINFO_D3D9BANDWIDTHTIMINGS structure

FillRateUtilizedPercent
Type: FLOAT
Pixel fill throughput percentage. This is the number of pixels that are filled compared to the theoretical pixel fill.
... und los
Zu zwingst mich ja richtig zur Arbeit... :lol: vielleicht mache ich das nachher wirklich noch...

Habe gerade noch gemerkt, dass es nicht reicht, auf das "umschließende" TimestampDisjoint zu warten, sondern auch auf JEDEN Timestamp. Mit einmal ist vor allem der spätere Bereich des Frames stabil... dadurch ergibt sich, dass vor allem auch das Anwenden der Shadowmap mit dem PCSS ziemlich viel Rechenzeit brauchen... an dem Erstellen des Schattens habe ich noch nichts geändert. Das Framediagramm sieht nun so aus...
20161220_2.jpg
Antworten