Eigene Direct3D-State Verwaltung Sinnvoll?



  • rapso schrieb:

    genau, wie ich oben als beispiel gab z.b.

    Render(Alphablend,VBuffer,IBuffer);
    

    Alphablend ist bei mir entsprechend ein enum von moeglichen zeichenarten.
    so ist das sortieren spaeter auch einfacher, weil du nicht 100 verschiedene states anordnen musst, sondern nur die paar flags.
    aber selbst ohne sortieren hast du schon recht viel gewinn, normalerweise.

    Kannst du das evtl noch etwas genauer ausführen mit nem Beispiel? Bei den vielen States die es in DX gibt kann ich mir so eine Anordnung irgendwie gerade garnicht bildlich vorstellen.


  • Mod

    Xebov schrieb:

    rapso schrieb:

    genau, wie ich oben als beispiel gab z.b.

    Render(Alphablend,VBuffer,IBuffer);
    

    Alphablend ist bei mir entsprechend ein enum von moeglichen zeichenarten.
    so ist das sortieren spaeter auch einfacher, weil du nicht 100 verschiedene states anordnen musst, sondern nur die paar flags.
    aber selbst ohne sortieren hast du schon recht viel gewinn, normalerweise.

    Kannst du das evtl noch etwas genauer ausführen mit nem Beispiel? Bei den vielen States die es in DX gibt kann ich mir so eine Anordnung irgendwie gerade garnicht bildlich vorstellen.

    was genau kannst du dir nicht vorstellen? ich setze einfach alle noetigen state fuer diese art von drawcall, nichts besonderes.



  • Wie das bei dir im inneren Funktioniert. Du hast ein Flag das du setzt und in der Funktion wird das Flag dann zerlegt und die States gesetzt? Deinen Prüfmechanismuß kann ich nicht nachvollziehen. Wenn ich ein Array habe ist das ja klar, das Array ist ein Spiegelbild der states, ich setze ihn und wenne r schon gesetzt ist geht es unter, das wäre ein State, ein Call, aber wie genau Funktioniert das bei dir? Ich steig da nicht durch.


  • Mod

    Xebov schrieb:

    Wie das bei dir im inneren Funktioniert. Du hast ein Flag das du setzt und in der Funktion wird das Flag dann zerlegt und die States gesetzt? Deinen Prüfmechanismuß kann ich nicht nachvollziehen.

    mein pruefmechanismus:

    if(DrawCallType==Alphablend && ...
    

    Wenn ich ein Array habe ist das ja klar, das Array ist ein Spiegelbild der states, ich setze ihn und wenne r schon gesetzt ist geht es unter, das wäre ein State, ein Call, aber wie genau Funktioniert das bei dir? Ich steig da nicht durch.

    ... DrawCallType!=LastDrawCallType)
     //states setzen
    

    ich weiss nicht was ich dazu noch schreiben sollte 😕 .



  • OK, ich versuchs mal etwas ausführlicher auszudrücken. DX hat ja insgesammt über 100 States. Mir fehlt hier gerade ein Ansatz wie du die geordnet hast um sie als Flag Nutzbar zu machen (was ja auf einem unsigned int gerademal 32 wären). Deine Prüfengine verstehe ich auch nur zum Teil, ich schätze mal du speicherst die beim letzten Aufruf übergebenen Flags und schaust ob dieses Packet vorher schon durch ist und man sich das setzen sparen kann (dh du gehst nicht nach einzellnen Statts vor?).


  • Mod

    Xebov schrieb:

    Mir fehlt hier gerade ein Ansatz wie du die geordnet hast um sie als Flag Nutzbar zu machen (was ja auf einem unsigned int gerademal 32 wären).

    ich verstehe dein problem nicht, mein mit alphablend gerendertes objekt setz alle alphablend states. was soll ich da noch fuer flags nutzbar machen?

    Deine Prüfengine verstehe ich auch nur zum Teil,

    jetzt ist der pruefmechanismus zu einer pruefengine aufgestiegen? bin schon gespannt, ob du mich gleich weiter ueber mein geo-orbitales-kaskadiertes-state-caching mit pay-back functionality fragst 😉
    es ist nur eine if-abfrage wie du siehst.

    ich schätze mal du speicherst die beim letzten Aufruf übergebenen Flags und schaust ob dieses Packet vorher schon durch ist und man sich das setzen sparen kann (dh du gehst nicht nach einzellnen Statts vor?).

    nochmals:

    if(DrawCallType==Alphablend && DrawCallType!=LastDrawCallType)
    {
      LastDrawCallType=DrawCallType;
      //schalte blend ein
      //setze blend mode
      //schalte zwrite aus
      //sag meiner oma sie soll das lciht ausmachen
    }
    //zeichne objekt
    

    das ist so simpel, ich sehe nicht was man daran missverstehen kann.



  • rapso schrieb:

    ich verstehe dein problem nicht, mein mit alphablend gerendertes objekt setz alle alphablend states. was soll ich da noch fuer flags nutzbar machen?

    OK jetzt verstehe ich was du meinst, ich hatte mir das ganze etwas komplexer vorgestellt.

    rapso schrieb:

    mit pay-back functionality fragst 😉

    Das käme jetzt ganz drauf an was es ja zurückgezahlt gibt 😃

    rapso schrieb:

    das ist so simpel, ich sehe nicht was man daran missverstehen kann.

    Ich bin davon ausgegangen das du da Flags zusammenfasst, deswegen hatte ich mir das ganze etwas Komplexer vorgestellt, dachte nicht das du das so einfach gelöst hast.


  • Mod

    Xebov schrieb:

    Ich bin davon ausgegangen das du da Flags zusammenfasst, deswegen hatte ich mir das ganze etwas Komplexer vorgestellt, dachte nicht das du das so einfach gelöst hast.

    die sind zusammengefasst, das ist natuerlich applikationen spezifisch und keine generische loesung, aber oft ist das sehr viel besser als eine generische loesung, eben weil du sehr einfach die reihenfolge optimieren kannst, um wenig stats zu setzen und als entwickler siehst du dann auch die probleme direkt

    stell dir 3 drawcalls vor

    dc1: shaderA, ObjectA
    dc1: shaderB, ObjectA
    dc1: shaderA, ObjectB

    welche reihenfolge ist jetzt die beste? und jetzt stell dir das noch mit 6drawcalls und textureA textureB vor, jetzt mit 10000drawcalls und allen moeglichen states...

    alternativ
    DC1: diffuse, objectA
    DC1: alpha, objectB
    dc1: diffuse, objectB

    nein, das ist nicht das selbe, diffuse und alpha haben 10 dinge die du setzt.
    du kommst im ganzen spiel zu 99% mit vielleicht 2 oder 3 grossen states aus, texturen und per object shader parameter muessen vermutlich extra, aber das sortierst du einmal und hast mit wenig aufwand eine recht gute reihenfolge von states die du nur aenderst, wenn es wirklich zu eine neuen gruppe von objekten kommt z.b. alpha-objekte.

    das ist nicht analytisch perfekt. aber von aufwand/nutzen bist du bei sehr wenig aufwand (ID+sortieren) und 98% perfektion.
    desweiteren hast du volle kontrolle ueber sowas kritisches und musst dir nicht irgendwann eine level ansehen bei dem artist so ziemlich jedem objekt um 0.1% andere farben und blend-werte gaben und deswegen dein ganze caching fuer'n A.. sind 😉



  • Das hört sichs chonmal nicht schlecht an, was mich da aber mal interessieren würde, wie evrwaletst dus wenn du fx Files vorgesetzt bekommst? Übersetzt du die dann auch in das System?


  • Mod

    Xebov schrieb:

    Das hört sichs chonmal nicht schlecht an, was mich da aber mal interessieren würde, wie evrwaletst dus wenn du fx Files vorgesetzt bekommst? Übersetzt du die dann auch in das System?

    ich benutze keine fx files. die sind eigentlich der kontrast zu performance, wenig arbeit, generallisiert, aber halt an vielen stellen suboptimal, ist sowas wie c# fuer shadern.

    ich sag nichts gegen c# oder fx files, den meisten sollte das reichen, weil es vieles mit ausreichend leistung ohne nachdenken moeglich macht.


Anmelden zum Antworten