2017-05-15 2 views
0

Ich habe eine gemeinsame DX11 Textur, die mit 2 verschiedenen Geräten in separaten Threads verwendet wird.DX11 Aktualisieren von gemeinsamen Texturen

Thread1 (Betriebs am Gerät 1): jeden Rahmen genannt und aktualisiert die gemeinsam genutzte Textur

Thread2 (auf DEVICE2 Betrieb): Verbraucht die gemeinsame Textur, die durch sie auf eine andere Textur zu kopieren. Frequenz ist viel kleiner als Thread 1.

Nach MSDN "Wenn eine gemeinsame Textur auf einem Gerät aktualisiert wird ID3D11DeviceContext :: Flush muss auf diesem Gerät aufgerufen werden."

Allerdings ist das Aufrufen von flush auf thread1 jedes Frame sehr teuer und wir sehen einen massiven Leistungseinbruch. Wir können Gerät 1 nicht auf Thread 2 spülen, da ein Gerätekontext nicht Thread-sicher ist.

Gibt es eine Möglichkeit, die gemeinsame Texturaktualisierung effizient zu machen, wenn Threads 2 sie benötigen?

Danke für Ihre Hilfe! MSDN ist nicht sehr hilfreich beim Umgang mit geteilten Texturen. betonten Text

Antwort

0

Um den Zugriff auf die gemeinsam genutzte Ressource zwischen zwei Threads (oder Inter) Sie verwenden IDXGIKeyedMutex können zu synchronisieren. Es wird hier in Details beschrieben: https://msdn.microsoft.com/en-us/library/windows/desktop/ee913554(v=vs.85).aspx#dxgi_1.1_synchronized_shared_surfaces

Sie können den mitgelieferten Beispielcode überprüfen, obwohl sie nur die gemeinsame Nutzung von Ressourcen zwischen zwei DX10-Geräten zeigen. Dies gilt auch für DX11-Geräte. Der wesentliche Teil ist, QueryInterface die gemeinsame Textur für IDXGIResource zuerst und dann für IDXGIKeyedMutex. Danach verwenden Sie den Mutex für die Synchronisation mit AcquireSync und ReleaseSync.

+0

Leider funktionieren getastete Mutexe für mich nicht, da es keine definierte Reihenfolge gibt, in der der Thread zuerst ausgeführt werden soll. Beide Threads können in zufälligen Intervallen aufgerufen werden, was verschlüsselte Mutexe für dieses Szenario ungeeignet macht – Sid