Condividi tramite


Panoramica delle realizzazioni di geometria

In questo argomento viene descritto come usare le realizzazioni geometry Direct2D per migliorare le prestazioni di rendering geometry dell'app in determinati scenari.

Contiene le sezioni seguenti:

Quali sono le realizzazioni geometry?

Le realizzazioni geometry, introdotte in Windows 8.1, sono un nuovo tipo di primitiva di disegno che semplificano le app Direct2D per migliorare le prestazioni di rendering geometry in determinati casi. Le realizzazioni geometry sono rappresentate dall'interfaccia ID2D1GeometryRealization .

Perché usare le realizzazioni geometry?

Quando Direct2D esegue il rendering di un oggetto ID2D1Geometry , deve convertire tale geometria in un modulo che l'hardware grafico comprende tramite un processo denominato tessellazione. In genere, Direct2D deve tessellare geometria ogni cornice che viene disegnata, anche se la geometria non cambia. Se l'app esegue il rendering della stessa geometria ogni fotogramma, la ri-tessellazione ripetuta rappresenta lo sforzo di calcolo sprecato. È più efficiente in modo computazionale memorizzare nella cache la tessellazione, o anche la rasterizzazione completa, della geometria e di disegnare tale rappresentazione memorizzata nella cache invece di ripetere ripetutamente la tessellatura.

Un modo comune per risolvere questo problema è memorizzare nella cache la rasterizzazione completa della geometria. In particolare, è comune creare una nuova bitmap, rasterizzare la geometria in tale bitmap e quindi disegnare tale bitmap alla scena in base alle esigenze. Questo approccio è descritto nella sezione Rendering geometry di Miglioramento delle prestazioni delle app Direct2D. Sebbene questo approccio sia molto efficiente dal punto di vista computazionale, presenta alcuni svantaggi:

  • La bitmap memorizzata nella cache è sensibile alle modifiche apportate alla trasformazione applicata alla scena. Ad esempio, il ridimensionamento della rasterizzazione può comportare un notevole ridimensionamento degli artefatti. La mitigazione di questi artefatti con algoritmi di scalabilità di alta qualità può essere costosa per il calcolo.
  • La bitmap memorizzata nella cache usa una quantità significativa di memoria, soprattutto se viene rasterizzata a una risoluzione elevata.

Le realizzazioni geometry offrono un modo alternativo per memorizzare nella cache la geometria che evita gli svantaggi precedenti. Le realizzazioni geometry sono rappresentate non da pixel (come accade con una rasterizzazione completa) ma invece da punti su un piano matematico. Per questo motivo sono meno sensibili rispetto alle rasterizzazioni complete per ridimensionare e altre manipolazioni e consumano una memoria significativamente inferiore.

Quando usare le realizzazioni geometry

È consigliabile usare le realizzazioni geometry quando l'app esegue il rendering di geometrie complesse le cui forme cambiano raramente, ma che possono essere soggette a trasformazioni modificate.

Si consideri, ad esempio, un'applicazione di mapping che mostra una mappa statica, ma che consente all'utente di eseguire lo zoom avanti e indietro. Questa app può trarre vantaggio dall'uso di realizzazioni geometry. Poiché le geometrie di cui viene eseguito il rendering rimangono statiche, è utile memorizzarle nella cache per salvare il lavoro di tessellazione. Ma poiché le mappe vengono ridimensionate quando l'utente esegue lo zoom, la memorizzazione nella cache di una rasterizzazione completa non è ideale, a causa del ridimensionamento degli artefatti. La memorizzazione nella cache delle realizzazioni geometry consente all'app di evitare il lavoro di ri tessellazione mantenendo una qualità visiva elevata durante il ridimensionamento.

Si consideri invece un'app kaleidoscope con geometria animata che cambia continuamente. Questa app probabilmente non trarrebbe vantaggio dall'uso delle realizzazioni geometry. Poiché le forme stesse cambiano da cornice a cornice, non è utile memorizzare nella cache le tessere. L'approccio migliore per questa app consiste nel disegnare direttamente oggetti ID2D1Geometry .

Creazione di realizzazioni geometry

