Rendergeschwindigkeit optimieren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
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
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

Ich habe auf dem Laptop mit der "Intel HD Graphics 3000" beim testen auf Low festgestellt, dass die Baumstämme der kleinen Bäume etwa 1/6 der Rechenzeit brauchen, wie die Pilze. Und ich finde den Grund dafür nicht.

Hier die beiden Diagramme:
20170122_1.jpg
20170122_2.jpg
Bei beiden ist die Dreieckszahl etwa gleich... selbst wenn ich nur 512 Dreiecke von beiden zeichnen lasse, habe ich diese Zeitdifferenz, allerdings proportional. Das Inputlayout ist das gleiche, die Shader ebenso. Wenn ich mich nicht vertue, dann ist der einzige Unterschied wirklich die Form. Wenn ich kurz vorm Rendern das Mushroom Modell durch den Baumstamm tausche, habe ich keine Geschwindigkeitsdifferenz. Man sieht auch im Diagramm die davor und dahinterliegenden Calls sind alle gleich schnell.
Das einzige, was mir nun noch einfällt, dass vielleicht die Vertexanordnung bei dem Baumstamm besser ist und der dort besser auf den VertexCache zugreifen kann. Aber ist der Geschwindigkeitsvorteil so groß?! Oder übersehe ich noch etwas? Der Overdraw kann es auch schlecht sein, da die Objekte ja in verschiedenen größen auf dem Bildschirm landen, trotzdem alle die gleiche Renderzeit brauchen. Außerdem deckt der Pilz prinzipiell eine kleine Fläche ab.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von dot »

Beide Modelle scheinen mir aufgrund winziger Dreiecke auf die Entfernung extrem ineffizient zu rendern (aufgrund der Art und Weise wie die GPU rendert – Stichwort Quad Shading – sind Dreiecke kleiner als 2×2 Pixel extrem suboptimal). Auf wie viele Pixel pro Dreieck kommst du denn beim Baum vs beim Pilz? Die Lösung heißt vermutlich LoD, würde vermutlich auch dem Aliasing gut tun, das man da so sieht...

Btw: Verwendest du wirklich für jeden einzelnen Pilz einen separaten Drawcall?
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

dot hat geschrieben:Btw: Verwendest du wirklich für jeden einzelnen Pilz einen separaten Drawcall?
Ja, momentan werden alle Weltobjekte per seperatem Call gerendert... das wird aber nicht so bleiben.

Was die 2x2 Quads angeht, dachte ich auch schon dran. Allerdings sollten ja die langen dünnen Dreiecke des Baumstamms da schlechter abschneiden. Auch glaube ich nicht, dass das da eine Rolle stellt, weil jeder Drawcall der Objekte ja gleich lange braucht, egal wie groß das Objekt am Ende auf dem Bildschirm ist.
Ich habe nun mal die Model Matrix für die Baumstämme und Pilze auf Identiy gesetzt, die werden also nicht gecullt, landen aber auch nicht mehr auf dem Bildschirm. Drawcall Rendergeschwindigkeit ist dabei gleich geblieben. Ich denke, damit kann man diverse Füllratendinge ausschließen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Interessant!

Hast du die Messung bestätigt, indem du die Pilze abschaltest, und dann tatsächlich so viel mehr fps hast, wie deine Messungen vermuten lassen? Das gleiche für Baumstämme?
Hast du mal die Vertex & Index Buffers der beiden vertauscht?
Die Reihenfolge vertauscht, so dass erst die Pilze gezeichnet werden, dann die Bäume?
Die Pilze auf 1×10×1 m hochskaliert (damit die Form ähnlich der Bäume ist)?
Setzt du auch die States vor jedem Pilz, und dabei vielleicht andere als für die Bäume?
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 »

