Optimieren der Vertexbuffer



  • rapso schrieb:

    Azrael, il Meraz schrieb:

    Wie optimiert man Sortiertechnisch einen Vertex und Indexbuffer am besten?...
    Wie kriegt man die beste performance?

    so 😉

    btw. nicht noetig zu jeder frage einen neuen thread zu starten 😉

    Ich komm damit jetzt mal garnicht klar. Ist das normal? 🙂 In der Readme steht was von einem Beispiel, welches ich aber nicht finden kann

    See the StripTest source code (in function LoadXFileStripped) for an example of using the library.

    Vllt brauch ich ja ne Brille. Ich seh da kein StripTest source code und danach suchen klappt auch nicht so wirklich 😞

    [edit] grrr - da will man sich bei Irrlicht was abgucken und entdeckt, dass irrlicht Vertexbuffer garnicht verwendet argh xD



  • hustbaer schrieb:

    Im Prinzip ist mir viel von dem was du da schreibst nicht neu.
    Ich wollte aber bloss ne Zahl wissen. Ein Maximum anzugeben ist wahrscheinlich nicht möglich, aber vielleicht hat jmd. schon einen Fall gehabt wo er einen grossen Unterschied gesehen hat der nur durch "umordnen" der Index-Buffer entstanden ist. Dann könnte er/sie/es schreiben "Faktor 2.7 hab ich selbst schon gesehen" - oder sowas 🙂

    Also die paar Mal, dass ich das explizit gesehen habe, weil ich ein Model erst ohne Re-indexing importiert habe, und dann mit, hats immer einen merkbaren Boost gegeben. Ich schätze so 1.5x FPS. Wobei, wie schon ausführlich dargelegt, es natürlich immer darauf ankommt, was der limitierende Faktor ist.

    @nvtristrip: Hat sich da so viel geändert? Wie ich das seinerzeit benutzt habe, waren das einfach eine handvoll Methoden, die zum Glück ziemlich selbsterklärend waren. Ich glaub "GenerateStrips" heißt die Methode, der man ein Array an Indices füttert und dann eine Liste an Arrays an umgeordneten Indices zurückbekommt (man bekommt deshalb mehrere Arrays zurück, weil das Model eventuell in mehrere Strips zerlegt wird, die nicht miteinander verbunden sind. Gibt auch eine Methode dafür, dass alle Strips in 1 Array zusammengestitcht werden sollen).



  • Ich wollte aber bloss ne Zahl wissen

    Du musst hier bedenken, dass ein 3D-Modell ja auch irgendwie "entstanden" ist und die Polygone dementsprechend nicht in voellig zufaelliger Reihenfolge auf dem Objekt liegen - man wird also aeussert selten den Worst-Case sehen.
    Bei meinen Versuchen mit hochtesselierten Objekten lag die Cache-Miss-Rate im unoptimierten Zustand durchschnittlich knapp ueber 1 Vertex/Triangle.



  • Hab mal ein paar Artikel zur Optimierung gelesen und bastel mir hier eine Optimierungsfunktion zurecht. (Ja, ich bin mir sicher, dass ich das selber programmieren will :P) jetzt hab ich eindeutig ein Fehler gemacht (Geometrie leicht zerschrottet und die Optimierung stimmt nu auch nicht wirklich, für diese Frage aber irrelevant^^). Ich habe aber immer noch dieselben vertices und indices. Hab einen framedrop von ca 200 fps auf 30 fps. Irgendwie finde ich den framedrop etwas seltsam. Liegt er nur an cache misses?



  • Hab einen framedrop von ca 200 fps auf 30 fps. Liegt er nur an cache misses?

    Nein.



  • So leutz. Ich hab diesen Algorithmus hier implementiert : http://www.cs.princeton.edu/gfx/pubs/Sander_2007_>TR/tipsy.pdf
    Ich bekomme bei meinem ca. 5000 dreiecken im Model einen performanceverlust von 20%. Ich vermute mal einfach, dass Blender3D (Daher hab ich das Model mit gleichen Indices exportiert) einen internen Superoptimierer hat :D...

    Und sorry für die leicht ehm... überflüssige frage.



  • Ich vermute mal einfach, dass Blender3D einen internen Superoptimierer hat

    Und ich vermute mal einfach, dass Du einen Fehler gemacht hast.
    Schmeiss Deinen Indexbuffer mal in einen simulierten Vertex-Cache (zb hier) und poste mal das Verhaeltnis zwischen hit und miss (VCache::add liefert true/false).



  • vor dem optimieralgorithmus:

    misses: 6008
    hits: 9628
    hits per miss: 1.60253

    nach dem optimieralgorithmus (vcache_size = 16)

    misses: 4232
    hits: 11404
    hits per miss: 2.69471

    ok, ehm. was muss man noch beachten? "^^


  • Mod

    mach den test nochmal mit vcache_size = 24 bitte 🙂



  • vorher:
    misses: 5523
    hits: 10113
    hits per miss: 1.83107

    nachher:
    misses: 3982
    hits: 11654
    hits per miss: 2.92667

    Wieso ist optimierte geometrie bei OpenGL langsamer und bei DirectX schneller?

    fps vorher/nachher:
    openGL: 310/292

    Direct3D: 350/388



  • misses: 6008
    hits: 9628

    Bei 6008+9628 Indizes (5212 Triangles, vermutlich weniger als 3000 Vertices) bist Du nicht Vertexdurchsatz-limitiert.



  • Ok, anderes Mesh:

    vorher:
    misses: 45965
    hits: 168307
    hits per miss: 3.66163

    nachher:

    misses: 47227
    hits: 167045
    hits per miss: 3.53707

    mit vcache_size = 16 krieg ich folgendes ergebnis:

    vorher:
    misses: 54442
    hits: 159830
    hits per miss: 2.935784872

    misses: 49434
    hits: 164838
    hits per miss: 3.33451

    Mein Mesh ist eine einfache Kugel. ich denke mal, hier wurden die indices schon bei der erschaffung in einer güngstige reihenfolge gewählt.

    Jetzt noch ne frage zu DirectX/OpenGL

    Ich habe bei OpenGL eine framerate von ca. 115 fps.
    bei DirectX habe ich eine zeit lang auch etwa 120 fps. nach einigen sekunden springen die fps aber plötzlich auf 180-200. Was passiert hier?


  • Mod

    falls du shader benutzt, kann es sein dass der treiber fertig wurde den zu optimieren und dann ersaetzt er den provisorischen eventuell mit dem 'optimalen'

    es kann aber auch an 100 anderen dingen liegen 😉



  • noch fahr ich ohne shader.

    Man kann mich ruhig auf 100 andere dinge verweisen wenns unnötig ist sie aufzuzählen. Bin neugierig


Anmelden zum Antworten