Un oggetto ID2D1GeometryRealization deve essere creato da un oggetto ID2D1Geometry esistente. Per creare una realizzazione geometry, chiamare il metodo CreateFilledGeometryRealization o il metodo CreateStrokedGeometryRealization e passare l'ID2D1Geometry da realizzare.

Entrambi i tipi di realizzazione geometry sono rappresentati dall'interfaccia ID2D1GeometryRealization .

Quando si crea una realizzazione geometry, Direct2D deve appiattire qualsiasi curva nella geometria fornita alle approssimazioni poligonali. È necessario specificare un parametro di tolleranza flat al metodo di creazione, che specifica la distanza massima, in pixel indipendenti dal dispositivo, tra la curva vera della geometria e l'approssimazione poligonale. La tolleranza di appiattimento inferiore specificata, maggiore è la fedeltà dell'oggetto di realizzazione geometria risultante. Analogamente, fornendo una tolleranza più piatta, la realizzazione della geometria con fedeltà inferiore restituisce una realizzazione della geometria più bassa. Si noti che le realizzazioni geometry ad alta fedeltà sono più costose per disegnare rispetto a quelle con fedeltà inferiore, ma possono essere ridimensionate ulteriormente prima di introdurre artefatti visibili. Per indicazioni sull'uso delle tolleranze flat, vedere Ridimensionare le realizzazioni geometry di seguito.

Nota

Gli oggetti di realizzazione geometry sono associati a un particolare dispositivo grafico: sono risorse dipendenti dal dispositivo.

 

Creazione di geometrie di disegno

La realizzazione della geometria di disegno è simile al disegno di altre primitive Direct2D , come le bitmap. A tale scopo, chiamare il metodo DrawGeometryRealization e passarlo l'oggetto di realizzazione geometry da disegnare e il pennello da usare. Come per altri metodi di disegno Direct2D, è necessario chiamare DrawGeometryRealization tra le chiamate a BeginDraw e EndDraw.

Ridimensionamento delle realizzazioni geometry

Le realizzazioni geometry, come altre primitive Direct2D , rispettano il set di trasformazioni nel contesto del dispositivo. Anche se le trasformazioni di traduzione e rotazione non hanno effetto sulla qualità visiva delle realizzazioni geometry, le trasformazioni di scala possono produrre artefatti visivi.

In particolare, l'applicazione di una scala sufficiente a qualsiasi realizzazione geometry può rivelare l'approssimazione poligonale delle vere curve. L'immagine qui mostra una coppia di realizzazioni geometrie ellittiche (riempimento e tratto) che sono state ridimensionate troppo lontane. Gli artefatti curva-flat sono visibili.

una coppia di realizzazioni geometrie ellittiche (riempimento e tratto) che sono state ridimensionate troppo lontane. gli artefatti curve-flattening sono visibili.

Le app sensibili alla qualità visiva devono adottare misure per garantire che ciò non si verifichi. La scalabilità dipende dalle esigenze dell'app. Di seguito sono riportati diversi approcci consigliati per diversi tipi di app.

Uso delle realizzazioni geometry nelle app che non ridimensionano

Se l'app non esegue alcuna scalabilità sulla realizzazione della geometria, è sicuro creare le realizzazioni una sola volta, usando una singola tolleranza di flattening. Le trasformazioni di scalabilità non influiscono sulla qualità visiva delle realizzazioni geometry di cui è stato eseguito il rendering. Usare la funzione ComputeFlatteningTolerance per calcolare la tolleranza di flattening appropriata per dpi:

    float dpiX, dpiY;
    deviceContext->GetDpi(&dpiX, &dpiY);

    float flatteningTolerance = D2D1::ComputeFlatteningTolerance(
        D2D1::Matrix3x2F::Identity(),   // apply no additional scaling transform
        dpiX,                           // horizontal DPI
        dpiY                            // vertical DPI
        );

Uso delle realizzazioni geometry nelle app che ridimensionano in base a una piccola quantità

