Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Infrastruktura grafiki Microsoft DirectX (DXGI) rozpoznaje, że niektóre części grafiki rozwijają się wolniej niż inne. Głównym celem DXGI jest zarządzanie zadaniami niskiego poziomu, które mogą być niezależne od środowiska uruchomieniowego grafiki DirectX. DXGI udostępnia wspólną strukturę dla przyszłych składników graficznych; pierwszym składnikiem korzystającym z usługi DXGI jest microsoft Direct3D 10.
W poprzednich wersjach Direct3D zadania niskiego poziomu, takie jak wyliczanie urządzeń sprzętowych, prezentowanie renderowanych klatek do urządzenia wyjściowego, kontrolowanie gamma i zarządzanie przejściem pełnoekranowym, były uwzględnione w runtime Direct3D. Te zadania są teraz implementowane w usłudze DXGI.
Celem DXGI jest komunikowanie się ze sterownikiem trybu jądra i sprzętem systemowym, jak pokazano na poniższym diagramie.
Aplikacja może uzyskać bezpośredni dostęp do DXGI lub wywołać interfejsy API Direct3D w D3D11_1.h, D3D11.h, D3D10_1.h lub D3D10.h, które obsługują komunikację z DXGI. Możesz chcieć pracować bezpośrednio z usługą DXGI, jeśli aplikacja musi wyliczać urządzenia lub kontrolować sposób prezentowania danych wyjściowych.
Ten temat zawiera następujące sekcje.
- Wyliczanie adapterów
-
Prezentacja
- Tworzenie łańcucha wymiany
- Zarządzanie i utrzymanie łańcucha wymiany
- Obsługa zmiany rozmiaru okna
- Wybieranie danych wyjściowych i rozmiaru DXGI
- Debugowanie w trybie Full-Screen
- Niszczenie łańcucha wymiany
- Korzystanie z obróconego monitora
- Przełączanie trybów
- Pełnoekranowa wskazówka dotycząca wydajności
- Zagadnienia wielowątkowości
- Odpowiedzi DXGI z biblioteki DLLMain
- Zmiany DXGI 1.1
- Zmiany DXGI 1.2
- Tematy pokrewne
Aby sprawdzić, które formaty są obsługiwane przez sprzęt Direct3D 11:
- Obsługa formatu DXGI dla sprzętu na poziomie funkcji Direct3D 12.1
- Obsługa formatu DXGI dla sprzętu na poziomie funkcji Direct3D 12.0
- Obsługa formatu DXGI dla sprzętu na poziomie funkcji Direct3D 11.1
- Obsługa formatu DXGI dla sprzętu na poziomie funkcji Direct3D 11.0
- Obsługa sprzętu dla formatów Direct3D 10Level9
- Obsługa sprzętu dla formatów Direct3D 10.1
- Obsługa sprzętu dla formatów Direct3D 10
Wyliczanie adapterów
Adapter to abstrakcja sprzętu i możliwości oprogramowania komputera. Na maszynie zazwyczaj jest wiele adapterów. Niektóre urządzenia są implementowane w sprzęcie (na przykład w przypadku karty wideo), a niektóre są implementowane w oprogramowaniu (na przykład rasterizatora odwołań Direct3D). Adaptery implementują funkcje używane przez aplikację graficzną. Na poniższym diagramie przedstawiono system z jednym komputerem, dwoma adapterami i trzema monitorami wyjściowymi.
Podczas wyliczania tych elementów sprzętu DXGI tworzy interfejs IDXGIOutput1 dla każdego wyjścia (lub monitora) i interfejs IDXGIAdapter2 dla każdej karty wideo (nawet jeśli jest to karta wideo wbudowana w płytę główną). Wyliczenie odbywa się przy użyciu wywołania interfejsu IDXGIFactory::EnumAdapters w celu zwrócenia zestawu interfejsów IDXGIAdapter reprezentujących sprzęt wideo.
DXGI 1.1 dodał interfejs IDXGIFactory1 . IDXGIFactory1::EnumAdapters1 zwraca zestaw interfejsów IDXGIAdapter1 reprezentujących sprzęt wideo.
Jeśli chcesz wybrać określone możliwości sprzętu wideo podczas korzystania z interfejsów API Direct3D, zalecamy iteracyjne wywołanie D3D11CreateDevice lub D3D11CreateDeviceAndSwapChain z każdym uchwytem adaptera i możliwym poziomem funkcji sprzętu. Ta funkcja powiedzie się, jeśli poziom funkcji jest obsługiwany przez określony adapter.
Nowe informacje o wyliczaniu adapterów dla systemu Windows 8
Począwszy od systemu Windows 8, karta o nazwie "Podstawowy sterownik renderowania Microsoft" jest zawsze obecna. Ten adapter ma identyfikator VendorId 0x1414 i identyfikator DeviceID 0x8c. Ten adapter ma również wartość DXGI_ADAPTER_FLAG_SOFTWARE ustawioną w członkowskim polu Flags struktury DXGI_ADAPTER_DESC2. Ten adapter jest urządzeniem tylko do renderowania, które nie zawiera wyjść wyświetlania. DXGI nigdy nie zwraca DXGI_ERROR_DEVICE_REMOVED dla tego adaptera.
Jeśli sterownik wyświetlania komputera nie działa lub jest wyłączony, karta podstawowa (NULL) komputera może być również nazywana "Podstawowym sterownikiem renderowania Microsoft". Jednak ta karta ma dane wyjściowe i nie ma ustawionej wartości DXGI_ADAPTER_FLAG_SOFTWARE . System operacyjny i aplikacje domyślnie używają tego adaptera. Jeśli sterownik wyświetlania jest zainstalowany lub włączony, aplikacje mogą odbierać DXGI_ERROR_DEVICE_REMOVED dla tego adaptera, a następnie ponownie wyliczać adaptery.
Gdy podstawowa karta wyświetlania komputera jest "Podstawowa karta graficzna Firmy Microsoft" (adapter WARP ), ten komputer ma również drugą kartę. Ten drugi adapter jest urządzeniem tylko do renderowania, które nie ma wyjść wyświetlania i dla którego DXGI nigdy nie zwraca DXGI_ERROR_DEVICE_REMOVED.
Jeśli chcesz użyć funkcji WARP do renderowania, obliczeń lub innych długotrwałych zadań, zalecamy użycie urządzenia tylko do renderowania. Wskaźnik do urządzenia tylko do renderowania można uzyskać, wywołując metodę IDXGIFactory1::EnumAdapters1 . Podczas określania D3D_DRIVER_TYPE_WARP w parametrze DriverType funkcji D3D11CreateDevice tworzysz także urządzenie WARP tylko do renderowania, ponieważ urządzenie WARP korzysta również z adaptera WARP.
Prezentacja
Twoim zadaniem aplikacji jest renderowanie ramek i poproś DXGI o przedstawienie tych ramek do danych wyjściowych. Jeśli aplikacja ma dostępne dwa, może renderować jeden bufor podczas prezentowania drugiego. Aplikacja może wymagać więcej niż dwóch buforów, w zależności od czasu potrzebnego na renderowanie klatki lub od żądanej szybkości klatek podczas prezentacji. Utworzony zestaw buforów nazywa się łańcuchem swap, jak przedstawiono tutaj.
- Tworzenie łańcucha wymiany
- Obsługa i zarządzanie łańcuchem wymiany
- Obsługa zmiany rozmiaru okna
- Wybieranie danych wyjściowych i rozmiaru DXGI
- Debugowanie w trybie Full-Screen
- Niszczenie łańcucha wymiany
- Korzystanie z obróconego monitora
- Przełączanie trybów
- Wskazówka dotycząca wydajności pełnego ekranu
- Zagadnienia dotyczące wielu wielowątków
Łańcuch wymiany ma jeden bufor z przodu i co najmniej jeden bufor wsteczny. Każda aplikacja tworzy własny łańcuch zamian. Aby zwiększyć szybkość prezentacji danych na wyjście, łańcuch wymiany jest prawie zawsze tworzony w pamięci podsystemu wyświetlania, który jest pokazany na poniższej ilustracji.
Podsystem wyświetlania (który jest często kartą wideo, ale można zaimplementować na płycie głównej) zawiera procesor GPU, przetwornik cyfrowy do analogowy (DAC) i pamięć. Łańcuch wymiany jest przydzielany w tej pamięci, co umożliwia bardzo szybką prezentację. Podsystem wyświetlania przedstawia dane w buforze czołowym na wyjście.
Łańcuch wymiany jest skonfigurowany do rysowania w trybie pełnoekranowym lub w trybie okna. Eliminuje to konieczność sprawdzania, czy dane wyjściowe są wyświetlane w oknie, czy w trybie pełnoekranowym. Łańcuch wymiany trybu pełnoekranowego może zoptymalizować wydajność, przełączając rozdzielczość ekranu.
Tworzenie łańcucha wymiany
Różnice między Direct3D 9 i Direct3D 10: Direct3D 10 jest pierwszym składnikiem graficznym do używania DXGI. DXGI ma różne zachowania związane z łańcuchem wymiany.
|
Bufory łańcucha wymiany są tworzone w określonym rozmiarze i w określonym formacie. Aplikacja określa te wartości (lub można przejąć rozmiar z okna docelowego) podczas uruchamiania, i następnie opcjonalnie je zmieniać, gdy rozmiar okna zmienia się w odpowiedzi na zdarzenia związane z wejściem od użytkownika lub zdarzenia programowe.
Po utworzeniu łańcucha wymiany zazwyczaj chcesz renderować do niego obrazy. Oto fragment kodu, który konfiguruje kontekst Direct3D do renderowania w łańcuchu wymiany. Ten kod wyodrębnia bufor z łańcucha wymiany, tworzy widok render-target-view z tego buforu, a następnie ustawia go na urządzeniu:
ID3D11Resource * pBB;
ThrowFailure( pSwapChain->GetBuffer(0, __uuidof(pBB),
reinterpret_cast<void**>(&pBB)), "Couldn't get back buffer");
ID3D11RenderTargetView * pView;
ThrowFailure( pD3D11Device->CreateRenderTargetView(pBB, NULL, &pView),
"Couldn't create view" );
pD3D11DeviceContext->OMSetRenderTargets(1, &pView, 0);
Po tym jak aplikacja wyrenderuje ramkę do bufora łańcucha wymiany, wywołaj metodę IDXGISwapChain1::Present1. Następnie aplikacja może renderować następny obraz.
Opieka i karmienie łańcucha wymiany
Po renderowaniu obrazu, wywołaj metodę IDXGISwapChain1::Present1 i kontynuuj renderowanie następnego obrazu. To jest zakres odpowiedzialności.
Jeśli wcześniej wywołałeś IDXGIFactory::MakeWindowAssociation, użytkownik może nacisnąć kombinację klawiszy Alt-Enter, a DXGI przeniesie aplikację między trybem okienkowym a pełnoekranowym. IDXGIFactory::MakeWindowAssociation jest zalecane, ponieważ jest zdecydowanie wymagany standardowy mechanizm sterowania dla użytkownika.
Chociaż nie musisz pisać więcej kodu niż opisano, kilka prostych kroków może sprawić, że aplikacja będzie bardziej elastyczna. Najważniejszą kwestią jest zmiana rozmiaru łańcucha wymiany buforów w odpowiedzi na zmianę rozmiaru okna wyjścia. Oczywiście najlepszym rozwiązaniem dla aplikacji jest odpowiadanie na WM_SIZE i wywołanie IDXGISwapChain::ResizeBuffers, przekazując rozmiar zawarty w parametrach komunikatu. To zachowanie oczywiście sprawia, że aplikacja dobrze reaguje na użytkownika, gdy przeciąga obramowania okna, ale jest to również dokładnie to, co umożliwia płynne przejście pełnoekranowe. Okno otrzyma komunikat WM_SIZE za każdym razem, gdy wystąpi takie przejście, a wywołanie IDXGISwapChain::ResizeBuffers stanowi okazję do ponownego przydzielenia pamięci dla buforów w celu uzyskania optymalnej prezentacji. Dlatego aplikacja musi zwolnić wszelkie odwołania, które ma w istniejących buforach, zanim wywoła IDXGISwapChain::ResizeBuffers.
Nie wywołanie metody IDXGISwapChain::ResizeBuffers w odpowiedzi na przełączenie do trybu pełnoekranowego (najbardziej naturalnie, jako odpowiedź na WM_SIZE) może uniemożliwić optymalizację przerzucania, gdzie DXGI może po prostu zamienić bufor, który jest wyświetlany, zamiast kopiować dane dla całego ekranu.
IDXGISwapChain1::Present1 poinformuje Cię, czy okno danych wyjściowych jest całkowicie zasłonięte za pośrednictwem DXGI_STATUS_OCCLUDED. W takim przypadku zalecamy przejście aplikacji do trybu wstrzymania (przez wywołanie metody IDXGISwapChain1::Present1 z DXGI_PRESENT_TEST), ponieważ zasoby używane do renderowania klatki są marnowane. Korzystanie z DXGI_PRESENT_TEST uniemożliwi prezentowanie żadnych danych podczas przeprowadzania kontroli okluzji. Gdy IDXGISwapChain1::Present1 zwraca S_OK, należy wyjść z trybu wstrzymania; nie używaj kodu zwrotnego, aby przełączyć się do trybu wstrzymania, ponieważ może to spowodować, że łańcuch wymiany nie będzie mógł zrezygnować z trybu pełnoekranowego.
Środowisko uruchomieniowe Direct3D 11.1, które jest dostępne od systemu Windows 8, udostępnia łańcuch wymiany modelu przerzucania (czyli łańcuch wymiany, który ma wartość DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ustawioną w elemencie SwapEffectDXGI_SWAP_CHAIN_DESC lub DXGI_SWAP_CHAIN_DESC1). Podczas prezentowania ramek do wyjścia z łańcuchem zamiany flip-model DXGI odłącza bufor wsteczny ze wszystkich lokalizacji stanu potoku, takich jak docelowy zestaw renderowania połączenia danych wyjściowych, które zapisują w buforze wstecznym 0. Dlatego zalecamy wywołanie elementu ID3D11DeviceContext::OMSetRenderTargets bezpośrednio przed renderowaniem do buforu wstecznego. Na przykład nie należy wywoływać OMSetRenderTargets, a następnie wykonywać zadania w cieniowaniu obliczeniowym, które nie kończą się renderowaniem do zasobu. Aby uzyskać więcej informacji na temat łańcuchów wymiany flip model i ich korzyści, zapoznaj się z DXGI Flip Model.
Uwaga / Notatka
W Direct3D 10 i Direct3D 11 nie trzeba wywoływać IDXGISwapChain::GetBuffer, aby pobrać bufor tylni 0 po wywołaniu IDXGISwapChain1::Present1, ponieważ dla wygody identyfikatory buforów tylnych zmieniają się. Nie dzieje się tak w trybie Direct3D 12, a aplikacja musi ręcznie śledzić indeksy buforu wstecznego.
Obsługa zmiany rozmiaru okna
Do obsługi zmiany rozmiaru okna można użyć metody IDXGISwapChain::ResizeBuffers . Przed wywołaniem ResizeBuffers należy zwolnić wszystkie istniejące odwołania do buforów łańcucha wymiany. Obiekt, który zazwyczaj zawiera odwołanie do buforu łańcucha wymiany, jest widokiem celu renderowania.
Poniższy przykładowy kod pokazuje, jak wywołać metodę ResizeBuffers z programu obsługi WindowProc dla komunikatów WM_SIZE:
case WM_SIZE:
if (g_pSwapChain)
{
g_pd3dDeviceContext->OMSetRenderTargets(0, 0, 0);
// Release all outstanding references to the swap chain's buffers.
g_pRenderTargetView->Release();
HRESULT hr;
// Preserve the existing buffer count and format.
// Automatically choose the width and height to match the client rect for HWNDs.
hr = g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
// Perform error handling here!
// Get buffer and create a render-target-view.
ID3D11Texture2D* pBuffer;
hr = g_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D),
(void**) &pBuffer );
// Perform error handling here!
hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL,
&g_pRenderTargetView);
// Perform error handling here!
pBuffer->Release();
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL );
// Set up the viewport.
D3D11_VIEWPORT vp;
vp.Width = width;
vp.Height = height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDeviceContext->RSSetViewports( 1, &vp );
}
return 1;
Wybieranie wyjścia DXGI i rozmiaru
Domyślnie usługa DXGI wybiera dane wyjściowe zawierające większość obszaru klienta okna. Jest to jedyna opcja dostępna dla DXGI, gdy przechodzi w tryb pełnoekranowy w odpowiedzi na Alt + Enter. Jeśli aplikacja zdecyduje się przejść do trybu pełnoekranowego samodzielnie, może wywołać IDXGISwapChain::SetFullscreenState i przekazać jawny IDXGIOutput1 (lub NULL, jeśli aplikacja pozwala DXGI na podjęcie decyzji).
Aby zmienić rozmiar danych wyjściowych w trybie pełnoekranowym lub w oknie, zalecamy wywołanie parametru IDXGISwapChain::ResizeTarget, ponieważ ta metoda zmienia również rozmiar okna docelowego. Ponieważ rozmiar okna docelowego zostanie zmieniony, system operacyjny wysyła WM_SIZE, a twój kod naturalnie wywoła IDXGISwapChain::ResizeBuffers w odpowiedzi. W związku z tym jest to strata wysiłku, aby zmieniać rozmiar swoich buforów, a potem ponownie zmieniać rozmiar docelowego.
Debugowanie w trybie pełnoekranowym
Łańcuch wymiany DXGI rezygnuje z trybu pełnoekranowego tylko wtedy, gdy jest to absolutnie konieczne. Oznacza to, że można debugować aplikację pełnoekranową przy użyciu wielu monitorów, o ile okno debugowania nie nakłada się na docelowe okno swap chain. Alternatywnie można całkowicie zapobiec przełączaniu trybu, nie ustawiając flagi DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH .
Jeśli przełączanie trybu jest dozwolone, łańcuch wymiany buforów zrezygnuje z trybu pełnoekranowego, gdy jego okno wyjściowe zostanie okludowane przez inne okno. Sprawdzanie okluzji jest wykonywane podczas IDXGISwapChain1::Present1 lub przez oddzielny wątek, którego celem jest sprawdzenie, czy aplikacja stała się niereagująca (i nie wywołuje już IDXGISwapChain1::Present1). Aby wyłączyć zdolność osobnego wątku do powodowania przełączenia, ustaw następujący klucz rejestru na dowolną wartość inną niż zero.
HKCU\Software\Microsoft\DXGI\DisableFullscreenWatchdog
Niszczenie łańcucha wymiany
Nie można zwolnić łańcucha wymiany w trybie pełnoekranowym, ponieważ może to spowodować konflikt wątków (co spowoduje, że DXGI zgłosi wyjątek nie do kontynuowania). Przed zwolnieniem łańcucha wymiany najpierw przełącz się do trybu okiennego (przy użyciu idXGISwapChain::SetFullscreenState( FALSE, NULL )), a następnie wywołaj metodę IUnknown::Release.
Korzystanie z obróconego monitora
Aplikacja nie musi martwić się o orientację monitora. W razie potrzeby usługa DXGI obraca bufor łańcucha wymiany podczas prezentacji. Oczywiście ta dodatkowa rotacja może mieć wpływ na wydajność. Aby uzyskać najlepszą wydajność, zadbaj o rotację w aplikacji, wykonując następujące czynności:
- Użyj DXGI_SWAP_CHAIN_FLAG_NONPREROTATED. Spowoduje to powiadomienie DXGI o tym, że aplikacja utworzy obrócony obraz (na przykład przez zmianę macierzy projekcji). Należy pamiętać, że ta flaga jest prawidłowa tylko w trybie pełnoekranowym.
- Przydziel każdy bufor łańcucha wymiany w obróconym rozmiarze. W razie potrzeby użyj IDXGIOutput::GetDesc, aby pobrać te wartości.
Podczas wykonywania obrotu w aplikacji, DXGI po prostu wykona kopię zamiast kopiowania i obracania.
Środowisko uruchomieniowe Direct3D 11.1, które jest dostępne od systemu Windows 8, udostępnia łańcuch wymiany modelu przerzucania (czyli łańcuch wymiany, który ma wartość DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ustawioną w elemencie swapEffectDXGI_SWAP_CHAIN_DESC1). Aby zmaksymalizować optymalizacje prezentacji dostępne za pomocą łańcucha zamiany modelu flip-model, zalecamy, aby aplikacje zorientowały zawartość tak, aby były zgodne z konkretnymi danymi wyjściowymi, na których znajduje się zawartość, gdy ta zawartość w pełni zajmuje dane wyjściowe. Aby uzyskać więcej informacji na temat łańcuchów wymiany modelu flip i ich korzyści, zobacz DXGI Flip Model.
Tryby przełączania
Łańcuch wymiany DXGI może zmienić tryb wyświetlania dla wyjścia podczas przejścia do trybu pełnoekranowego. Aby włączyć automatyczną zmianę trybu wyświetlania, należy określić DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH w opisie łańcucha wymiany. Jeśli tryb wyświetlania zmieni się automatycznie, DXGI wybierze najbardziej skromny tryb (rozmiar i rozdzielczość nie zmieni się, ale głębokość koloru może). Zmiana rozmiaru buforów łańcucha wymiany nie spowoduje przełączenia trybu. Łańcuch wymiany tworzy niejawną obietnicę, że jeśli wybierzesz bufor tylni, który dokładnie pasuje do trybu wyświetlania obsługiwanego przez docelowy ekran, to przełączy się do tego trybu wyświetlania podczas wprowadzania trybu pełnoekranowego na tym wyjściu. W związku z tym wybierasz tryb wyświetlania, wybierając rozmiar i format buforu wstecznego.
Porada dotycząca wydajności pełnoekranowej
Podczas wywoływania IDXGISwapChain1::Present1 w aplikacji pełnoekranowej łańcuch swap przełącza (w przeciwieństwie do kopiowania bitowego) zawartość buforu tylnego do buforu przedniego. Wymaga to, aby łańcuch wymiany został utworzony przy użyciu wyliczonego trybu wyświetlania (określonego w DXGI_SWAP_CHAIN_DESC1). Jeśli nie można zdefiniować trybów wyświetlania albo błędnie określić tryb wyświetlania w opisie, łańcuch zamiany może wykonać transfer blokowy bitów (bitblt). Bitblt powoduje dodatkowe rozciągnięcie kopii, a także pewne zwiększone użycie pamięci wideo i jest trudne do wykrycia. Aby uniknąć tego problemu, wylicz tryby wyświetlania i zainicjuj poprawnie opis łańcucha wymiany przed utworzeniem łańcucha wymiany. Zapewni to maksymalną wydajność podczas przerzucania w trybie pełnoekranowym i unikanie dodatkowego obciążenia pamięciowego.
Zagadnienia dotyczące wielowątkowości
Jeśli używasz DXGI w aplikacji z wieloma wątkami, należy zachować ostrożność, aby uniknąć zakleszczenia, gdzie dwa różne wątki czekają na siebie nawzajem. Istnieją dwie sytuacje, w których może się to zdarzyć.
- Wątek renderowania nie jest wątkiem pompy komunikatów.
- Wątek wykonujący interfejs API DXGI nie jest tym samym wątkiem, który utworzył okno.
Uważaj, aby nigdy nie pozwalać, by wątek pompy komunikatów czekał na wątek renderowania podczas korzystania z łańcuchów wymiany pełnoekranowej. Na przykład wywołanie IDXGISwapChain1::Present1 (z wątku renderowania) może spowodować oczekiwanie wątku renderowania na wątku pompy komunikatów. W przypadku zmiany trybu ten scenariusz jest możliwy, jeśli Present1 wywołuje ::SetWindowPos() lub ::SetWindowStyle() i jedna z tych metod wywołuje ::SendMessage(). W tym scenariuszu, jeśli wątek pompy komunikatów ma sekcję krytyczną chroniącą go lub jeśli wątek renderowania jest zablokowany, dwa wątki zakleszczą się.
Aby uzyskać więcej informacji na temat używania DXGI z wieloma wątkami, zobacz Multithreading i DXGI.
Odpowiedzi DXGI z biblioteki DLLMain
Ponieważ funkcja DllMain nie może zagwarantować kolejności ładowania i zwalnia bibliotek DLL, zalecamy, aby funkcja DllMain aplikacji nie wywoływać funkcji Direct3D lub DXGI, w tym funkcji lub metod, które tworzą lub zwalniają obiekty. Jeśli funkcja DllMain aplikacji wywołuje określony składnik, ten składnik może wywołać inną bibliotekę DLL, która nie jest obecna w systemie operacyjnym, co powoduje awarię systemu operacyjnego. Direct3D i DXGI mogą ładować zestaw bibliotek DLL, zazwyczaj zestaw sterowników, które różnią się od komputera do komputera. W związku z tym nawet jeśli aplikacja nie ulega awarii na komputerach programistycznych i testowych, gdy jej funkcja DllMain wywołuje funkcje lub metody Direct3D lub DXGI, może ulec awarii, gdy działa na innym komputerze.
Aby zapobiec tworzeniu aplikacji, która może spowodować awarię systemu operacyjnego, usługa DXGI udostępnia następujące odpowiedzi w określonych sytuacjach:
- Jeśli funkcja DllMain aplikacji zwalnia ostatnią referencję do fabryki DXGI, DXGI zgłasza wyjątek.
- Jeśli funkcja DllMain aplikacji tworzy fabrykę DXGI, funkcja DXGI zwraca kod błędu.
Zmiany DXGI 1.1
Dodaliśmy następujące funkcje w wersji DXGI 1.1.
Obsługa udostępnionych powierzchni synchronizowanych
Zsynchronizowane powierzchnie udostępnione dla urządzeń Direct3D 10.1 i Direct3D 11 umożliwiają wydajne udostępnianie powierzchni odczytu i zapisu między wieloma urządzeniami Direct3D (udostępnianie między urządzeniami Direct3D 10 i Direct3D 11 jest możliwe). Zobacz IDXGIKeyedMutex::AcquireSync i IDXGIKeyedMutex::ReleaseSync.
Obsługa wysokich kolorów
Obsługuje format DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM.
IDXGIDevice1::SetMaximumFrameLatency i IDXGIDevice1::GetMaximumFrameLatency
IDXGIFactory1::EnumAdapters1 wylicza karty lokalne bez podłączonych monitorów lub danych wyjściowych, a także kart z dołączonymi danymi wyjściowymi. Pierwszy zwrócony adapter będzie lokalnym adapterem, na którym wyświetlany jest główny pulpit.
Obsługa formatu BGRA
DXGI_FORMAT_B8G8R8A8_UNORM i DXGI_FORMAT_B8G8R8A8_UNORM_SRGB zobacz IDXGISurface1::GetDC i IDXGISurface1::ReleaseDC.
Zmiany DXGI 1.2
Dodaliśmy następujące funkcje w wersji DXGI 1.2.
- Łańcuch wymiany stereo
- Łańcuch wymiany w modelu flip
- Zoptymalizowana prezentacja (przewijanie, brudne prostokąty i rotacja)
- Ulepszone zasoby udostępnione i synchronizacja
- Duplikowanie pulpitu
- Zoptymalizowane wykorzystanie pamięci wideo
- Obsługa formatów 16 bitów na piksel (bpp) (DXGI_FORMAT_B5G6R5_UNORM, DXGI_FORMAT_B5G5R5A1_UNORM, DXGI_FORMAT_B4G4R4A4_UNORM)
- Debugowanie interfejsów API
Aby uzyskać więcej informacji na temat DXGI 1.2, zobacz Ulepszenia DXGI 1.2.
Zgodność aplikacji
Usługa DXGI może stosować modyfikacje zachowania aplikacji w celu zwiększenia zgodności aplikacji.
- Ustawienia zgodności mogą być przechowywane w rejestrze użytkowników w obszarze
HKCU\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers. - Ustawienia zgodności mogą lub nie mogą być stosowane w zależności od konfiguracji systemu lub innych czynników.
- Przykładowa wartość ustawienia zgodności aplikacji to
DXAllowModeChangeOnLaunch720.