Bundle 3311 Visite) DirectX 12
I bundle sono un primo ed importante modo per ottimizzare il rendering in Direct3D12.
Un bundle può essere considerato una command list che una volta creata e popolata rimane così com'è per molto tempo, potenzialmente per l'intera durata dell'applicazione.
Il suo utilizzo è pressoché identico a quello di una normale lista.
CommandAllocator bundleAllocator = device.CreateCommandAllocator(CommandListType.Bundle);
E si popola allo stesso modo
GraphicsCommandList bundle = device.CreateCommandList(0, CommandListType.Bundle, bundleAllocator, pipelineState); bundle.SetGraphicsRootSignature(rootSignature);
bundle.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;
bundle.SetVertexBuffer(0, vertexBufferView);
bundle.DrawInstanced(3, 1, 0, 0);
bundle.Close();
Ora che é pronta potete usarla in fase di popolamento del vostra command list principale
commandList.ExecuteBundle(bundle);
Come vedete l'utilizzo del bundle é molto semplice ma nel momento in cui lo inserirete nel vostro ciclo di rendering inizierete a capire la complessità del suo utilizzo.
Un bundle velocizza in maniera estrema i vostri programmi perché vi trovate molte istruzioni registrate che potrete lanciare con un solo comando limitando al massimo la comunicazione tra CPU e GPU.
Tuttavia un bundle é meno flessibile rispetto a popolare la command list ad ogni frame.
Dovrete valutare la dimensione dei bundle caso per caso preferendo bundle di piccole dimensioni quando vi serve cambiare sempre le istruzioni e maggiori per parti stabili della scena o che comunque potete non aggiornare ogni frame.
Considerando che un bundle può comunque lanciare altri bundle; un possibile approccio potrebbe essere quello di creare un bundle per ogni oggetto contenente tutte le istruzioni di rendering (inserimento texture, costant buffer, draw) ed utilizzare un bundle per mandarli tutti in un solo colpo.
Vi rimando al tutorial HelloBundle presente sul mio repository.