Se l'app può ridimensionare una realizzazione geometry solo in base a una piccola quantità (ad esempio, fino a 2x o 3x), può essere opportuno semplicemente creare la realizzazione geometry una volta, in una tolleranza proporzionalemente inferiore a quella predefinita. Ciò crea una realizzazione più fedele che può essere ridimensionata in modo significativo prima di incorrere in artefatti di ridimensionamento; il compromesso è che il disegno della realizzazione più fedeltà richiede più lavoro.

Si supponga, ad esempio, di sapere che l'app non ridimensiona mai una realizzazione geometry di oltre 2x. L'app può creare la realizzazione geometry usando una tolleranza flat che rappresenta la metà del valore predefinito e semplicemente ridimensionare la realizzazione in base alle esigenze, fino a 2x. Usare la funzione ComputeFlatteningTolerance per calcolare la tolleranza di flattening appropriata passando 2.0 come parametro maxZoomFactor :

    float dpiX, dpiY;
    deviceContext->GetDpi(&dpiX, &dpiY);
    
    float flatteningTolerance = D2D1::ComputeFlatteningTolerance(
        D2D1::Matrix3x2F::Identity(),   // apply no additional scaling transform
        dpiX,                           // horizontal DPI
        dpiY,                           // vertical DPI
        2.0f                            // realization can be scaled by an additional 2x
        );

Uso delle realizzazioni geometry nelle app su larga scala

Se l'app può ridimensionare una realizzazione geometry su o giù per grandi quantità (ad esempio, per 10x o più), la gestione della scalabilità appropriata è più complessa.

Per la maggior parte di queste app, l'approccio consigliato consiste nel ricreare la realizzazione della geometria in modo progressivamente inferiore alle tolleranze flat mentre la scena viene ridimensionata, per mantenere la fedeltà visiva ed evitare il ridimensionamento degli artefatti. Analogamente, poiché la scena viene ridimensionata, l'app deve ricreare le realizzazioni geometry in modo progressivo a tolleranza di flattening progressivamente superiori, per evitare di eseguire il rendering dei dettagli in modo spreco che non sono visibili. L'app non deve ricreare le realizzazioni geometry ogni volta che la scala cambia, perché in questo modo sconfigge lo scopo di memorizzare nella cache il lavoro di tessellazione. L'app, invece, deve ricreare le realizzazioni geometry meno frequentemente: ad esempio, dopo ogni aumento o riduzione della scalabilità 2x.

Ogni volta che la scalabilità cambia in un'app in risposta all'interazione utente, l'app potrebbe confrontare la nuova scala rispetto alla scala in cui sono state create le realizzazioni geometry (archiviate, ad esempio, in un membro m_lastScale ). Se i due valori sono vicini (in questo caso, entro un fattore 2), non viene eseguita alcuna ulteriore azione. Ma se i due valori non sono vicini, le realizzazioni geometry vengono ricreate. La funzione ComputeFlatteningTolerance viene usata per calcolare una tolleranza di flattening appropriata per la nuova scala e m_lastScale viene aggiornata alla nuova scala.

Inoltre, l'app crea sempre le realizzazioni usando una tolleranza più piccola rispetto a quella normalmente usata per la nuova scala, passando un valore pari a 2 come parametro maxZoomFactor a ComputeFlatteningTolerance. In questo modo, le nuove realizzazioni geometry possono essere ridimensionate in base a un fattore aggiuntivo pari a 2 senza incorrere in artefatti di ridimensionamento.

Nota

L'approccio descritto qui potrebbe non essere appropriato per tutte le app. Ad esempio, se l'app consente di ridimensionare la scena da fattori molto grandi molto rapidamente (ad esempio, se contiene un dispositivo di scorrimento "zoom" che può essere spostato dal 100% al 1.000,000% nell'intervallo di pochi fotogrammi), questo approccio può comportare un lavoro in eccesso ricreando le realizzazioni geometry ogni cornice. Un approccio alternativo consiste nel ricreare le realizzazioni geometry solo dopo il completamento di ogni manipolazione della scala della scena, ad esempio dopo che l'utente ha completato un gesto di pizzicamento.

 

Panoramica delle geometrie

Miglioramento delle prestazioni delle app Direct2D

Linee guida generali per il rendering di contenuti statici complessi

ID2D1DeviceContext1

ID2D1GeometryRealization

Funzione ComputeFlatteningTolerance