Wprowadzenie do wielowątkowości w Direct3D 11
Wielowątkowość została zaprojektowana, aby zwiększyć wydajność poprzez wykonywanie zadań przy użyciu jednego lub więcej wątków jednocześnie.
W przeszłości często było to wykonywane przez wygenerowanie jednego głównego wątku do renderowania i co najmniej jednego wątku do wykonywania prac przygotowawczych, takich jak tworzenie obiektów, ładowanie, przetwarzanie itd. Jednak w przypadku wbudowanej synchronizacji w Direct3D 11 celem wielowątku jest wykorzystanie każdego cyklu CPU i GPU bez zmuszania jednego procesora do oczekiwania na inny (zwłaszcza, aby GPU nie musiał czekać, ponieważ ma to bezpośredni wpływ na szybkość wyświetlania klatek). Dzięki temu można wygenerować największą ilość pracy przy zachowaniu najlepszej szybkości klatek. Koncepcja pojedynczej ramki renderowania nie jest już niezbędna, ponieważ interfejs API implementuje synchronizację.
Wielowątkowość wymaga jakiejś formy synchronizacji. Jeśli na przykład wiele wątków uruchamianych w aplikacji musi uzyskiwać dostęp do jednego kontekstu urządzenia (ID3D11DeviceContext), aplikacja musi używać mechanizmu synchronizacji, takiego jak sekcje krytyczne, aby zsynchronizować dostęp do tego kontekstu urządzenia. Wynika to z przetwarzania poleceń renderowania (zwykle wykonywanych na procesorze GPU) i generowania poleceń renderowania (zwykle wykonywanych na procesorze CPU za pomocą tworzenia obiektów, ładowania danych, zmiany stanu, przetwarzania danych) często używają tych samych zasobów (tekstur, cieniowania, stanu potoku itd.). Organizowanie pracy między wieloma wątkami wymaga synchronizacji, aby zapobiec modyfikowaniu lub odczytywaniu danych modyfikowanych przez inny wątek.
Chociaż użycie kontekstu urządzenia (ID3D11DeviceContext) nie jest bezpieczne wątkowo, korzystanie z urządzenia Direct3D 11 (ID3D11Device) jest bezpieczne wątkowo. Ponieważ każdy ID3D11DeviceContext działa w pojedynczym wątku, tylko jeden wątek może wywołać ID3D11DeviceContext naraz. Jeśli wiele wątków musi uzyskać dostęp do jednego ID3D11DeviceContext, muszą użyć mechanizmu synchronizacji, takiego jak sekcje krytyczne, aby zsynchronizować dostęp do tego ID3D11DeviceContext. Jednak nie jest wymagane użycie wielu wątków do korzystania z sekcji krytycznych ani prymitywów synchronizacji w celu uzyskania dostępu do pojedynczego ID3D11Device. W związku z tym, jeśli aplikacja używa ID3D11Device do tworzenia obiektów zasobów, ta aplikacja nie musi używać synchronizacji do tworzenia wielu obiektów zasobów w tym samym czasie.
Obsługa wielowątków dzieli interfejs API na dwa odrębne obszary funkcjonalne.
- tworzenie obiektów z wielowątkowym
- natychmiastowe i odroczone renderowanie
Wydajność wielowątkowości zależy od obsługi sterownika. Instrukcje: sprawdzanie obsługi sterowników zawiera więcej informacji na temat wykonywania zapytań dotyczących sterownika i znaczenia wyników.
Direct3D 11 została zaprojektowana od podstaw, aby obsługiwać wielowątkowość. Direct3D 10 implementuje ograniczoną obsługę wielowątkowości przy użyciu warstwy bezpiecznej wątkowo. Na tej stronie wymieniono różnice zachowania między dwiema wersjami directX: Różnice wątkowe między wersjami Direct3D.
Wielowątkowość i DXGI
Tylko jeden wątek naraz powinien używać kontekstu natychmiastowego. Aplikacja powinna również używać tego samego wątku do operacji w infrastrukturze graficznej Microsoft DirectX (DXGI), zwłaszcza gdy wykonuje wywołania metody IDXGISwapChain::Present.
Notatka
Nie można używać bezpośredniego kontekstu współbieżnie z większością funkcji interfejsu DXGI. W przypadku zestawów SDK DirectX z marca 2009 r. i nowszych, jedynymi bezpiecznymi funkcjami DXGI są AddRef, Releaseoraz QueryInterface.
Aby uzyskać więcej informacji na temat używania DXGI z wieloma wątkami, zobacz Zagadnienia dotyczące wielu wątków.
Tematy pokrewne