Een effect klonen
Als u een effect kloont, wordt er een tweede, bijna identieke kopie van het effect gemaakt. Zie de volgende enkele kwalificatie voor een uitleg van waarom het niet precies is. Een tweede kopie van een effect is handig wanneer men het effectenframework op meerdere threads wil gebruiken, omdat de effectruntime niet thread veilig is om hoge prestaties te behouden.
Omdat apparaatcontexten ook niet thread-veilig zijn, moeten verschillende threads verschillende apparaatcontexten doorgeven aan de methode ID3DX11EffectPass::Apply.
Een effect kan worden gekloond met de volgende syntaxis:
ID3DX11Effect* pClonedEffect = NULL;
UINT Flags = D3DX11_EFFECT_CLONE_FORCE_NONSINGLE;
HRESULT hr = pEffect->CloneEffect( Flags, &pClonedEffect );
In het bovenstaande voorbeeld bevat de gekloonde kopie dezelfde status als het oorspronkelijke effect, ongeacht in welke staat het oorspronkelijke effect zich bevindt. In het bijzonder:
- Als pEffect is geoptimaliseerd, wordt het pCloned-effect geoptimaliseerd
- Als pEffect enkele door de gebruiker beheerde variabelen heeft, heeft pCloned Effect dezelfde door de gebruiker beheerde variabelen (zie de enkele beschrijving hieronder)
- Eventuele variabele updates die in behandeling zijn (totdat een Toepassen-oproep de apparaatstatus bijwerkt) in pEffect zullen in behandeling zijn in pClonedEffect.
De volgende Direct3D 11-apparaatobjecten zijn onveranderbaar of nooit bijgewerkt door het effectenframework, zodat het gekloonde effect verwijst naar dezelfde objecten als het oorspronkelijke effect:
- Statusblokobjecten (ID3D11BlendState, ID3D11RasterizerState, ID3D11DepthStencilState, ID3D11SamplerState)
- Shaders
- Klasse-instanties
- Texturen (niet inclusief texturebuffers)
- Niet-geordende toegangsweergaven
De volgende Direct3D 11-apparaatobjecten zijn zowel onveranderbaar als gewijzigd door de effectruntime (tenzij door de gebruiker beheerd of enkelvoudig in een gekloond effect); nieuwe kopieën van deze objecten worden gemaakt wanneer er geen enkele objecten zijn:
- Constante buffers
- Textuur Buffers
Enkele constante bufferen en textuur bufferen
Houd er rekening mee dat deze discussie van toepassing is op zowel constante buffers als patronen, maar constante buffers worden verondersteld om het lezen te vereenvoudigen.
Er kunnen gevallen zijn waarbij een constante buffer slechts door één thread wordt bijgewerkt, maar de apparaatstatus die is ingesteld door gekloonde effecten, gebruikt deze gegevens. Het belangrijkste effect kan bijvoorbeeld de wereld- en weergavematrices bijwerken waarnaar wordt verwezen vanuit shaders in gekloonde effecten die de wereld- en weergavematrices niet veranderen. In deze gevallen moeten de gekloonde effecten verwijzen naar de huidige constante buffer in plaats van er een opnieuw te maken.
Er zijn twee manieren om dit gewenste resultaat te bereiken:
- Gebruik ID3DX11EffectConstantBuffer::SetConstantBuffer op het gekloonde effect om het door de gebruiker beheerd te maken.
- Markeer de constante buffer als "single" in de HLSL-code, zodat het effectruntime wordt gedwongen om deze na het klonen te beschouwen als door de gebruiker beheerd.
Er zijn twee verschillen tussen de twee bovenstaande methoden. Eerst wordt in methode 1 een nieuwe ID3D11Buffer gemaakt en gebruiker voordat SetConstantBuffer wordt aangeroepen. Na het aanroepen van UndoSetConstantBuffer in het gekloonde effect wijst de variabele in methode 1 naar de zojuist gemaakte buffer (welke effecten worden bijgewerkt op Toepassen), terwijl de variabele in methode 2 blijft verwijzen naar de oorspronkelijke buffer (niet bijwerken op Toepassen).
Zie het volgende voorbeeld in HLSL:
cbuffer ObjectData
{
float4 Position;
};
single cbuffer ViewData
{
float4x4 ViewMatrix;
};
Tijdens het klonen wordt met het gekloonde effect een nieuwe ID3D11Buffer voor ObjectData gemaakt en wordt de inhoud ervan ingevuld op Toepassen, maar wordt verwezen naar de oorspronkelijke ID3D11Buffer voor ViewData. De enkele kwalificator kan worden genegeerd in het cloningsproces door de D3DX11_EFFECT_CLONE_FORCE_NONSINGLE-vlag in te stellen.
Verwante onderwerpen