Condividi tramite


Superficie di composizione

Nota

Per le app in Windows 10, è consigliabile usare Windows. UI. API di composizione anziché DirectComposition. Per altre info, vedi Modernizzare l'app desktop usando il livello visivo.

In questo argomento vengono descritti i tipi di superfici supportate da Microsoft DirectComposition.

Superficie logica DirectComposition

DirectComposition espone l'oggetto IDCompositionSurface per rappresentare una superficie di composizione logica. DirectComposition espone le API che è possibile usare per creare, aggiornare ed eliminare queste superfici logiche. Ogni superficie può essere associata a uno o più oggetti visivi. Un'applicazione è responsabile della gestione della durata delle superfici logiche.

Aggiornamento di una superficie logica

Un'applicazione può aggiornare una superficie logica chiamando BeginDraw e specificando le dimensioni e l'offset del rettangolo sulla superficie logica che l'app vuole aggiornare. DirectComposition alloca un rettangolo delle dimensioni specificate e quindi restituisce la superficie e l'offset corrispondente che l'applicazione deve disegnare o aggiornare. I limiti del rettangolo di aggiornamento sono vincolati dalle dimensioni della superficie. Ad esempio, il rettangolo di aggiornamento per una superficie di 40 by-100 pixel può essere fino a (0,0,40,100). Inoltre, l'area aggiornabile viene applicata da un rettangolo di protezione. Poiché può essere presente un solo rettangolo di guardia alla volta, è possibile aggiornare una sola superficie logica alla volta. BeginDraw restituisce un codice di errore se EndDraw o SuspendDraw non è stato chiamato dopo una chiamata precedente a BeginDraw. Un'applicazione può aggiungere una chiamata di cui è stato eseguito il commit a BeginDraw a un batch, ma non ha effetto fino a quando EndDraw non viene chiamato ed eseguito il commit.

Sospensione degli aggiornamenti in una superficie logica

Un'applicazione che deve aggiornare diverse superfici può chiamare SuspendDraw nell'aggiornamento corrente e quindi chiamare BeginDraw per avviare un nuovo aggiornamento. Microsoft DirectComposition consente più aggiornamenti, ma solo uno può essere attivo alla volta. Ciò significa che è necessario chiamare SuspendDraw o EndDraw su una superficie prima di chiamare BeginDraw nel successivo. A differenza di EndDraw, un batch di cui è stato eseguito il commit può contenere una superficie in stato SuspendDraw , ma tali aggiornamenti non verranno visualizzati sullo schermo finché non viene chiamato EndDraw .

Ripresa degli aggiornamenti in una superficie logica

Un'applicazione può riprendere un aggiornamento a una superficie che si trova in uno stato SuspendDraw chiamando ResumeDraw. Questo metodo può essere chiamato solo su una superficie sospesa.

Fine degli aggiornamenti a una superficie logica

La chiamata a EndDraw e Commit è l'unico modo per visualizzare le modifiche apportate all'aggiornamento bitmap sullo schermo. Ogni chiamata a EndDraw deve avere una chiamata corrispondente a BeginDraw per rimuovere il rettangolo di protezione. La superficie logica mantiene tutti gli aggiornamenti fino a quando non viene chiamato commit . È anche possibile chiamare EndDraw su una superficie che si trova nello stato SuspendDraw perché EndDraw è un curriculum/fine implicito. Dopo aver chiamato EndDraw, il contenuto aggiornato viene presentato alla schermata e rimosso in modo che la memoria per l'aggiornamento possa essere riutilizzata per un aggiornamento successivo.

Esempio di uso di una superficie logica

Nell'esempio seguente vengono descritti i passaggi necessari per un'applicazione se è stata creata una struttura ad albero visuale costituita da due oggetti visivi e quindi è necessario aggiornare aree specifiche delle due superfici logiche associate agli oggetti visivi:

  1. Creare un dispositivo DirectComposition.
  2. Creare la struttura ad albero visuale costituita da un nodo radice e oggetti visivi 1 e 2.
  3. Creare superfici logiche 1 e 2.
  4. Chiamare SetContent per associare una superficie logica agli oggetti visivi 1 e 2.
  5. Chiamare BeginDraw su un sotto rettangolo della superficie logica 1.
  6. Aggiornare la superficie in corrispondenza dell'offset restituito da DirectComposition.
  7. Passaggi facoltativi:
    1. Chiamare SuspendDraw sulla superficie logica 1.
    2. Chiamare BeginDraw nel sub-rect della superficie logica 2.
    3. Aggiornare la superficie in corrispondenza dell'offset restituito da DirectComposition.
    4. Chiamare EndDraw sulla superficie logica 2.
    5. Chiamare ResumeDraw sulla superficie logica 1.
  8. Aggiornare la superficie in corrispondenza dell'offset restituito da DirectComposition.
  9. Chiamare EndDraw sulla superficie logica 1.
  10. Chiama commit.

