Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Łańcuchy wymiany kontrolują rotację buforu wstecznego, tworząc podstawę animacji graficznej.
Przegląd
Model programowania dla łańcuchów wymiany w wersji Direct3D 12 nie jest identyczny z tym we wcześniejszych wersjach D3D. Wygoda programowania, na przykład obsługa automatycznej rotacji zasobów, która była obecna w D3D10 i D3D11, nie jest już obsługiwana. Automatyczna rotacja zasobów umożliwiała aplikacjom renderowanie tego samego obiektu API, mimo że faktycznie renderowana powierzchnia zmieniała się w każdej klatce. Zachowanie łańcuchów wymiany zostało zmienione w Direct3D 12, aby inne funkcje Direct3D 12 mogły działać przy niskim obciążeniu procesora. Automatyczne kluczowanie koloru i próbkowanie wielokrotne nie są obsługiwane, choć warto zauważyć, że rozciąganie i obracanie nadal są obsługiwane.
Okres istnienia buforu
Aplikacje mogą przechowywać wstępnie utworzone deskryptory odwołujące się do buforów tylnych. Jest to możliwe dzięki temu, że zestaw buforów należących do łańcucha przełączania nigdy nie zmienia się przez cały czas istnienia łańcucha. Zestaw buforów zwracanych przez IDXGISwapChain::GetBuffer pozostaje niezmieniony do momentu wywołania niektórych funkcji API:
Kolejność buforów zwracanych przez funkcję GetBuffer nigdy się nie zmienia.
IDXGISwapChain3::GetCurrentBackBufferIndex zwraca indeks bieżącego buforu wstecznego do aplikacji.
Efekty zamiany
Jedynymi obsługiwanymi trybami zamiany są DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL i DXGI_SWAP_EFFECT_FLIP_DISCARD, co wymaga, aby liczba buforów była większa niż jeden.
Wskazówka
W przypadku gier ukierunkowanych na minimalne opóźnienie wejściowe utwórz łańcuch wymiany z flagą DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING, a następnie wywołaj metodę Present(0, DXGI_PRESENT_ALLOW_TEARING). To omija vsync kompozytora i zapewnia najmniejsze opóźnienie od prezentacji do wyświetlenia. W czasie działania sprawdź, czy funkcja rozrywania jest obsługiwana, wywołując metodę IDXGIFactory5::CheckFeatureSupport z argumentem DXGI_FEATURE_PRESENT_ALLOW_TEARING przed użyciem tej ścieżki.
Warning
Częstym błędem związanym z frame pacingiem jest wywoływanie Present(1, 0) (vsync-on) bez prawidłowej synchronizacji pracy CPU z fence GPU. Powoduje to, że CPU pracuje z wyprzedzeniem, co prowadzi do utworzenia kolejki ramek zwiększającej opóźnienie wejścia. Zawsze używaj synchronizacji liczby ramek do ograniczania liczby ramek przetwarzanych jednocześnie przez CPU (zwykle do liczby buforów pomniejszonej o jeden).
Przechodzenie między trybami okna i pełnoekranowym
Direct3D 12 nie obsługuje trybu pełnoekranowego z wyłącznością (FSE). Zamiast tego, gdy gra jest jedyną widoczną aplikacją na ekranie, system operacyjny wykorzystuje strategię o nazwie optymalizacje pełnoekranowe (FSO), aby osiągnąć podobny efekt do FSE bez wad wydajności. Aby uzyskać więcej informacji o FSO, zobacz Demystifying Fullscreen Optimisations.
W Direct3D 12 nadal obowiązuje ograniczenie, zgodnie z którym aplikacje muszą wywoływać ResizeBuffers po przełączeniu między trybem okienkowym a trybem pełnoekranowym (łańcuchy wymiany D3D11 z modelem odwracania mają takie samo ograniczenie).
Przejścia związane z IDXGISwapChain::SetFullscreenState nie zmieniają zestawu buforów widocznych dla aplikacji w łańcuchu wymiany. Tylko wywołania ResizeBuffers i ResizeTarget tworzą lub niszczą bufory widoczne dla aplikacji. Jednak w trybie Direct3D 12 IDXGISwapChain::SetFullscreenState nie wchodzi w tryb wyłączności pełnoekranowy, a po prostu zmienia rozdzielczości i szybkości odświeżania, aby umożliwić optymalizację pełnoekranową. Te zmiany mogą zostać wprowadzone przez aplikację bez użycia tej metody
Po wywołaniu IDXGISwapChain::Present lub IDXGISwapChain1::Present bufor zaplecza przeznaczony do prezentacji musi znajdować się w stanie D3D12_RESOURCE_STATE_PRESENT. Wywołanie Present zwróci błąd DXGI_ERROR_INVALID_CALL, jeśli ten warunek nie jest spełniony.
Pełnoekranowe łańcuchy wymiany nadal podlegają ograniczeniu, zgodnie z którym przed ostatecznym zwolnieniem łańcucha wymiany należy wywołać funkcję SetFullscreenState(FALSE, NULL). SetFullscreenState(FALSE) kończy się powodzeniem dla łańcuchów wymiany działających na urządzeniach Direct3D 12.
Obecne operacje występują w kolejce 3D udostępnianej podczas tworzenia łańcucha wymiany, a aplikacje mogą współbieżnie prezentować wiele łańcuchów wymiany oraz rejestrować i wykonywać listy poleceń.
Gdy końcowy etap przetwarzania graficznego (na przykład postprocessing klatki) jest wykonywany w kolejce obliczeniowej albo nie obejmuje kolejki graficznej urządzenia, korzystne może być utworzenie drugiej kolejki 3D do prezentacji, co pozwala uniknąć sytuacji, w której opóźnienie prezentacji opóźnia rozpoczęcie przetwarzania następnej klatki.
Przykład
Poniższy przykładowy kod będzie obecny w głównej pętli renderowania:
Warning
Poniższy przykład jest uproszczony w celu zapewnienia przejrzystości. W produkcyjnej pętli gry należy oddzielać aktualizacje symulacji od częstotliwości renderowania — na przykład używając stałego kroku czasowego dla symulacji, przy jednoczesnym renderowaniu tak szybko, jak to możliwe — oraz używać synchronizatora do ograniczania liczby klatek przetwarzanych jednocześnie. Bez ograniczania liczby ramek w locie funkcja Present może zakończyć się powodzeniem natychmiast w łańcuchach wymiany typu flip-model, co pozwala procesorowi kolejkować ramki bez ograniczeń i zwiększać opóźnienie wejścia.
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Tworzenie łańcuchów wymiany
Podczas korzystania z wywołań CreateSwapChainForHwnd, CreateSwapChainForCoreWindow lub CreateSwapChainForComposition należy pamiętać, że parametr pDevice w rzeczywistości wymaga wskaźnika do bezpośredniej kolejki poleceń w Direct3D 12, a nie wskaźnika do urządzenia.
Prezentowanie w systemie Windows 7
W przypadku korzystania z Direct3D 12 w systemie Windows 7 niezbędne typy DXGI dla Direct3D 12 nie są dostępne, dlatego do prezentacji należy użyć interfejsu ID3D12CommandQueueDownLevel udostępnianego przez D3D12On7 (uzyskiwanego przez odpytanie bezpośredniej kolejki poleceń).
Należy podać otwartą listę poleceń dla obecnej metody systemu Windows 7, która będzie następnie używana, zamknięta i automatycznie przesłana do urządzenia. Musisz podać bufor zapasowy, który musi być utworzony przez aplikację, musi być zasobem dedykowanym, musi być jednokrotnie próbkowany i musi mieć jeden z następujących formatów.
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB