Not
Å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.
Kloning av en effekt skapar en andra, nästan identisk kopia av effekten. Se följande enkla kvalificerare för en förklaring av varför det inte är exakt. En andra kopia av en effekt är användbar när man vill använda effektramverket på flera trådar, eftersom effekten runtime inte är trådsäker för att upprätthålla höga prestanda.
Eftersom enhetskontexter även är icke-trådsäkra bör olika trådar skicka olika enhetskontexter till ID3DX11EffectPass::Apply-metoden.
En effekt kan klonas med följande syntax:
ID3DX11Effect* pClonedEffect = NULL;
UINT Flags = D3DX11_EFFECT_CLONE_FORCE_NONSINGLE;
HRESULT hr = pEffect->CloneEffect( Flags, &pClonedEffect );
I exemplet ovan kapslar den klonade kopian in samma tillstånd som den ursprungliga effekten, oavsett vilket tillstånd den ursprungliga effekten är i. I synnerhet:
- Om pEffect är optimerat optimeras pCloned-effekten
- Om pEffect har vissa användarhanterade variabler har pCloned Effect samma användarhanterade variabler (se den enda beskrivningen nedan)
- Väntande variabeluppdateringar (tills ett metodanrop för användning uppdaterar enhetstillståndet) i pEffect kommer även att vara överförda till pClonedEffect.
Följande Direct3D 11-enhetsobjekt är oföränderliga eller uppdateras aldrig av effektramverket, så den klonade effekten pekar på samma objekt som den ursprungliga effekten:
- Tillståndsblocksobjekt (ID3D11BlendState, ID3D11RasterizerState, ID3D11DepthStencilState, ID3D11SamplerState)
- Shaders
- Klassinstanser
- Texturer (exklusive texturbuffertar)
- Osorterade åtkomstvyer
Följande Direct3D 11-enhetsobjekt är både oföränderliga och ändrade av effektkörningen (såvida inte användarhanterade eller enkla i en klonad effekt); nya kopior av dessa objekt skapas när de inte är enkla:
- Konstanta buffertar
- Strukturbuffert
Enkla konstanta buffertar och strukturbuffertar
Observera att den här diskussionen gäller både konstanta buffertar och texturer, men konstanta buffertar antas för enkel läsning.
Det kan finnas fall där en konstant buffert endast uppdateras av en tråd, men enhetens tillstånd som fastställs av klonade effekter använder dessa data. Huvudeffekten kan till exempel uppdatera världen och visa matriser som refereras från skuggningar i klonade effekter som inte ändrar världen och visar matriser. I dessa fall måste de klonade effekterna referera till den aktuella konstantbufferten i stället för att återskapa en.
Det finns två sätt att uppnå detta önskade resultat:
- Använd ID3DX11EffectConstantBuffer::SetConstantBuffer på den klonade effekten för att göra den användarhanterad
- Markera konstantbufferten som "enkel" i HLSL-koden, vilket tvingar effekttiden att behandla den som användarhanterad efter kloning.
Det finns två skillnader mellan de två metoderna ovan. I metod 1 skapas först en ny ID3D11Buffer och användaren innan SetConstantBuffer anropas. Efter att ha anropat UndoSetConstantBuffer i den klonade effekten pekar variabeln i metod 1 på den nyligen skapade bufferten (som kommer att uppdateras på Apply) medan variabeln i metod 2 fortsätter att peka på den ursprungliga bufferten (uppdaterar den inte på Apply).
Se följande exempel i HLSL:
cbuffer ObjectData
{
float4 Position;
};
single cbuffer ViewData
{
float4x4 ViewMatrix;
};
Vid kloning skapar den klonade effekten en ny ID3D11Buffer för ObjectData och fyller dess innehåll vid användning av Apply, men refererar till ursprungs-ID3D11Buffern för ViewData. Den enda kvalificeraren kan ignoreras i kloningsprocessen genom att ange flaggan D3DX11_EFFECT_CLONE_FORCE_NONSINGLE.
Relaterade ämnen