2008-09-11 6 views
3

Wir haben eine DirectX-Anwendung mit zwei Bildschirmen, die zuvor mit einer konsistenten 60 FPS (Synchronisierungsrate der Monitore) unter Verwendung einer NVIDIA 8400GS (256 MB) lief. Als wir jedoch die Karte gegen eine mit 512 MB RAM austauschten, kämpft die Bildrate über 40 FPS. (Es wird nur so hoch, weil wir Triple-Buffering verwenden.) Die beiden Karten stammen vom selben Hersteller (PNY). Alle anderen Dinge sind gleich, das ist eine Windows XP Embedded-Anwendung und wir haben für jede Karte ein neues Image erstellt. Die Treiberversionsnummer lautet 169.21.Was kann beim Aktualisieren einer Grafikkarte zu einer Verringerung der Bildrate führen?

Die Anwendung ist alles 2D. I.E. nur ein paar texturierte Quads und eine ganze Menge vorgerenderter Grafiken (daher die Notwendigkeit, den Speicher der Karte zu aktualisieren). Wir haben auch Animationen komprimiert, die die CPU im Handumdrehen dekodiert - dies beinhaltet eine Textursperre. Die Sperren dauern ewig, aber ich habe auch versucht, eine separate Systemspeichertextur zu haben, damit die CPU die gerenderte Textur aktualisieren und aktualisieren kann, indem sie die UpdateTexture-Methode des Geräts verwendet. Kein Gesamtleistungsunterschied.

Obwohl ich jede FAQ gelesen habe, die ich im Internet über DirectX-Leistung finden kann, ist dies immer noch das erste Mal, dass ich an einem DirectX-Projekt gearbeitet habe, sodass alle obskuren Wissensbasen nützlich wären. :)

Eine andere Sache, während ich zu dem Thema bin; Beim Aufruf von Present auf den Swap-Ketten scheint DirectX auf den Abschluss der Gegenwart zu warten, ungeachtet der Tatsache, dass ich D3DPRESENT_DONOTWAIT in beiden vorhandenen Parametern (PresentationInterval) und den Flags des Aufrufs selbst verwende. Da es sich um eine Anwendung mit zwei Bildschirmen handelt, handelt es sich um ein Problem, da die beiden Monitore nicht als genlocked dargestellt werden. Ich arbeite daran, indem ich die Present-Aufrufe über einen Threadpool ausführe. Was könnte der Grund dafür sein?

+0

Sie betrogen worden sein, die 65nm „rev. 2“ Version, die nur 8 Shader-Einheiten statt 16. Das heißt, zu kaufen, warum Sie eine 8400GS verwenden Sie, wenn Sie stattdessen einen GT610 mit 4-fach Speicher und DDR3 haben von DDR2 und 4x die Anzahl der Shader-Einheiten für den gleichen Preis? (plus, es hat eine TDP von nur 29W vs 40W) – Damon

Antwort

2

Sind die Karten genau das gleiche (beide GeForce 8400GS) und nur die Speichergröße unterscheiden? Sehr oft mit unterschiedlichen Speichergrößen kommen leicht unterschiedliche Taktraten (d. H. Ihre Karte mit mehr Speicher verwendet möglicherweise langsameren Speicher!).

Also die erste Sache zu prüfen wäre GPU Kern & Speicher Taktraten, mit etwas wie GPU-Z.

+0

Ich denke, das ist der Grund. Vielen Dank. –

1

Es ist ein einfacher Test, um zu sehen, ob die Oberfläche Sperre das Problem ist, sondern nur die Textur-Update Kommentar und sehen, ob die Framerate wieder auf 60 Hz. Leider hat das Schreiben auf eine gesperrte Oberfläche und das Aktualisieren der Ressource die Performance immer gekillt. Verwenden Sie Mipmaps mit den Texturen? Ich weiß DX9 hinzugefügt automatische Generierung von Mipmaps, könnte eine Menge Zeit, um diese zu generieren. Wenn Sie die gleiche Ressource für jeden Frame konstant sperren, können Sie auch versuchen, einen Pool von Texturen zu erstellen, ähnlich wie Triple-Buffering mit Ausnahme von Texturen. Sie würden das Rendern eine Textur verwenden lassen, und beim nächsten Update wählen Sie die nächste verfügbare Textur in dem Pool aus, die nicht zum Rendern verwendet wird. Es sei denn, Ihr Gedächtnis ist eingeschränkt oder Sie machen nur Diffs zur animierten Textur.

+0

Mipmaps sind deaktiviert. Ich werde versuchen, die dynamischen Texturen doppelt zu puffern und zu sehen, was passiert. Vielen Dank. –