So viele Fragen :D
Krishty hat geschrieben:Hast du die Messung bestätigt, indem du die Pilze abschaltest, und dann tatsächlich so viel mehr fps hast, wie deine Messungen vermuten lassen? Das gleiche für Baumstämme?
Muss ich noch testen... im Moment ist der Laptop in beschlag. ;)
Krishty hat geschrieben:Hast du mal die Vertex & Index Buffers der beiden vertauscht?
Die Reihenfolge vertauscht, so dass erst die Pilze gezeichnet werden, dann die Bäume?
Die Pilze auf 1×10×1 m hochskaliert (damit die Form ähnlich der Bäume ist)?
Was ich jetzt mal probiert haben, wenn Baumstamm gerendert werden soll, Pilz zu rendern, und umgekehrt. Die Model Matrix bleibt. Dadurch wird auch die Reihenfolge geändert. Das Ergebnis:
20170122_3.jpg
20170122_4.jpg
Die Rendergeschwindigkeit ist fast genauso, wie vorher. Ich schiebe die etwas längere Zeichendauer mal direkt auf die Pilzgröße wegen der Pixelfüllrate.
Krishty hat geschrieben:Setzt du auch die States vor jedem Pilz, und dabei vielleicht andere als für die Bäume?
Es werden redundatente States gefiltert, bevor sie nach DX geschickt werden. Also zwischen den Drawcalls werden faktisch nur die Shaderkonstanten gesetzt, die auf den Bildern zu sehen sind, CF_... CM... usw.
Da nach Texturen/Shader sortiert ist, werden ansonsten keine States geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Spannend; es scheint also echt am Pilzmodell zu liegen …

Kannst du das Modell mal exportieren und verifizieren, dass alle Indizes gültig sind? Bei mir auf Nvidia bricht die Frame-Rate bei einigen Sonderfällen ein, z.B. bei Draw Calls mit 0 Dreiecken oder bei beschädigten Indizes [ohne Meldungen der Debug Runtime, wohlgemerkt] …
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:Draw Calls mit 0 Dreiecken
Du meinst damit, wenn der Flächeninhalt 0 ist, oder?

Also da muss ich nachher mal genaue Checks einbauen.
Aber da eine Linie rund extruded wird für die Pilzform, und diese an den Enden Dreiecke, statt Vierecke erzeugt, kann ich schon mal vorweg nehmen, dass demnach sowohl 0 Dreiecke und doppelte Indizies vorhanden sein könnten.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Nein, ich meine Draw Calls mit Null Dreiecken. Leere Draw Calls. Die lösen hier um die 10 ms Lag aus. Man testet halt selten, was passiert, wenn ein User eine leere Datei importiert ;)

Geht eben darum, dass Treiber langsame Sonderfälle haben; ich will ausschließen, dass wir es hier mit sowas zu tun haben. Die unterscheiden sich unter den Herstellern und Treiberversionen, darum muss man da ein Bisschen im Dunkeln stochern. Vertex- und Index Buffers verifizieren ist aber immer ein guter Anfang.

Sind die Shader für Pilze und Baumstämme unterschiedlich? Vielleicht limitiert dieses Mal tatsächlich die Rechenleistung …
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:Sind die Shader für Pilze und Baumstämme unterschiedlich?
Gleiche Shader. Sind wirklich nur die VB und IB Daten anders. Leere Drawcalls hab ich nicht. Zumal ja auch etliche Baumstamm und Pilzmodelle gerendert werden und alle jedesmal die gleiche Zeit brauchen.
Ich weiß nicht, ob ich heute noch zu den Checks komme. Also die Checks Dreiecke mit mit 0 Ausdehnung zu filtern und Indexlisten entsprechend zu bereinigen. Momentan sehe ich da momentan am ehesten die Chance, also dass es daran liegt.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Dreiecke mit Nullausdehnung sollten keine Probleme machen (außer, dass sie ein Bisschen Leistung verschwenden, aber nicht in dem Maße).

Gleiches für Dreiecke mit zwei identischen Indizes, denn die setzt man ständig ein um Triangle Strips zu schneiden. (Obwohl es da seit D3D 10 bessere Wege gibt.)