Superficie virtuale DirectComposition

DirectComposition espone l'interfaccia IDCompositionVirtualSurface per rappresentare una superficie virtuale, ovvero una raccolta di superfici logiche (riquadri) disposte in una griglia fissa con riquadri di dimensioni fisse. L'applicazione specifica le dimensioni della trama virtuale in fase di creazione. La dimensione stabilisce i limiti per la superficie virtuale. La superficie può essere associata a uno o più oggetti visivi.

Quando viene inizializzata una superficie virtuale, non è supportata da allocazioni effettive. In altre parole, non contiene alcun bit. DirectComposition alloca i riquadri (ovvero gli oggetti superficie di composizione) dopo l'avvio dell'aggiornamento della superficie da parte dell'applicazione. L'applicazione aggiorna la superficie virtuale chiamando BeginDraw e specificando l'area di interesse rispetto alle coordinate della superficie virtuale. DirectComposition alloca quindi i riquadri necessari per contenere l'aggiornamento e restituisce la superficie di composizione e l'offset da aggiornare.

Come per le superfici logiche, è possibile chiamare BeginDraw, SuspendDraw, ResumeDraw e EndDraw in una superficie virtuale. DirectComposition espone inoltre i metodi che è possibile usare per ridimensionare e tagliare una superficie virtuale esistente.

Ridimensionamento di una superficie virtuale

Il metodo Resize modifica i limiti della superficie virtuale, ovvero eventuali nuovi aggiornamenti o allocazioni devono rientrare nei limiti impostati dalle nuove dimensioni. Un'applicazione usa Resize per indicare a DirectComposition che una determinata area della superficie virtuale non è più necessaria e può essere recuperata. Se Resize riduce la superficie virtuale, l'applicazione non può più aggiornare le aree esterne ai nuovi limiti.

La figura seguente mostra una superficie virtuale ridimensionata da 3 a 2 per 2. L'area rossa rappresenta i riquadri che vengono eliminati come parte dell'operazione di ridimensionamento e la memoria viene recuperata da DirectComposition. Dopo il ridimensionamento, l'applicazione non può apportare aggiornamenti all'area rossa senza ridimensionare nuovamente la superficie virtuale.

resizing a virtual surface

L'operazione di ridimensionamento diventa effettiva immediatamente. DirectComposition non attende che l'applicazione chiami Commit per eseguire gli aggiornamenti di ridimensionamento. Si supponga, ad esempio, che un'applicazione effettui la sequenza di chiamate seguente.

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

In questo esempio, l'applicazione perde tutto il contenuto al primo ridimensionamento. Il secondo ridimensionamento non ha alcun effetto anche se è stato chiamato prima di Commit. In questo caso non viene visualizzato nulla sullo schermo.

Taglio di una superficie virtuale

Il metodo Trim identifica l'area della superficie virtuale necessaria per l'applicazione. Non ridimensiona i limiti della superficie virtuale, ma indica a DirectComposition quali superfici logiche devono essere allocate.

Nella figura seguente il quadrato verde è il riquadro di visualizzazione dell'applicazione. L'applicazione esegue inizialmente il rendering dei primi sei riquadri (blu) della superficie virtuale (grigio chiaro) che si trovano nel riquadro di visualizzazione. Come pagina rappresentata dallo scorrimento della superficie virtuale, l'applicazione deve eseguire il rendering degli ultimi sei riquadri. L'applicazione chiama Trim per indicare che l'area definita dagli ultimi sei riquadri è dove il contenuto è e il resto non è necessario al momento. DirectComposition può quindi scegliere di riciclare le superfici logiche che originariamente rappresentavano i primi sei riquadri (grigio scuro).

trimming a virtual surface

Concetti di DirectComposition