Freigeben über


Übersicht über Geometrierealisierungen

In diesem Thema wird beschrieben, wie Sie Direct2D-Geometrierealisierungen verwenden, um die Geometrierenderingleistung Ihrer App in bestimmten Szenarien zu verbessern.

Sie enthält die folgenden Abschnitte:

Was sind Geometrierealisierungen?

Geometrierealisierungen, die in Windows 8.1 eingeführt wurden, sind eine neue Art von Zeichnungsgrundiv, die es Direct2D-Apps leicht macht, die Leistung des Geometrierenderings in bestimmten Fällen zu verbessern. Geometrierealisierungen werden durch die ID2D1GeometryRealization-Schnittstelle dargestellt.

Gründe für die Verwendung von Geometrierealisierungen

Wenn Direct2D ein ID2D1Geometry-Objekt rendert, muss diese Geometrie in eine Form konvertiert werden, die die Grafikhardware durch einen Prozess namens Tessellation versteht. In der Regel muss Direct2D für jeden gezeichneten Frame geometrien, auch wenn sich die Geometrie nicht ändert. Wenn Ihre App bei jedem Frame dieselbe Geometrie rendert, stellt die wiederholte Neu tessellation verschwendeten Rechenaufwand dar. Es ist recheneffizienter, die Tessellation oder sogar die vollständige Rasterung der Geometrie zwischenzuspeichern und diese zwischengespeicherte Darstellung für jeden Frame zu zeichnen, anstatt wiederholt neu zu erstellen.

Ein gängiger Weg, wie Entwickler dieses Problem lösen, besteht darin, die vollständige Rasterung der Geometrie zwischenzuspeichern. Insbesondere ist es üblich, eine neue Bitmap zu erstellen, die Geometrie mit dieser Bitmap zu rastern und dann diese Bitmap nach Bedarf in die Szene zu zeichnen. (Dieser Ansatz wird im Abschnitt Geometrierendering unter Verbessern der Leistung von Direct2D-Apps beschrieben.) Obwohl dieser Ansatz sehr recheneffizient ist, hat er einige Nachteile:

  • Die zwischengespeicherte Bitmap reagiert auf Änderungen in der Transformation, die auf die Szene angewendet wird. Beispielsweise kann die Skalierung der Rasterung zu spürbaren Skalierungsartefakten führen. Das Minimieren dieser Artefakte mit hochwertigen Skalierungsalgorithmen kann rechenintensiv sein.
  • Die zwischengespeicherte Bitmap verbraucht eine erhebliche Menge an Arbeitsspeicher, insbesondere wenn sie mit hoher Auflösung gerastert wird.

Geometrierealisierungen bieten eine alternative Möglichkeit zum Zwischenspeichern von Geometrien, die die oben genannten Nachteile vermeiden. Geometrierealisierungen werden nicht durch Pixel (wie bei einer vollständigen Rasterung) dargestellt, sondern durch Punkte auf einer mathematischen Ebene. Aus diesem Grund sind sie weniger empfindlich als vollständige Rasterungen für Skalierung und andere Manipulationen und verbrauchen deutlich weniger Arbeitsspeicher.

Wann Geometrierealisierungen verwendet werden sollen

Ziehen Sie die Verwendung von Geometrierealisierungen in Betracht, wenn Ihre App komplexe Geometrien rendert, deren Formen sich selten ändern, die jedoch änderungen an Transformationen unterliegen können.

Betrachten Sie beispielsweise eine Zuordnungsanwendung, die eine statische Karte anzeigt, die es dem Benutzer jedoch ermöglicht, sich zu vergrößern und zu verkleinern. Diese App kann von der Verwendung von Geometrierealisierungen profitieren. Da die geometrien, die gerendert werden, statisch bleiben, ist es nützlich, sie zwischenzuspeichern, um Tessellationsarbeit zu sparen. Da die Zuordnungen jedoch skaliert werden, wenn der Benutzer zoomt, ist das Zwischenspeichern einer vollständigen Rasterung aufgrund von Skalierungsartefakten nicht ideal. Die Zwischenspeicherung von Geometrierealisierungen würde es der App ermöglichen, eine Neu-Tessellation zu vermeiden und gleichzeitig eine hohe visuelle Qualität während der Skalierung beizubehalten.

Auf der anderen Seite betrachten Sie eine Kaleidoskop-App mit animierter Geometrie, die sich ständig ändert. Diese App würde wahrscheinlich nicht von der Verwendung von Geometrierealisierungen profitieren. Da sich die Shapes selbst von Frame zu Frame ändern, ist es nicht sinnvoll, ihre Tessellationen zwischenzuspeichern. Der beste Ansatz für diese App besteht darin, ID2D1Geometry-Objekte direkt zu zeichnen.

