Oppervlakken wisselen (Direct3D 9)
Een Direct3D-toepassing geeft doorgaans een animatiereeks weer door de frames van de animatie in backbuffers te genereren en deze op volgorde te presenteren. Back-buffers worden ingedeeld in swapketens. Een swapketen is een reeks buffers die na elkaar op het scherm wisselen. Dit kan worden gebruikt om één scène in het geheugen weer te geven en de scène vervolgens naar het scherm te spiegelen wanneer de weergave is voltooid. Dit voorkomt het fenomeen dat bekend staat als scheuren en maakt vloeiendere animatie mogelijk.
Elk apparaat dat in Direct3D is gemaakt, heeft ten minste één wisselketen. Wanneer u het eerste Direct3D-apparaat initialiseert, stelt u de parameter BackBufferCount van D3DPRESENT_PARAMETERSin, waarmee Direct3D het aantal backbuffers aangeeft dat zich in de swap chain bevindt. De aanroep naar IDirect3D9::CreateDevice maakt vervolgens het Direct3D-apparaat en de bijbehorende wisselketen.
Wanneer u IDirect3DDevice9::Present gebruikt om een surface flip-bewerking aan te vragen, worden de aanwijzers voor de front buffer en backbuffers verwisseld. Flipping wordt uitgevoerd door te wisselen van aanwijzers die door het beeldapparaat worden gebruikt voor het verwijzen naar geheugen, niet door het kopiëren van surface memory. Wanneer een spiegelingsketen een voorbuffer en meer dan één achterbuffer bevat, worden de aanwijzers in een cirkelvormig patroon omgeschakeld, zoals wordt weergegeven in het volgende diagram.
U kunt wisselketens voor een apparaat toevoegen door IDirect3DDevice9::CreateAdditionalSwapChainaan te roepen. Een toepassing kan per weergave één wisselketen maken en elke wisselketen koppelen aan een bepaald venster. De toepassing geeft afbeeldingen weer in de backbuffers van elke wisselketen en presenteert deze vervolgens afzonderlijk. De twee parameters die IDirect3DDevice9::CreateAdditionalSwapChain gebruikt, zijn een aanwijzer naar een D3DPRESENT_PARAMETERS structuur en het adres van een aanwijzer naar een IDirect3DSwapChain9 interface. U kunt vervolgens IDirect3DSwapChain9::Present gebruiken om de inhoud van de volgende achterbuffer weer te geven op de voorbuffer. Houd er rekening mee dat een apparaat slechts één swapketen op volledig scherm kan hebben.
U kunt toegang krijgen tot een specifieke backbuffer door de methoden IDirect3DDevice9::GetBackBuffer of IDirect3DSwapChain9::GetBackBuffer--methoden aan te roepen, waarmee een aanwijzer wordt geretourneerd naar een IDirect3DSurface9 interface die het geretourneerde achterbufferoppervlak vertegenwoordigt. Houd er rekening mee dat het aanroepen van deze methode het aantal interne verwijzingen op de IDirect3DDevice9 interface verhoogt, dus zorg ervoor dat u IUnknown- aanroept wanneer u klaar bent met dit oppervlak of als u een geheugenlek hebt.
Houd er rekening mee dat Direct3D oppervlakken omwisselt door de surface memory pointers binnen de swapchain te wisselen, niet door de oppervlakken zelf om te wisselen. Dit betekent dat u altijd naar de achtergrondbuffer renderen die vervolgens wordt weergegeven.
Het is belangrijk om het onderscheid te noteren tussen een 'flipping-bewerking', zoals uitgevoerd door een beeldschermadapterstuurprogramma en een bewerking 'Presenteren' toegepast op een wisselketen die is gemaakt met D3DSWAPEFFECT_FLIP.
De term 'flippen' duidt op een bewerking die het bereik van videogeheugenadressen wijzigt die een beeldschermadapter gebruikt om het uitgangssignaal te genereren, waardoor de inhoud van een eerder verborgen achterbuffer wordt weergegeven. In Direct3D 9 wordt de term vaak meer algemeen gebruikt om de presentatie van een backbuffer in elke wisselketen te beschrijven die is gemaakt met het D3DSWAPEFFECT_FLIP wisseleffect.
Hoewel dergelijke 'Presenteren'-bewerkingen bijna altijd worden geïmplementeerd door flip-bewerkingen wanneer de swapketen in volledig scherm is, worden ze noodzakelijkerwijs geïmplementeerd door kopieerbewerkingen wanneer de swapketen in venstermodus is. Bovendien kan een beeldschermadapterstuurprogramma gebruikmaken van flipping om Present-bewerkingen te implementeren tegen fullscreen swap chains op basis van de D3DSWAPEFFECT_DISCARD en D3DSWAPEFFECT_COPY.
De bovenstaande discussie is van toepassing op het veelvoorkomende geval van een volledig scherm wisselketen die met D3DSWAPEFFECT_FLIP is gemaakt.
Zie D3DSWAPEFFECTvoor een algemenere bespreking van de verschillende wisseleffecten voor zowel venster- als volledige schermwisselingsketens.
Verwante onderwerpen