Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Växlingskedjor styr den bakre buffertrotationen och utgör grunden för grafikanimering.
Överblick
Programmeringsmodellen för växlingskedjor i Direct3D 12 är inte identisk med den i tidigare versioner av D3D. Programmerings bekvämligheten med att till exempel stödja automatisk resursrotation som fanns i D3D10 och D3D11 stöds inte längre. Automatisk resursrotation gjorde det möjligt för appar att rendera samma API-objekt samtidigt som den faktiska yta som renderas ändras för varje bildruta. Beteendet för växlingskedjor ändras med Direct3D 12 för att göra det möjligt för andra funktioner i Direct3D 12 att ha låg CPU-belastning. Automatisk chroma key och multisampling stöds inte, även om särskilt skalning och rotation fortfarande stöds.
Buffertlivslängd
Appar kan lagra förskapade deskriptorer som refererar till backbuffertar. Detta aktiveras genom att säkerställa att den uppsättning buffertar som ägs av en växlingskedja aldrig ändras under växlingskedjans livslängd. Den uppsättning buffertar som returneras av IDXGISwapChain::GetBuffer ändras inte förrän vissa API:er anropas:
Ordningen på buffertar som returneras av GetBuffer ändras aldrig.
IDXGISwapChain3::GetCurrentBackBufferIndex returnerar indexet för den aktuella serverbufferten till appen.
Växlingseffekter
De enda växlingseffekter som stöds är DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL och DXGI_SWAP_EFFECT_FLIP_DISCARD, vilket kräver att buffertantalet är större än en.
Tip
För spel som syftar till lägsta möjliga indatafördröjning, skapa swap chain med DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING och anropa sedan Present(0, DXGI_PRESENT_ALLOW_TEARING). Detta kringgår compositorns vsync och ger den lägsta latensen från bildpresentering till visning. Vid körningstillfället kontrollerar du att tearing stöds genom att anropa IDXGIFactory5::CheckFeatureSupport med DXGI_FEATURE_PRESENT_ALLOW_TEARING innan du använder den här kodvägen.
Varning
En vanlig bugg i bildtaktsstyrningen är att anropa Present(1, 0) (vsync-on) utan att på rätt sätt synkronisera CPU-arbetet med GPU-synkroniseringspunkten. Detta gör att processorn körs framåt och skapar en ramkö som ökar svarstiden för indata. Använd alltid ett ramantalsstängsel för att begränsa CPU-ramar under flygning (vanligtvis till buffertantalet minus ett).
Övergång mellan fönster- och helskärmslägen
Direct3D 12 stöder inte helskärms exklusivt läge (FSE). I stället, när ett spel är det enda synliga programmet på skärmen, använder operativsystemet en strategi som kallas helskärmsoptimeringar (FSO) för att uppnå en liknande effekt som FSE utan prestanda nackdelar. Mer information om FSO finns i Avmystifiera helskärmsoptimeringar.
Direct3D 12 behåller begränsningen att program måste anropa ResizeBuffers efter att ha växlat mellan fönsterläge och helskärmsläge (D3D11-växlingskedjor av flip-modell har samma begränsning).
Övergångarna för IDXGISwapChain::SetFullscreenState ändrar inte uppsättningen av appsynliga buffertar i växlingskedjan. Det är endast ResizeBuffers- och ResizeTarget-anropen som skapar eller förstör buffertar som är synliga för appen. Men i Direct3D 12 IDXGISwapChain::SetFullscreenState inte går in i helskärms exklusivt läge och ändrar helt enkelt upplösningar och uppdateringsfrekvenser för att tillåta helskärmsoptimeringar. Dessa ändringar kan göras av en app utan att den här metoden används
När IDXGISwapChain::Present eller IDXGISwapChain1::Present anropas måste den bakre bufferten som ska presenteras vara i tillståndet D3D12_RESOURCE_STATE_PRESENT. Present returnerar DXGI_ERROR_INVALID_CALL om detta inte är fallet.
Växlingskedjor i helskärmsläge fortsätter att ha begränsningen att SetFullscreenState(FALSE, NULL) måste anropas innan den slutliga versionen av växlingskedjan släpps. SetFullscreenState(FALSE) fungerar för swap chains på Direct3D 12-enheter.
Nuvarande åtgärder utförs i 3D-kön som tillhandahålls när växlingskedjan skapas, och appar kan samtidigt presentera flera växlingskedjor och registrera och köra kommandolistor.
När den sista delen av grafikarbetet (till exempel efterbearbetning av bildruta) görs i en beräkningskö, eller inte involverar enhetens grafikkö, kan det vara fördelaktigt att skapa en andra 3D-kö att presentera på och förhindra fördröjningen av presentationen som fördröjer starten av nästa bildruta.
Exempel
Följande exempelkod finns i huvudåtergivningsloopen:
Varning
Exemplet nedan förenklas för tydlighetens skull. En produktionsspelsloop bör frikoppla simuleringsuppdateringar från återgivningsfrekvensen, till exempel genom att använda ett fast tidssteg för simulering medan återgivningen går så snabbt som möjligt, och använda ett staket för att begränsa bildrutor under flygning. Utan begränsning av frame-flight kan Present lyckas omedelbart på växlingskedjor för flip-model, vilket gör att processorn kan köa bildrutor obundet och blåsa upp svarstid för indata.
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Skapa växlingskedjor
När du använder CreateSwapChainForHwnd, CreateSwapChainForCoreWindoweller CreateSwapChainForComposition-anrop, bör du tänka på att parametern pDevice faktiskt kräver en pekare till en direkt kommandokö i Direct3D 12 och inte en enhet.
Presentationer i Windows 7
När du har Direct3D 12 som målplattform på Windows 7 finns inte de nödvändiga DXGI-typerna för Direct3D 12, så du måste använda det D3D12On7-tillhandahållna ID3D12CommandQueueDownLevel (hämtas från den direkta kommandokön) för presentation.
Du anger en öppen kommandolista för den nuvarande Windows 7-metoden, som sedan kommer att användas, stängas och skickas automatiskt till enheten åt dig. Du måste tillhandahålla en bakre buffert som har skapats av appen, är en allokerad resurs, är enkelsamplad och har något av följande format.
- 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