Erstellen von Geometrierealisierungen

Ein ID2D1GeometryRealization-Objekt muss aus einem vorhandenen ID2D1Geometry-Objekt erstellt werden. Um eine Geometrierealisierung zu erstellen, rufen Sie die CreateFilledGeometryRealization-Methode oder die CreateStrokedGeometryRealization-Methode auf, und übergeben Sie die zu realisierende ID2D1Geometry .

Beide Arten der Geometrierealisierung werden durch die ID2D1GeometryRealization-Schnittstelle dargestellt.

Beim Erstellen einer Geometrierealisierung muss Direct2D alle Kurven in der bereitgestellten Geometrie auf polygonale Annäherungen abflachen. Sie müssen einen Abflachungstoleranzparameter für die Erstellungsmethode angeben. Dadurch wird der maximale Abstand in geräteunabhängigen Pixeln (DIPs) zwischen der wahren Kurve der Geometrie und ihrer polygonalen Näherung angegeben. Je niedriger die von Ihnen bereitgestellte Toleranz zur Abflachung ist, desto höher ist die Genauigkeit des resultierenden Geometrierealisierungsobjekts. Ebenso führt die Bereitstellung einer höheren Abflachungstoleranz zu einer Geometrie mit geringerer Genauigkeit. Beachten Sie, dass das Zeichnen von Geometrierealisierungen mit höherer Genauigkeit teurer ist als die mit geringerer Genauigkeit, aber sie können weiter skaliert werden, bevor sichtbare Artefakte eingeführt werden. Eine Anleitung zur Verwendung von Toleranzen für die Abflachung finden Sie weiter unten unter Skalieren von Geometrierealisierungen .

Hinweis

Geometrierealisierungsobjekte sind einem bestimmten Grafikgerät zugeordnet: Sie sind geräteabhängige Ressourcen.

 

Zeichnen von Geometrierealisierungen

Die Realisierung der Zeichnungsgeometrie ähnelt dem Zeichnen anderer Direct2D-Grundtypen , z. B. Bitmaps. Rufen Sie hierzu die DrawGeometryRealization-Methode auf, und übergeben Sie ihr das zu zeichnende Geometrierealisierungsobjekt und den zu verwendenden Pinsel. Wie bei anderen Direct2D-Zeichnungsmethoden müssen Sie DrawGeometryRealization zwischen Aufrufen von BeginDraw und EndDraw aufrufen.

Skalieren von Geometrierealisierungen

Geometrierealisierungen, wie andere Direct2D-Grundtypen , respektieren den Transformationssatz im Gerätekontext. Obwohl Übersetzungs- und Rotationstransformationen keine Auswirkungen auf die visuelle Qualität von Geometrierealisierungen haben, können Skalierungstransformationen visuelle Artefakte erzeugen.

Insbesondere das Anwenden eines ausreichend großen Maßstabs auf eine beliebige Geometrierealisierung kann die polygonale Annäherung der wahren Kurven aufdecken. Das Bild hier zeigt ein Paar von elliptischen Geometrierealisierungen (Füllung und Strich), die zu weit hochskaliert wurden. Kurvennde Artefakte sind sichtbar.

ein paar elliptische Geometrierealisierungen (Füllung und Strich), die zu weit hochskaliert wurden. Kurvenflachenartefakte sind sichtbar.

Apps, die auf visuelle Qualität achten, sollten Maßnahmen ergreifen, um sicherzustellen, dass dies nicht geschieht. Wie Sie die Skalierung verarbeiten, hängt von den Anforderungen Ihrer App ab. Im Folgenden sind mehrere empfohlene Ansätze für verschiedene Arten von Apps aufgeführt.

Verwenden von Geometrierealisierungen in Apps, die nicht skaliert werden

Wenn Ihre App keine Skalierung für die Geometrierealisierungen durchführt, ist es sicher, die Realisierungen nur einmal unter Verwendung einer einzelnen Abflachungstoleranz zu erstellen. (Transformationen ohne Skalierung wirken sich nicht auf die visuelle Qualität gerenderter Geometrierealisierungen aus.) Verwenden Sie die ComputeFlatteningTolerance-Funktion , um die geeignete Abflachungstoleranz für den DPI zu berechnen:

    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
        );

Verwenden von Geometrierealisierungen in Apps, die um eine kleine Menge skaliert werden

Wenn Ihre App eine Geometrierealisierung nur um eine kleine Menge hochskalieren kann (z. B. bis zu 2x oder 3x), kann es sinnvoll sein, die Geometrierealisierung einfach einmal mit einer proportional geringeren Abflachungstoleranz als die Standardeinstellung zu erstellen. Dadurch entsteht eine höhere Genauigkeit, die vor dem Skalieren von Artefakten erheblich hochskaliert werden kann. der Kompromiss besteht darin, dass das Zeichnen der höhergetreuen Realisierung mehr Arbeit erfordert.

Angenommen, Sie wissen, dass Ihre App eine Geometrierealisierung nie mehr als das 2-fache skalieren wird. Ihre App kann die Geometrierealisierung mithilfe einer Abflachungstoleranz erstellen, die die Hälfte des Standardwerts beträgt, und die Realisierung einfach nach Bedarf bis zu 2x skalieren. Verwenden Sie die ComputeFlatteningTolerance-Funktion , um die entsprechende Toleranz für die Abflachung zu berechnen, indem Sie 2.0 als maxZoomFactor-Parameter übergeben:

    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
        );

Verwenden von Geometrierealisierungen in Apps, die um eine große Menge skaliert werden

Wenn Ihre App eine Geometrierealisierung um große Mengen hoch- oder herunterskalieren kann (z. B. um das 10-fache oder mehr), ist die entsprechende Verarbeitung der Skalierung komplizierter.

Für die meisten dieser Apps wird empfohlen, die Geometrierealisierung bei schrittweise niedrigeren Abflachungstoleranzen neu zu erstellen, wenn die Szene hochskaliert wird, um die Visuelle Genauigkeit zu gewährleisten und Skalierungsartefakte zu vermeiden. Wenn die Szene herunterskaliert wird, sollte die App die Geometrierealisierungen bei schrittweise höheren Abflachungstoleranzen neu erstellen, um zu vermeiden, dass Details verschwenderisch gerendert werden, die nicht sichtbar sind. Die App sollte die Geometrierealisierungen nicht jedes Mal neu erstellen, wenn sich die Skalierung ändert, da dadurch der Zweck des Zwischenspeicherns der Tessellationsarbeit verfehlt wird. Stattdessen sollte die App die Geometrierealisierungen weniger häufig neu erstellen: z. B. nach jedem 2-fachen Anstieg oder Rückgang der Skalierung.

Jedes Mal, wenn sich die Skalierung in einer App als Reaktion auf die Benutzerinteraktion ändert, kann die App die neue Skalierung mit der Skala vergleichen, bei der die Geometrierealisierungen zuletzt erstellt wurden (z. B. in einem m_lastScale-Member gespeichert). Wenn die beiden Werte nahe sind (in diesem Fall innerhalb eines Faktors von 2), werden keine weiteren Maßnahmen ergriffen. Wenn die beiden Werte jedoch nicht nahe sind, werden die Geometrierealisierungen neu erstellt. Die ComputeFlatteningTolerance-Funktion wird verwendet, um eine für die neue Skalierung geeignete Toleranz für die Abflachung zu berechnen, und m_lastScale auf die neue Skalierung aktualisiert wird.

Darüber hinaus erstellt die App immer Realisierungen mit einer kleineren Toleranz als die, die normalerweise für die neue Skalierung verwendet wird, indem sie einen Wert von 2 als maxZoomFactor-Parameter an ComputeFlatteningTolerance übergibt. Dadurch können die neuen Geometrierealisierungen um einen zusätzlichen Faktor von 2 hochskaliert werden, ohne dass Skalierungsartefakte entstehen.

Hinweis

Der hier beschriebene Ansatz ist möglicherweise nicht für alle Apps geeignet. Wenn Ihre App beispielsweise ermöglicht, dass die Szene sehr schnell durch sehr große Faktoren skaliert werden kann (z. B. wenn sie einen Zoomschieberegler enthält, der von 100 % auf 1.000.000 % in der Spanne einiger Frames verschoben werden kann), kann dieser Ansatz zu übermäßiger Arbeit führen, indem die Geometrierealisierung jedes Frames neu erstellt wird. Ein alternativer Ansatz besteht darin, die Geometrierealisierungen erst neu zu erstellen, nachdem jede Bearbeitung der Skalierung der Szene abgeschlossen wurde (z. B. nachdem der Benutzer eine Pinch-Geste abgeschlossen hat).

 

Übersicht über Geometrien

Verbessern der Leistung von Direct2D-Apps

Allgemeine Richtlinien zum Rendern komplexer statischer Inhalte

ID2D1DeviceContext1

ID2D1GeometryRealization

ComputeFlatteningTolerance-Funktion