Direct X

12/06/2015 13:04 Terrat#1
Ich hätte mal hier eine Frage zu DirectX / Render Aufteilung.
Derzeit rendered ein Thread sowohl den Scene Bereich (3D) und danach den HUD/Sprite Bereich (2D). Dies geschieht jeweils auf den gleichen Context und wird danach simpel über die swapchain ausgegeben. Jetzt bin ich am überlegen ob ich nicht 2 getimte Threads laufen lassen wobei das 1 den Scene bereich rendered und das andere HUD/Sprites usw.. und danach wen beide Threads fertig sind die Contexte übereinander lege. (Zuerst der Scene Context und darauf den 2D Context)
Jetzt frage ich mich aber, kann man die Contexte in Direct X 11 einfach so überlappen ? Und wenn ja wie verbinde ich nachher den 2D context mit Alpha state mit dem 3D Context?
12/06/2015 13:54 Jeoni#2
Ich fürchte, dass das zu keinem signifikanten Performanceboost führen wird, da das Bottleneck hier die Kommunikation mit der Grafikkarte ist. Für diese ist meines Wissens nach keine Parallelisierung möglich bzw. wird der Treiber dafür sorgen, dass eigentlich parallele Aufrufe sowieso sequentiell abgearbeitet werden. Man möge mich korrigieren, wenn ich falsch liege, denn 100%ig sicher bin ich mir da nicht.
Ich würde versuchen dort generell anders zu optimieren. Beispielsweise hat man im HUD ja häufig sich nicht veränderliche Objekte / Dinge die über viele Frames gleich bleiben. Die könnte man einmalig in eine andere Textur / auf ein anderes Surface rendern und dann, solange die Dinge gleich bleiben nur diese Textur rendern. In der Welt vielleicht auch ein paar Objekte zusammenführen und ggf. einen Texture Atlas nutzen, wo es sich anbietet.
Mit freundlichen Grüßen
Jeoni
12/06/2015 14:17 Terrat#3
Quote:
Originally Posted by Jeoni View Post
Ich fürchte, dass das zu keinem signifikanten Performanceboost führen wird, da das Bottleneck hier die Kommunikation mit der Grafikkarte ist. Für diese ist meines Wissens nach keine Parallelisierung möglich bzw. wird der Treiber dafür sorgen, dass eigentlich parallele Aufrufe sowieso sequentiell abgearbeitet werden. Man möge mich korrigieren, wenn ich falsch liege, denn 100%ig sicher bin ich mir da nicht.
Ich würde versuchen dort generell anders zu optimieren. Beispielsweise hat man im HUD ja häufig sich nicht veränderliche Objekte / Dinge die über viele Frames gleich bleiben. Die könnte man einmalig in eine andere Textur / auf ein anderes Surface rendern und dann, solange die Dinge gleich bleiben nur diese Textur rendern. In der Welt vielleicht auch ein paar Objekte zusammenführen und ggf. einen Texture Atlas nutzen, wo es sich anbietet.
Mit freundlichen Grüßen
Jeoni
Danke schon mal. Also stelle ich mir das gerade wie caching vor oder ?
Wobei ich mich immernoch frage wieso die ganzen XYZ games mehrere Threads zum rendern nutzen.
12/06/2015 14:24 Jeoni#4
Kann man sich in der Tat in etwa wie Caching vorstellen. Hab das Wort in diesem Zusammenhang nur noch nicht gehört.
Nutzen die Games tatsächlich mehrere Threads zum Rendern? Mehrere Threads generell ist ja durchaus verständlich, gibt ja auch noch andere Sachen abgesehen vom Rendern. Aber meines Wissens nach kann die Grafikkarte auch nur eine Aufgabe erledigen. Diese zwar hochparallelisiert, aber halt nur ein Satz Shader, also nur ein Zweck zur gleichen Zeit. Könnte aber auch sein, dass das nur die Einschränkung von d3d ist. Wobei selbst wenn man mehrere Aufgaben gleichzeitig bearbeiten lassen könnte, diese entsprechend langsamer laufen würden, weil die Resourcen der Grafikkarte (Shadereinheiten) auf die Aufgaben aufgeteilt werden müssten.
Mit freundlichen Grüßen
Jeoni
12/06/2015 15:05 warfley#5
Rendern in mehreren Threads ist eine der großen Neuerungen von Direct X 12, und bei vorigen Versionen nahezu unmöglich, bzw. komplett unbrauchbar. Spiele verwenden eigentlich immer nur einen Thread zum rendern. Ich glaube du hast da irgend etwas missverstanden. Spiele benutzen zwar mehrere Threads, aber nicht zum rendern, zumindest nicht unter DirectX < 12 oder OpenGL.