2010-02-25 2 views
8

Beim Profiling meiner App mit Pix habe ich festgestellt, dass die GPU die meiste Zeit im DX10-Modus läuft (im DX10-Modus) und auf eine nicht verfügbare Ressource wartet. (Und ist immer in Reihe mit der CPU (zum Beispiel, wenn die CPU Rahmen X verarbeitet, wird die GPU auch Frame X Verarbeitung) für dieses Problem)Resource Contention

Einige Anmerkung:

1) Die App ist GPU begrenzt (die CPU ist im Grunde müßig (20% der CPU-Auslastung in den meisten schweren Szene))

Meine Fragen sind:

1) Wie muss ich diese Ergebnisse interpretieren? In Pix jedes Bild auf der GPU-Seite sehe ich 2-3 kleine rote Balken (soweit ich weiß, bedeutet Ressource nicht verfügbar) und nach ihnen eine mittlere/große graue Leiste (das heißt GPU Leerlauf). Die CPU auf einer anderen Seite hat einige Operationen, eine große leere Leiste und dann einige andere Operationen (wartet auf etwas?)

Ein weiterer Hinweis, wenn die GPU im Leerlauf ist im Allgemeinen die CPU arbeitet. (Das Gegenteil ist offensichtlich nicht gültig)

2) Durch welche Anrufe kann die Ressource nicht mehr verfügbar sein?

Ein MAP mit DISCARD gilt als blockierender Anruf?
Eine Abfrage, um die DESC eines Objekts zu bekommen?
Sharing ein Shader-Effekt gilt als eine Konkurrenz?
Was andere?

My allgemeinen Rahmen ist:

41 DrawPrimitives/DrawIndexedPrimitives (am Objekt instanziert sind)
7/8 Locks auf einem Eckenpuffer mit discard
9 Änderung des Pixelshader/Vertexshader
1 SetRenderTarget

Danke!

P.S. Screenshot von pix

http://img191.imageshack.us/img191/6800/42594100.jpg

Wenn ich einen einzelnen Zeichenaufruf (mit der gleichen gpu Last (zum Beispiel eines Partikel-Engine mit x-Teilchen oder einem instanzierten Objekt)) anstelle der Vollversion des Spiels verwenden bekomme ich ein vollen blau bar und die GPU richtig 2-3 Rahmen hinter der CPU ...

EDIT: Ich konzentriere mich mehr und mehr auf das Effect Framework, das wahrscheinlich der Grund für dieses Problem ist. Ich teile einen Effekt zwischen mehr Objekten, um Speicher und Zeit zu sparen, um sie zu erstellen. Ist das sicher ohne Streit anzunehmen?

+0

Brummen, Running pix, können Sie nicht isolieren, welcher Anruf den Flush erzwingt? – Bahbar

Antwort

1

Was mit dem zur Verfügung gestellten Informationen in den Sinn kommt:

  • Verwenden Sie doppelte Pufferung mit Vsync? Vielleicht warten beide darauf, dass der Backbuffer verfügbar wird. Probieren Sie das Triple-Buffering oder die sofortige Präsentation aus.
  • Haben Sie versucht, Ihren Vertex-Puffer mit einer NOOVERWITE-Kreisstrategie anstelle von 8-mal DISCARD zu sperren? Vielleicht gibt es zu viel Speicherdruck für die GPU, um einen neuen Puffer für Ihre Ablage neu zuzuweisen. Außerdem erlaubt es einige Hardware nicht, den gleichen Vertexpuffer mehr als X Mal zu verwerfen, bevor er gerendert wird.
  • Da Sie den gleichen Effekt teilen, werden die Parameter auch geteilt?
+0

1) Versuchte alle Typen, sofortige/doppelte/dreifache Pufferung. Keine Änderung 2) Ich verwerfe einen Puffer einmal pro Frame bei max. (Es gibt 8 Puffer) 3) Mhn .... nein, die Parameter sind getrennt, da sie separate logische Klasse sind. – feal87