Dela via


Introduktion till multitrådning i Direct3D 11

Multitrådning är utformat för att förbättra prestanda genom att utföra arbete med hjälp av en eller flera trådar samtidigt.

Tidigare har detta ofta gjorts genom att generera en enda huvudtråd för rendering och en eller flera trådar för förberedelsearbete som att skapa objekt, läsa in, bearbeta och så vidare. Men med den inbyggda synkroniseringen i Direct3D 11 är målet bakom multitrådning att använda varje CPU- och GPU-cykel utan att göra en processor vänta på en annan processor (särskilt inte att GPU väntar eftersom det direkt påverkar bildhastigheten). Genom att göra det kan du generera mest arbete samtidigt som du behåller den bästa bildfrekvensen. Begreppet en enda ram för återgivning är inte längre nödvändigt eftersom API:et implementerar synkronisering.

Multitrådning kräver någon form av synkronisering. Om till exempel flera trådar som körs i ett program måste komma åt en enda enhetskontext (ID3D11DeviceContext) måste programmet använda någon synkroniseringsmekanism, till exempel kritiska avsnitt, för att synkronisera åtkomsten till enhetskontexten. Det beror på att bearbetningen av återgivningskommandona (vanligtvis utförs på GPU:n) och genererar återgivningskommandona (vanligtvis görs på processorn genom att skapa objekt, datainläsning, tillståndsväxling, databearbetning) ofta använder samma resurser (texturer, skuggningar, pipelinetillstånd och så vidare). Att organisera arbetet i flera trådar kräver synkronisering för att förhindra att en tråd ändrar eller läser data som ändras av en annan tråd.

Även om användningen av en enhetskontext (ID3D11DeviceContext) inte är trådsäker, är användningen av en Direct3D 11-enhet (ID3D11Enhet) trådsäker. Eftersom varje ID3D11DeviceContext är enkeltrådad, kan bara en enda tråd anropa en ID3D11DeviceContext i taget. Om flera trådar måste komma åt en enda ID3D11DeviceContextmåste de använda någon synkroniseringsmekanism, till exempel kritiska sektioner, för att synkronisera åtkomsten till den ID3D11DeviceContext. Flera trådar krävs dock inte för att använda kritiska avsnitt eller synkroniseringsprimitiver för att få åtkomst till en enda ID3D11Enhet. Om ett program använder ID3D11Enhet för att skapa resursobjekt, krävs det därför inte att programmet använder synkronisering för att skapa flera resursobjekt samtidigt.

Stöd för multitrådning delar upp API:et i två olika funktionella områden:

Multitrådningsprestanda beror på drivrutinsstödet. How To: Kontrollera drivrutinsstöd innehåller mer information om hur du kontrollerar drivrutinsstöd och vad resultaten innebär.

Direct3D 11 har utformats från grunden för att stödja multitrådning. Direct3D 10 implementerar begränsat stöd för multitrådning med hjälp av trådsäkert lager. Den här sidan listar beteendeskillnaderna mellan de två versionerna av DirectX: Trådhanteringsskillnader mellan Direct3D-versioner.

Multitrådning och DXGI

Endast en tråd i taget ska använda den omedelbara kontexten. Programmet bör dock också använda samma tråd för Microsoft DirectX Graphics Infrastructure (DXGI)-åtgärder, särskilt när programmet anropar metoden IDXGISwapChain::Present.

Not

Det är ogiltigt att använda en omedelbar kontext samtidigt med de flesta DXGI-gränssnittsfunktionerna. För DirectX-SDK:er för mars 2009 och senare är de enda DXGI-funktionerna som är säkra AddRef, Releaseoch QueryInterface.

 

Mer information om hur du använder DXGI med flera trådar finns i Multithread Considerations.

multitrådning