Aber ungültige Indizes oder NaN/INF in Vertices könnten schon Probleme verursachen. Gerade auf Intel-Karten würde ich mal Denormalized/NAN/INF prüfen.
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:Aber ungültige Indizes oder NaN/INF in Vertices könnten schon Probleme verursachen. Gerade auf Intel-Karten würde ich mal Denormalized/NAN/INF prüfen.
Ich weiß gar nicht, wie man das vernünftig überprüfen kann :(
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:
Krishty hat geschrieben:Aber ungültige Indizes oder NaN/INF in Vertices könnten schon Probleme verursachen. Gerade auf Intel-Karten würde ich mal Denormalized/NAN/INF prüfen.
Ich weiß gar nicht, wie man das vernünftig überprüfen kann :(
  bool isFine(float x) {
    auto absX = abs(x);
    return 1.17549e-38f < absX && absX <= 3.4028234e38f;
  }


Alle NaN-Vergleiche ergeben false, also ergibt der Ausdruck ebenfalls false, falls eine NaN reinrutscht. Delphi müsste sich ebenfalls an IEEE 754 halten, und ihr abs() müsste für NaNs ebenfalls NaN zurückgeben, also brauchst du es nur übersetzen.
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 »

Hab nun erstmal die Dreiecke mit 0 Ausdehnung gefiltert. Ein paar Dreiecke konnten dadurch eingespart werden, was sich proportional auf die Geschwindigkeit ausgewirkt hat. Allerdings bleibt es bei den Pilzen immer noch entsprechend langsamer.

Als nächstes erstmal deine Funktion übersetzt und über den VB drüber gejagt. Hab das dann noch etwas umgeschrieben. Delphi bietet eine Funktion um auf nan zu testen. Außerdem hab ich eingebaut, dass kleine Werte auf 0 gesnappt werden:

Code: Alles auswählen

function MakeCorrect(_x: Single): Single;
begin
  Result:=_x;
  if IsNaN(Result) then Result:=0;
  if (Result>-0.00001) and (Result<0.00001) then Result:=0;
end;
Letztendlich hat das aber auch nichts gebracht.

Nun bleibt mir vorerst nur noch die Indizeprüfung. Das mach ich aber erst morgen...

EDIT:
Krishty hat geschrieben:Aber ungültige Indizes
Damit meinst du doch, dass die Indizes nicht den VB überschreiten oder < 0 sind. Wenn ja, das kommt auch nicht vor.

EDIT2:
Was mir jetzt noch einfällt, ich schau mir morgen noch den VS an... vielleicht erzeugen ja die übergebenen Vertex-Werte dort ein NaN. Es scheint ja definitiv mit der Dreiecksanzahl zu skalieren.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Zudomon »

So, nun hab ich es nochmal mit einem simplen Vertex- und PixelShader probiert... und siehe da :D ... immer noch ist das Pilz Modell um etwa das 5 fache langsamer! :(
Also jedes Objekt hat seinen eigenen VB und IB. Und da sollten die IB's als Word drin stehen, solange es von der Dreiecksanzahl möglich ist.
Ich meine, gut, wenn ich das Problem nicht finden kann, dann ist es nun mal so... hab eh gesehen, dass das LOD Objekt für die Pilze auch ohne Subdivide auskäme und schon wären die Dreiecke statt momentan noch 1700 auf 70 runter... damit wäre das Problem indirekt dann eh gelöst. Aber es reizt mich schon ein wenig die Neugierde, was da wirklich anders läuft. Vielleicht muss ich mich mal ein bisschen mit Try&Error da durch wurschteln. Im Extremfall könnte man ja wirklich mal Mushroom und Baumstamm generieren und dann tatsächlich einfach die anderen Positionen übernehmen. An irgendwas muss das ja liegen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rendergeschwindigkeit optimieren

Beitrag von Krishty »

Gemäß deines Beitrags gestern um 18:55 kann es jedenfalls kein Zufall sein. Mich interessiert durchaus, was da schiefgeht – aber konkrete Vorschläge zum Debugging habe ich auch nicht mehr …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten