2009-07-28 16 views
0

Ich muss einige CPU-generierte Bilder in Direct3D 9 rendern und ich bin mir nicht sicher, wie Sie die Texturdaten am besten auf die Grafikkarte bekommen, da es eine Reihe von Ansätzen zu geben scheint.Der beste Weg, um eine Direct3D-Textur zu aktualisieren

Mein Nutzungs Weg geht entlang der folgenden Zeilen jedes Rahmens

  1. ein paar Sachen Render mit den Texturen
  2. -Update einige Teile der Textur (die von der vorherigen rendert verwendet wurden)
  3. mehr Material mit der Textur Render
  4. -Update ein anderer Teil der Textur
  5. und so weiter

Ich dachte an ein paar Möglichkeiten, dies zu tun, aber ich bin mir nicht sicher, mit welchem ​​ich gehen soll. Ich erwog, jedes Verfahren zu benchmarken, aber ich habe keine Möglichkeit zu wissen, ob irgendwelche Ergebnisse, die ich erhalte, für Hardware im Allgemeinen oder nur für meine Hardware repräsentativ sind.

  • Welcher Pool eignet sich am besten für eine Textur für diese Aufgabe?
  • Was ist der beste Weg, um diese Textur zu aktualisieren?
    1. Anruf LockRect und UnlockRect für jede Region I
    2. Anruf LockRect und UnlockRect für die gesamte Textur
    3. Anruf LockRect und UnlockRect für die gesamte Textur mit D3DLOCK_DISCARD aktualisieren müssen und in einem Bitmap aus dem RAM kopieren.
    4. Erstellen Sie eine völlig neue Textur jedes Mal, ich brauche in D3DPOOL_SYSMEM
    5. Verwendung 1,2 oder 3 zu aktualisieren, um eine Oberfläche „aktualisieren“, zu aktualisieren UpdateSurface dann Ebene 0 meiner Textur von dieser Oberfläche
    6. Gleiche wie 5, aber geben Sie RECT den gesamten Bereich I
    7. Gleiche wie 5 müssen decken, aber ich mehrere Anrufe, eine für jede Region machen
    8. Wahrscheinlich noch eine andere Art und Weise aktualisiert, dies zu tun habe ich noch nicht gedacht ...

Es sollte angemerkt werden, dass die Bereiche, die ich aktualisiere, normalerweise ziemlich klein sind, verglichen mit der Größe der gesamten Textur, z. B. kann die Textur 1024 * 1024 sein und ich möchte vielleicht 5 oder so 64 * 64 Bereiche davon aktualisieren.

Antwort

-1
  • D3DPOOL_DEFAULT
  • D3DUSAGE_DYNAMIC
  • Anruf LockRect und UnlockRect für jede Region Sie

aktualisieren müssen -> Dies ist die schnellste!

Benchmark folgen ...

1

Wenn Sie mehrere Bereiche aktualisieren müssen, sollten Sie die gesamte Textur sperren und die D3DLOCK_NO_DIRTY_UPDATE Flag verwenden, dann für jeden Bereich Anruf AddDirtyRect vor dem Entriegeln.

Das hängt natürlich alles von der Größe der Textur usw. ab, für eine kleine Textur kann es effizienter sein, das Ganze vom RAM zu kopieren.

Verwandte Themen