3D-Modelle zeichnen - beschleunigen



  • Ich hab folgenden Source zum Zeichnen eines 3D-Modells:

    void DrawMesh(Mesh)
    {
      for (unsigned int i = 0; i < Mesh->MaterialCount; i++)
      {
        D3DDevice->SetMaterial(&Mesh->MeshMaterials[i]);
        D3DDevice->SetTexture(0, Mesh->MeshTextures[i]);
        Mesh->Mesh->DrawSubset(i);
      }
    }
    

    Wenn mich nicht alles täuscht, wird ja immer das Matieral gesetzt, ebenso die Textur, auch wenn sie auf den selben wert gesetzt wird.
    Deshalb könnte man ja mit einer Abfrage machen, ob das Material das selbe ist.
    Leider hab ich keinen Tau wie ich das anstellen soll (bei D3DDevice->GetMaterial(...) versteh ich nicht ganz wie das gehn soll)



  • wenn du das ganze innerhalb einer klasse verwenden würdest, könntest du alle stats in den private bereich packen 🙄



  • Echt schwierig, wie könnte man nur rauskriegen, ob zwei Sachen gleich sind?! Geht das überhaupt?

    Und ob es so wirklich schneller wird, ist noch 'ne ganz andere Frage.

    Bye, TGGC \-/



  • tggc,es ist etwas schneller,natürlich nur unter der vorraussetzung, dass man die engine dahingehend optimiert, dass die passes einer technique so angeordnet sind, dass nur wenig verändert werden muss.Im ungünstigsten fall kommt sonst raus, dass alle if abfragen false zurückgeben, und somit nochmals alle stats gesetzt werden müssen,dh man verbraucht schon etliche ticks zeit, nur für die if abfragen, und was bringts? nichts^^

    in dem punkt kann man dann nur sagen: "mit der geschwindigkeitsoptimierung verhält es sich genauso wie mit dem komprimieren von dateien,wenn man im einen fall verkürzen kann, verlängert man im anderen Fall, die Kunst dabei ist, das ganze so anzuordnen, dass die ungünstigen Fälle wieder günstig werden"


  • Mod

    Wenn man das gut anstellt, kann man ca 10% mehr Performance erreichen (mit sortierten materialien gegenüber unsortierten)

    Am teuersten ist das wechseln eines shaders, dann kommt ein Texturwechsel und dann der erste render-/texture-/samplestate wechsel.

    Die einfachste optimierung ist, wenn man sich eine "Bibliothek" von materialien anlegt, solche materialien werden dann oft wiederverwendet.
    Dann kann man in einer Scene alle objekte bzw Meshes abhängig vom Material rendern. Das ist in diesem Fall sogar ziemlich einfach, denn du hast ja einen pointer auf den Dx-effect, es reicht dann wenn du davon abhängig sortierst. Der zweck der sortierung ist nur, dass objekte mit gleichen material hintereinander gezeichnet werden, die reihenfolge ist dabei nicht sonderlich wichtig (deswegen muss man nicht ne extra ID oder sowas in die materialien eintragen fürs sortieren)

    rapso->greets();


Anmelden zum Antworten