Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Swapchains regelen de rotatie van de backbuffer en vormen de basis van grafische animaties.
Overzicht
Het programmeermodel voor wisselketens in Direct3D 12 is niet identiek aan dat in eerdere versies van D3D. Het programmeergemak, bijvoorbeeld voor het ondersteunen van automatische resourcerotatie die aanwezig was in D3D10 en D3D11, wordt niet meer ondersteund. Automatische resource-rotatie stelde apps in staat om hetzelfde API-object weer te geven, terwijl het daadwerkelijk weergegeven oppervlak per frame verandert. Het gedrag van wisselketens wordt gewijzigd met Direct3D 12 om andere functies van Direct3D 12 in staat te stellen lage CPU-overhead te hebben. Automatische kleursleutel en multisampling worden niet ondersteund, hoewel met name uitrekken en roteren nog steeds wel worden ondersteund.
Bufferlevensduur
Apps mogen vooraf gemaakte descriptors opslaan die verwijzen naar backbuffers. Dit wordt mogelijk gemaakt door ervoor te zorgen dat de bufferset die eigendom is van een swapketen gedurende de gehele levensduur van de swapketen nooit verandert. De verzameling buffers die worden geretourneerd door IDXGISwapChain::GetBuffer verandert niet totdat bepaalde API's worden aangeroepen:
De volgorde van de buffers die door GetBuffer worden geretourneerd, verandert nooit.
IDXGISwapChain3::GetCurrentBackBufferIndex retourneert de index van de huidige backbuffer naar de app.
Wisseleffecten
De enige ondersteunde wisseleffecten zijn DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL en DXGI_SWAP_EFFECT_FLIP_DISCARD, waarvoor het aantal buffers groter moet zijn dan één.
Tip
Voor games met minimale invoervertraging als doel maakt u de swap chain met DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING en roept u vervolgens Present(0, DXGI_PRESENT_ALLOW_TEARING) aan. Hierdoor wordt de vsync van de compositor omzeild en is de latentie tussen presenteren en weergeven zo laag mogelijk. Controleer tijdens de runtime de ondersteuning voor tearing door IDXGIFactory5::CheckFeatureSupport met DXGI_FEATURE_PRESENT_ALLOW_TEARING aan te roepen voordat u dit codepad gebruikt.
Warning
Een veelvoorkomende frame-pacingfout is het aanroepen Present(1, 0) (vsync-on) zonder cpu-werk goed te synchroniseren met de GPU-omheining. Dit zorgt ervoor dat de CPU vooruitloopt, waarbij een framewachtrij wordt opgebouwd die de invoerlatentie verhoogt. Gebruik altijd een frametelling om CPU-frames tijdens de vlucht te beperken (meestal tot het aantal buffers min één).
Schakelen tussen venstermodus en modus voor volledig scherm
Direct3D 12 biedt geen ondersteuning voor volledig scherm exclusieve modus (FSE). In plaats daarvan, wanneer een game de enige zichtbare toepassing op het scherm is, gebruikt het besturingssysteem een strategie genaamd optimalisaties op volledig scherm (FSO) om een vergelijkbaar effect te bereiken als FSE zonder de prestatienadelen. Zie Demystifying Fullscreen Optimizationsvoor meer informatie over FSO.
Direct3D 12 handhaaft de beperking dat toepassingen ResizeBuffers moeten aanroepen na het schakelen tussen de venster- en volledigeschermmodus (D3D11-flip-model-swap chains hebben dezelfde beperking).
De IDXGISwapChain::SetFullscreenState-overgangen veranderen niets aan de set voor de app zichtbare buffers in de swap chain. Alleen de ResizeBuffers en ResizeTarget aanroepen maken of vernietigen app-zichtbare buffers. In Direct3D 12 wordt met IDXGISwapChain::SetFullscreenState echter niet de exclusieve modus voor volledig scherm geactiveerd; in plaats daarvan worden alleen resoluties en vernieuwingsfrequenties gewijzigd om optimalisaties voor volledig scherm mogelijk te maken. Deze wijzigingen kunnen worden aangebracht door een app zonder gebruik te maken van deze methode
Wanneer IDXGISwapChain::Present of IDXGISwapChain1::Present wordt aangeroepen, moet de te presenteren achterbuffer de toestand D3D12_RESOURCE_STATE_PRESENT hebben. Present mislukt met de foutcode DXGI_ERROR_INVALID_CALL als dit niet het geval is.
Swap chains op volledig scherm blijven onderhevig aan de beperking dat SetFullscreenState(FALSE, NULL) moet worden uitgevoerd voordat de swap chain definitief wordt vrijgegeven. SetFullscreenState(FALSE) werkt op swapchains die worden uitgevoerd op Direct3D 12-apparaten.
De huidige bewerkingen worden uitgevoerd in de 3D-wachtrij die is opgegeven bij het maken van de wisselketen en apps kunnen gelijktijdig meerdere wisselketens presenteren, en opdrachtenlijsten vastleggen en uitvoeren.
Wanneer het laatste deel van het grafische werk (bijvoorbeeld frame postprocessing) wordt uitgevoerd in een rekenwachtrij of niet de grafische wachtrij van het apparaat, kan het maken van een tweede 3D-wachtrij nuttig zijn en voorkomen dat de latentie van de presentatie het begin van het volgende frame vertraagt.
Voorbeeld
De volgende voorbeeldcode zou aanwezig zijn in de hoofdrenderingslus:
Warning
Het onderstaande voorbeeld is voor duidelijkheid vereenvoudigd. Een game loop voor productiegebruik moet updates van de simulatie loskoppelen van de renderfrequentie, bijvoorbeeld door een vaste tijdstap voor de simulatie te gebruiken terwijl er zo snel mogelijk wordt gerenderd, en een fence te gebruiken om het aantal frames in flight te beperken. Zonder frame-flight-beperking kan Present op flip-model-swapchains onmiddellijk slagen, waardoor de CPU frames onbeperkt in de wachtrij kan plaatsen en de invoerlatentie kan verhogen.
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Swap chains maken
Wanneer u de CreateSwapChainForHwnd, CreateSwapChainForCoreWindowof CreateSwapChainForComposition aanroepen gebruikt, moet de parameter pDevice eigenlijk een aanwijzer naar een directe opdrachtwachtrij in Direct3D 12 en geen apparaat vereisen.
Presenteren in Windows 7
Bij gebruik van Direct3D 12 op Windows 7 zijn de vereiste DXGI-typen voor Direct3D 12 niet beschikbaar, dus moet u de door D3D12On7 geleverde ID3D12CommandQueueDownLevel (opgevraagd via de directe opdrachtwachtrij) gebruiken om weer te geven.
U geeft een open opdrachtlijst op voor de huidige Windows 7-methode, die vervolgens wordt gebruikt, gesloten en automatisch voor u naar het apparaat wordt verzonden. U moet een backbuffer opgeven die door de app is gemaakt, een gecommitteerde resource is, enkelvoudig gesampled is en een van de volgende formaten heeft.
- 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