Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

08.12.2010, 21:41

[D3D11] Problem mit Multithreading

Hi Leute!
Ich habe heute versucht, meine Render-Funktion in einem 2. Thread laufen zu lassen.
Das ganze funktioniert einen Frame lang, dann wirft D3D eine Exception:

Quellcode

1
D3D11: CORRUPTION: ID3D11DeviceContext::Map: Two threads were found to be executing functions associated with the same Device at the same time. This will cause corruption of memory. Appropriate thread synchronization needs to occur external to the Direct3D API. 1108 and 4732 are the implicated thread ids. [ MISCELLANEOUS CORRUPTION #28: CORRUPTED_MULTITHREADING ]

Das ganze liegt daran, dass im Update-Thread der ModelRenderer (und noch ein paar andere Objekte) seinen ConstantBuffer updated und im Render-Thread dieser ConstantBuffer schon wieder genutzt wird.

Ich hätte jetzt mehrere Vorangehensweisen:
1.) Deffered Device Contexts: Der UpdateThread und der RenderThread erhalten jeweils einen DDC, mit dem sie die jeweilige CommandList fleißig füllen. Im MainThread werden (wenn Update- und RenderThread mit dem Frame fertig sind) die beiden DDC-CommandListen auf den Immidiate Device Context gedingst, halt ausgeführt.
Nur weiß ich nicht, ob das klappt. Ratet mir lieber vorher davon ab, bevor ich es versuche zu implementieren :S

2.) Doch Update und Render im Main-Thread ausführen. D3D und PhysX belegen schon die restlichen Cores. Evtl. später noch Script- und KI-Threads per ThreadPool sollte reichen.

3.) Alles, was mit dem DC im Update-thread zu tun hat, im MainThread erledigen, wenn kein DC mehr in Anspruch genommen wird.


Ich persönlich würde 1.) nehmen, wenn es denn klappen würde. 2.) Hatte ich bis jetzt, lief ganz gut, will aber den RenderThread vom Update-Thread trennen. 3.) wäre ziemlich komplizier umzusetzen, da hier das Design ziemlich umständlich dreckig gemacht wird.

Was sagt ihr? Macht 1.) Sinn, oder sind DDCs dafür garnicht gedacht?

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

08.12.2010, 22:12

Afaik is das DDC genau dafür da... Also würd ich ganz klar 1) sagen... Ansonsten ich fahr mit 2) sehr gut ;-)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

08.12.2010, 22:50

Wie genau versuchst du den Constant Buffer zu mappen? Denn dabei gibt es einiges zu beachten da du natürlich keine Ressourcen direkt updaten kannst die die GPU gerade verwendet:

Zitat von »DX SDK Doku«

If you call Map on a deferred context, you can only pass D3D11_MAP_WRITE_DISCARD, D3D11_MAP_WRITE_NO_OVERWRITE, or both to the MapType parameter. Other D3D11_MAP-typed values are not supported for a deferred context.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

4

09.12.2010, 16:54

Ich mappe beim Updaten von Resourcen immer mit D3D11_MAP_WRITE_DISCARD.

Mir stellt sich gerade das nächste Problem in den Weg: Die CEGUI kommt mir DDCs nicht klar. Die braucht den Immediate DC.
Also nehm ich 2.).


Noch eine Frage zu DDCs:
Kann ich DDCs auch einmal aufzeichnen und mehrmals abspielen? Bei Dingen wie einfachem PostProcessing, ohne runtime-variable Parameter, könnte man bei der Initialisierung eine CommandList aufzeichnen und anstelle jedesmal die gleichen Funktionen aufzurufen einfach die CommandList abspielen.
Bringt das allgemein mehr Performance?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

09.12.2010, 17:01

Diese Frage stell ich mir auch schon seit ich das erste Mal die D3D11 Doku gelesen hab^^
Ich vermute dass es gehen sollte, bin aber noch net dazugekommen es auszuprobieren. Es würde auf jeden Fall der CPU etwas Arbeit sparen, ob das was ausmacht hängt dann letztenendes aber natürlich wieder von deiner Anwendung ab. Und spätestens mit dynamischen Daten wirds evtl. problematisch. Aber vielleich teilst du mir ja deine Ergebnisse mit ;)

EDIT: Ich seh grad dass es laut D3D Doku definitiv geht.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (09.12.2010, 17:17)


Werbeanzeige