Panoramica delle risorse
Una risorsa Direct2D è un oggetto utilizzato per il disegno ed è rappresentato da un'interfaccia Direct2D, ad esempio ID2D1Geometry o ID2D1RenderTarget. Questo argomento descrive i tipi di risorse Direct2D e come possono essere condivisi.
Questo argomento contiene le sezioni seguenti:
- Informazioni sulle risorse Direct2D
- Device-Independent risorse
- Device-Dependent risorse
- Condivisione delle risorse di fabbrica
-
condivisione delle risorse di destinazione di rendering
- Destinazioni di rendering hardware
- destinazioni di rendering della superficie DXGI
- Destinazioni di Rendering Compatibili e Bitmap Condivise
Informazioni sulle risorse Direct2D
Molte API 2D con accelerazione hardware sono progettate in base a un modello di risorse incentrato sulla CPU e un set di operazioni di rendering che funzionano bene sulle CPU. Alcune parti dell'API sono accelerate dall'hardware. L'implementazione di queste API richiede un resource manager per il mapping delle risorse della CPU alle risorse nella GPU. A causa delle limitazioni della GPU, alcune operazioni potrebbero non essere in grado di essere accelerate in ogni circostanza. In questi casi, il Resource Manager deve comunicare reciprocamente tra la CPU e la GPU (che è costoso) in modo che possa passare al rendering sulla CPU. In alcuni casi, potrebbe imprevedibilmente forzare il rendering a ricadere completamente sulla CPU. Inoltre, le operazioni di rendering che appaiono semplici potrebbero richiedere passaggi temporanei di rendering intermedi che non sono esposti nell'API e che richiedono risorse GPU aggiuntive.
Direct2D offre un mapping più diretto per l'uso completo della GPU. Fornisce due categorie di risorse: indipendente dal dispositivo e dipendente dal dispositivo.
- Le risorse indipendenti dal dispositivo, ad esempio ID2D1Geometry, vengono mantenute nella CPU.
- Risorse dipendenti dal dispositivo, ad esempio ID2D1RenderTarget e ID2D1LinearGradientBrush, eseguono direttamente il mapping alle risorse sulla GPU (quando è disponibile l'accelerazione hardware). Le chiamate di rendering vengono eseguite combinando le informazioni sui vertici e sulla copertura da una geometria con le informazioni di texturing prodotte dalle risorse dipendenti dal dispositivo.
Quando si creano risorse dipendenti dal dispositivo, le risorse di sistema (GPU, se disponibile o CPU) vengono allocate quando il dispositivo viene creato e non cambiano da un'operazione di rendering a un'altra. Questa situazione elimina la necessità di un resource manager. Oltre ai miglioramenti generali delle prestazioni forniti dall'eliminazione di un gestore risorse, questo modello consente di controllare direttamente qualsiasi rendering intermedio.
Poiché Direct2D fornisce così tanto controllo sulle risorse, è necessario comprendere i diversi tipi di risorse e quando possono essere usati insieme.
Device-Independent Risorse
Come descritto nella sezione precedente, le risorse indipendenti dal dispositivo si trovano sempre nella CPU e non sono mai associate a un dispositivo di rendering hardware. Di seguito sono riportate le risorse indipendenti dal dispositivo:
- ID2D1DrawingStateBlock
- ID2D1Factory
- ID2D1Geometry e le interfacce che ereditano da ID2D1Geometry.
- ID2D1GeometrySink e ID2D1SimplifiedGeometrySink
- ID2D1StrokeStyle
Usare un ID2D1Factory, che è una risorsa indipendente dal dispositivo, per creare risorse indipendenti dal dispositivo. Per creare una factory, usare la funzione CreateFactory.
Ad eccezione delle destinazioni di rendering, tutte le risorse create da una factory sono indipendenti dal dispositivo. Una destinazione di rendering è una risorsa dipendente dal dispositivo.
risorse Device-Dependent
Qualsiasi risorsa non denominata nell'elenco precedente è una risorsa dipendente dal dispositivo. Le risorse dipendenti dal dispositivo sono associate a un particolare dispositivo di rendering. Quando è disponibile l'accelerazione hardware, tale dispositivo è la GPU. In altri casi, si tratta della CPU.
Per creare la maggior parte delle risorse dipendenti dal dispositivo, usare un target di rendering. Nella maggior parte dei casi, usare una factory per creare una destinazione di rendering.
Di seguito sono riportati esempi di risorse dipendenti dal dispositivo:
- ID2D1Brush e le interfacce che lo ereditano. Usare un target di rendering per creare pennelli.
- ID2D1Layer. Usare un obiettivo di rendering per creare livelli.
- ID2D1RenderTarget e le interfacce che ereditano da quest'ultima. Per creare una destinazione di rendering, usare una fabbrica o un'altra destinazione di rendering.
Nota
A partire da Windows 8, sono disponibili nuove interfacce che creano risorse dipendenti dal dispositivo. Un ID2D1Device e un ID2D1DeviceContext può condividere una risorsa se il contesto di dispositivo e la risorsa vengono creati dallo stesso ID2D1Device.
Le risorse dipendenti dal dispositivo diventano inutilizzabili quando i dispositivi di rendering associati diventano non disponibili. Ciò significa che quando si riceve l'errore di D2DERR_RECREATE_TARGET per una destinazione di rendering, è necessario ricreare la destinazione di rendering e tutte le relative risorse.
Condivisione delle risorse della fabbrica
È possibile condividere tutte le risorse indipendenti dal dispositivo create da una factory con tutte le altre risorse (dipendenti dal dispositivo o indipendenti dal dispositivo) create dalla stessa factory. È ad esempio possibile usare due oggetti ID2D1RenderTarget per disegnare lo stesso ID2D1RectangleGeometry se entrambi gli oggetti ID2D1RenderTarget sono stati creati dalla stessa factory.
Le interfacce sink (ID2D1SimplifiedGeometrySink, ID2D1GeometrySinke ID2D1TessellationSink) possono essere condivise con le risorse create da qualsiasi fabbrica. A differenza di altre interfacce in Direct2D, è possibile usare qualsiasi implementazione di un'interfaccia sink. Ad esempio, è possibile usare la propria implementazione di ID2D1SimplifiedGeometrySink.
Condivisione delle risorse di destinazione di rendering
La possibilità di condividere le risorse create da una destinazione di rendering dipende dal tipo di destinazione di rendering. Quando si crea una destinazione di rendering di tipo D2D1_RENDER_TARGET_TYPE_DEFAULT, le risorse create da tale destinazione di rendering possono essere usate solo da tale destinazione di rendering (a meno che la destinazione di rendering non si adatti a una delle categorie descritte nelle sezioni seguenti). Ciò si verifica perché non si sa quale dispositivo verrà usato dalla destinazione di rendering; potrebbe finire per effettuare il rendering su hardware locale, software o sull'hardware di un client remoto. Ad esempio, è possibile scrivere un programma che smette di funzionare quando viene visualizzato in remoto o quando la destinazione di rendering è aumentata di dimensioni superiori alle dimensioni massime supportate dall'hardware di rendering.
Le sezioni seguenti descrivono le circostanze in cui una risorsa creata da una destinazione di rendering può essere condivisa con un'altra destinazione di rendering.
Destinazioni di rendering hardware
È possibile condividere le risorse tra qualsiasi destinazione di rendering che usa in modo esplicito l'hardware, purché la modalità remota sia compatibile. La modalità remota è garantita compatibile solo quando entrambe le destinazioni di rendering usano il flag di utilizzo D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING o D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, oppure se non viene specificato alcun flag. Queste impostazioni garantiscono che le risorse si trovino sempre nello stesso computer. Per specificare una modalità di utilizzo, impostare il campo utilizzo della struttura D2D1_RENDER_TARGET_PROPERTIES usata per creare la destinazione di rendering con uno o più flag D2D1_RENDER_TARGET_USAGE.
Per creare una destinazione di rendering che usa in modo esplicito il rendering hardware, impostare il campo tipo della struttura D2D1_RENDER_TARGET_PROPERTIES utilizzata per creare la destinazione di rendering per D2D1_RENDER_TARGET_TYPE_HARDWARE.
Destinazioni di rendering delle superfici DXGI
È possibile condividere le risorse create da una destinazione di rendering della superficie DXGI con qualsiasi altra destinazione di rendering della superficie DXGI che usa lo stesso dispositivo Direct3D sottostante.
Destinazioni di rendering compatibili e bitmap condivise
È possibile condividere le risorse tra una destinazione di rendering e le destinazioni di rendering compatibili create da tale destinazione di rendering. Per creare una destinazione di rendering compatibile, usare il metodo ID2D1RenderTarget::CreateCompatibleRenderTarget.
È possibile usare il metodo ID2D1RenderTarget::CreateSharedBitmap per creare un ID2D1Bitmap che può essere condiviso tra le due destinazioni di rendering specificate nella chiamata al metodo, se il metodo ha esito positivo. Questo metodo avrà esito positivo, purché le due destinazioni di rendering usino lo stesso dispositivo sottostante per il rendering.