Ressourcenkonflikt

8

Beim Profiling meiner App mit Pix habe ich festgestellt, dass die GPU im DX10-Modus die meiste Zeit im Leerlauf läuft und auf eine nicht verfügbare Ressource wartet. (und befindet sich immer in einer Reihe mit der CPU (wenn beispielsweise die CPU Frame X verarbeitet, verarbeitet die GPU auch Frame X) für dieses Problem)

Einige Anmerkung:

1) Die App ist GPU-begrenzt (die CPU ist im Prinzip im Leerlauf (20% der CPU-Auslastung in der schwersten Szene))

Meine Fragen sind:

1) Wie muss ich diese Ergebnisse interpretieren? In Pix jeden Frame auf der GPU-Seite sehe ich 2-3 kleine rote Balken (soweit ich weiß Ressourcen bedeutet 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?)

Eine weitere Anmerkung: Wenn die GPU im Leerlauf ist, arbeitet die CPU im Allgemeinen. (Das Gegenteil ist offensichtlich nicht gültig)

2) Welche Anrufe können dazu führen, dass die Ressource nicht mehr verfügbar ist?

Ein MAP mit DISCARD gilt als blockierender Anruf?
Eine Abfrage, um die DESC eines Objekts zu erhalten?
Das Teilen eines Shader-Effekts wird als Konflikt angesehen?
Was für andere?

Mein allgemeiner Rahmen ist:

41 DrawPrimitives / DrawIndexedPrimitives (die meisten Objekte sind instanziert)
7/8 Verriegelt auf einem Vertex-Puffer mit verwerfen | 9 Änderung des Pixel-Shaders / Vertex-Shaders 1 sentrendertarget

Danke!

P.S. Screenshot von Bildern

Ссылка

Wenn ich einen einzelnen Draw-Aufruf verwende (mit der gleichen GPU-Ladung (zum Beispiel eine Partikel-Engine mit x Partikeln oder einem instanziierten Objekt)) bekomme ich statt des vollen Spiels einen vollen blauen Balken und die GPU korrekt 2-3 Frames 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 ohne Zweifel sicher anzunehmen?

    
feal87 25.02.2010, 15:17
quelle

1 Antwort

1

Was Ihnen bei den bereitgestellten Informationen einfällt:

  • Verwenden Sie Double-Pufferung mit vsync? Vielleicht warten beide darauf, dass der Backbuffer verfügbar wird. Probieren Sie die dreifache Pufferung oder sofortige Präsentation aus.
  • Haben Sie versucht, Ihren Vertex-Puffer mit einer NOOVERWITE-Kreisstrategie zu sperren, statt 8-mal DISCARD? Vielleicht gibt es zu viel Speicherdruck für die GPU, um einen neuen Puffer für Ihre Ablage neu zuzuweisen. Außerdem erlaubt es manche Hardware nicht, den gleichen Vertex-Puffer mehr als X Mal zu verwerfen, bevor er gerendert wird.
  • Da Sie den gleichen Effekt teilen, werden die Parameter auch geteilt?
Coincoin 02.03.2010 21:53
quelle

Tags und Links