Panoramica delle risorse

Una risorsa Direct2D è un oggetto usato per il disegno ed è rappresentato da un'interfaccia Direct2D, ad esempio ID2D1Geometry o ID2D1RenderTarget. Questo argomento descrive i tipi di risorse Direct2D e il modo in cui possono essere condivisi.

In questo argomento sono incluse le sezioni seguenti:

Informazioni sulle risorse Direct2D

Molte API 2D con accelerazione hardware sono progettate per un modello di risorse incentrato sulla CPU e un set di operazioni di rendering che funzionano bene sulle CPU. Alcune parti dell'API sono quindi accelerate dall'hardware. L'implementazione di queste API richiede un gestore risorse 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, resource manager deve comunicare avanti e indietro tra CPU e GPU (dispendioso) in modo che possa passare al rendering della CPU. In alcuni casi, potrebbe forzare il rendering imprevedibile a eseguire completamente il fallback alla CPU. Inoltre, le operazioni di rendering che appaiono semplici potrebbero richiedere passaggi di rendering intermedi temporanei non 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.
  • Le risorse dipendenti dal dispositivo, ad esempio ID2D1RenderTarget e ID2D1LinearGradientBrush, eseguono direttamente il mapping alle risorse nella 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 generate 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 gestore di risorse. 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.

risorse Device-Independent

Come descritto nella sezione precedente, le risorse indipendenti dal dispositivo risiedono sempre nella CPU e non sono mai associate a un dispositivo di rendering hardware. Di seguito sono riportate le risorse indipendenti dal dispositivo:

Usare un ID2D1Factory, se stesso 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 dispositivo di rendering specifico. Quando l'accelerazione hardware è disponibile, tale dispositivo è la GPU. In altri casi, si tratta della CPU.

Per creare la maggior parte delle risorse dipendenti dal dispositivo, usare una destinazione 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 ereditano da essa. Usare una destinazione di rendering per creare pennelli.
  • ID2D1Layer. Usare una destinazione di rendering per creare livelli.
  • ID2D1RenderTarget e le interfacce che ereditano da esso. Per creare una destinazione di rendering, usare una factory o un'altra destinazione di rendering.

Nota

A partire da Windows 8, sono disponibili nuove interfacce che creano risorse dipendenti dal dispositivo. Id2D1Device e ID2D1DeviceContext possono 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 di factory

È possibile condividere tutte le risorse indipendenti dal dispositivo create da una factory con tutte le altre risorse (indipendenti dal dispositivo o dipendenti 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, ID2D1GeometrySink e ID2D1TessellationSink) possono essere condivise con le risorse create da qualsiasi factory. 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 finirà per usare la destinazione di rendering, ma potrebbe finire per eseguire il rendering su hardware locale, software o 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 solo se 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 di 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 usata per creare la destinazione di rendering per D2D1_RENDER_TARGET_TYPE_HARDWARE.

Destinazioni di rendering della superficie 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 utilizzare il metodo ID2D1RenderTarget::CreateSharedBitmap per creare un OGGETTO 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 finché le due destinazioni di rendering usano lo stesso dispositivo sottostante per il rendering.