Einzelnen Beitrag anzeigen

OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#7

Re: Direct3D - Kapselung der Routinen

  Alt 21. Feb 2004, 13:58
Nun, ein in 3D korrekt gerendertes Sprite sieht genauso aus wie ein 2D-Sprite!
Der Unterschied ist, dass zum einen die Geschwindigkeit viel höher ist, und du zum anderen mit vergleichsweise geringen Performance-Einbußen das Sprite drehen, skalieren oder auch alphablenden kannst. Und die CPU hat eidieweil für andere Dinge Zeit.

Und die Dreiecke musst du ja eben nicht neu errechnen. Das übernimmt ja die Grafikkarte für dich, wenn du ihr die nötigen Transformationsmatrizen gibst. Die Errechnung der Matrizen ist wiederum relativ trivial, zumal du sie ja zwischenspeichern kannst. Der Witz ist, dass es eine enorme "Performance-Strafe" gibt, wenn du andauernd auf die Vertexbuffer zugreifst, denn deren Daten liegen ja im Grafikkartenspeicher und die gibt den nur ungern her (muss gesperrt werden etc.), und das mit den Matrizen geht halt einfach schneller, selbst wenn du sie immer neu errechnest.

Hier noch ein paar Tipps aus dem SDK (Performance Optimization: General Performance Tips)
Zitat von Microsoft:
Minimize vertex buffer switches.
Use static vertex buffers where possible.
Use one large static vertex buffer per flexible vertex format (FVF) for static objects, rather than one per object.
Insbesondere die ersten beiden treffen hier zu. Der dritte trifft dann zu, wenn du trotzdem lieber die Dreieckdaten verändern willst, als Transformationsmatrizen zu verwenden.
Ach ja, und zum Theme Matrizen, wie ich bereits erwähnte:
Zitat von Microsoft:
Direct3D uses the world and view matrices that you set to configure several internal data structures. Each time you set a new world or view matrix, the system recalculates the associated internal structures. Setting these matrices frequently—for example, thousands of times per frame—is computationally time-consuming. You can minimize the number of required calculations by concatenating your world and view matrices into a world-view matrix that you set as the world matrix, and then setting the view matrix to the identity. Keep cached copies of individual world and view matrices so that you can modify, concatenate, and reset the world matrix as needed. For clarity in this documentation, Direct3D samples rarely employ this optimization.
Im selben Dokument stehen auch noch eine Reihe weiterer Performance-Tipps, einfach mal reinschauen.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat