Compartir a través de


Información general sobre las realizaciones de geometría

En este tema se describe cómo usar las realizaciones de geometría de Direct2D para mejorar el rendimiento de representación de geometría de la aplicación en determinados escenarios.

Contiene las secciones siguientes:

¿Qué son las realizaciones de geometría?

Las realizaciones de geometría, introducidas en Windows 8.1, son un nuevo tipo de primitivo de dibujo que facilita a las aplicaciones direct2D mejorar el rendimiento de la representación de geometría en determinados casos. Las realizaciones de geometría se representan mediante la interfaz ID2D1GeometryRealization .

¿Por qué usar las realizaciones de geometría?

Cuando Direct2D representa un objeto ID2D1Geometry , debe convertir esa geometría en un formulario que el hardware gráfico entiende a través de un proceso denominado teselación. Normalmente, Direct2D debe teselar geometría cada fotograma que se dibuja, incluso si la geometría no cambia. Si la aplicación representa la misma geometría cada fotograma, la reelación repetida representa el esfuerzo computacional desperdiciado. Es más eficaz computacionalmente almacenar en caché la teselación, o incluso la rasterización completa, de la geometría, y dibujar esa representación almacenada en caché cada fotograma en lugar de volver a teselar repetidamente.

Una manera común de que los desarrolladores resuelvan este problema es almacenar en caché la rasterización completa de la geometría. En concreto, es habitual crear un nuevo mapa de bits, rasterizar la geometría en ese mapa de bits y, a continuación, dibujar ese mapa de bits en la escena según sea necesario. (Este enfoque se describe en la sección Representación de geometría de Mejorar el rendimiento de las aplicaciones de Direct2D). Aunque este enfoque es muy eficaz desde el punto de vista computacional, tiene algunas desventajas:

  • El mapa de bits almacenado en caché es sensible a los cambios de la transformación aplicada a la escena. Por ejemplo, el escalado de la rasterización puede dar lugar a artefactos de escalado notable. La mitigación de estos artefactos con algoritmos de escalado de alta calidad puede ser costoso a nivel computacional.
  • El mapa de bits almacenado en caché consume una cantidad significativa de memoria, especialmente si se rasteriza en una resolución alta.

Las realizaciones de geometría proporcionan una manera alternativa de almacenar en caché la geometría que evita los inconvenientes anteriores. Las realizaciones de geometría se representan no mediante píxeles (como sucede con una rasterización completa), sino por puntos en un plano matemático. Por este motivo, son menos sensibles que las rasterizaciones completas para escalar y otra manipulación, y consumen significativamente menos memoria.

Cuándo usar las realizaciones de geometría

Considere la posibilidad de usar las realizaciones de geometría cuando la aplicación representa geometrías complejas cuyas formas cambian con poca frecuencia, pero que pueden estar sujetas a transformaciones cambiantes.

Por ejemplo, considere una aplicación de asignación que muestra un mapa estático, pero que permite al usuario acercar y alejar. Esta aplicación puede beneficiarse del uso de las realizaciones de geometría. Dado que las geometrías que se representan permanecen estáticas, resulta útil almacenarlas en caché para guardar el trabajo de teselación. Pero dado que los mapas se escalan cuando el usuario acerca, el almacenamiento en caché de una rasterización completa no es ideal, debido al escalado de artefactos. Las realizaciones de geometría de almacenamiento en caché permitirían a la aplicación evitar el trabajo de reelación mientras se mantiene una alta calidad visual durante el escalado.

Por otro lado, considera una aplicación caleidoscopio con geometría animada que cambia continuamente. Esta aplicación probablemente no se beneficiaría del uso de las realizaciones de geometría. Dado que las propias formas cambian de marco a marco, no es útil almacenar en caché sus teselaciones. El mejor enfoque para esta aplicación es dibujar objetos ID2D1Geometry directamente.

Creación de realizaciones de geometría

Se debe crear un objeto ID2D1GeometryRealization a partir de un objeto ID2D1Geometry existente. Para crear una realización de geometría, llame al método CreateFilledGeometryRealization o al método CreateStrokedGeometryRealization y pase id2D1Geometry para que se realice.

Ambos tipos de realización de geometría se representan mediante la interfaz ID2D1GeometryRealization .

Al crear una realización de geometría, Direct2D debe aplanar las curvas de la geometría proporcionada para aproximaciones poligonales. Debe proporcionar un parámetro de tolerancia de aplanamiento al método de creación; esto especifica la distancia máxima, en píxeles independientes del dispositivo (DIP), entre la curva verdadera de la geometría y su aproximación poligonal. Cuanto menor sea la tolerancia de aplanamiento que proporcione, mayor será la fidelidad del objeto de realización de geometría resultante. Del mismo modo, proporcionar una mayor tolerancia de aplanamiento produce una realización de geometría de menor fidelidad. Tenga en cuenta que las realizaciones de geometría de mayor fidelidad son más caras de dibujar que las de menor fidelidad, pero se pueden escalar aún más antes de introducir artefactos visibles. Para obtener instrucciones sobre el uso de tolerancias de aplanamiento, consulte Escalado de las realizaciones de geometría a continuación.

Nota

Los objetos de realización de geometría están asociados a un dispositivo gráfico determinado: son recursos dependientes del dispositivo.

 

Realización de geometría de dibujo

La realización de geometría de dibujo es similar al dibujo de otros primitivos de Direct2D , como mapas de bits. Para ello, llame al método DrawGeometryRealization y páselo el objeto de realización de geometría que se va a dibujar y el pincel que se va a usar. Al igual que con otros métodos de dibujo de Direct2D, debes llamar a DrawGeometryRealization entre las llamadas a BeginDraw y EndDraw.

Escalado de las realizaciones de geometría

Las realizaciones de geometría, al igual que otras primitivas de Direct2D , respetan el conjunto de transformaciones en el contexto del dispositivo. Aunque las transformaciones de traducción y rotación no tienen ningún efecto en la calidad visual de las realizaciones de geometría, las transformaciones de escala pueden producir artefactos visuales.

En concreto, aplicar una escala suficientemente grande a cualquier realización de geometría puede revelar la aproximación poligonal de las curvas verdaderas. La imagen aquí muestra un par de realizaciones de geometría elíptica (relleno y trazo) que se han escalado verticalmente demasiado lejos. Los artefactos de aplanamiento de curva están visibles.

un par de realizaciones de geometría elíptica (relleno y trazo) que se han escalado verticalmente demasiado lejos. Los artefactos de aplanamiento de curva están visibles.

Las aplicaciones que son sensibles a la calidad visual deben tomar medidas para asegurarse de que esto no sucede. La forma de controlar el escalado depende de las necesidades de la aplicación. A continuación se muestran varios enfoques recomendados para varios tipos diferentes de aplicaciones.

Uso de las realizaciones de geometría en aplicaciones que no se escalan

Si la aplicación no realiza ningún escalado en las realizaciones de geometría, es seguro crear las realizaciones solo una vez, usando una sola tolerancia de aplanamiento. (Las transformaciones que no son de escalado no afectan a la calidad visual de las realizaciones de geometría representadas). Use la función ComputeFlatteningTolerance para calcular la tolerancia de aplanamiento adecuada para el PPP:

    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 de las realizaciones de geometría en aplicaciones que se escalan en una pequeña cantidad

Si la aplicación puede escalar una realización de geometría solo por una pequeña cantidad (por ejemplo, hasta 2x o 3x), puede ser adecuado simplemente crear la realización de geometría una vez, con una tolerancia de aplanamiento proporcionalmente inferior a la predeterminada. Esto crea una realización de mayor fidelidad que se puede escalar verticalmente significativamente antes de incurrir en artefactos de escalado; el equilibrio es que la realización de la mayor fidelidad requiere más trabajo.

Por ejemplo, suponga que sabe que la aplicación nunca escalará una realización de geometría por más de 2 veces. La aplicación puede crear la realización de geometría mediante una tolerancia de aplanamiento que sea la mitad del valor predeterminado y simplemente escalar la realización según sea necesario, hasta 2 veces. Use la función ComputeFlatteningTolerance para calcular la tolerancia de acoplamiento adecuada pasando 2.0 como el parámetro 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 de las realizaciones de geometría en aplicaciones que se escalan por una gran cantidad

Si la aplicación puede escalar o reducir verticalmente una realización de geometría por grandes cantidades (por ejemplo, por 10 veces o más), el control del escalado adecuadamente es más complicado.

Para la mayoría de estas aplicaciones, el enfoque recomendado es volver a crear la realización de la geometría en tolerancias de aplanamiento progresivamente inferiores a medida que la escena se escala verticalmente, con el fin de mantener la fidelidad visual y evitar el escalado de artefactos. Del mismo modo, a medida que la escena se reduce verticalmente, la aplicación debe volver a crear las realizaciones de geometría con tolerancias de acoplamiento progresivamente más altas, con el fin de evitar que los detalles de representación se pierdan que no son visibles. La aplicación no debe volver a crear las realizaciones de geometría cada vez que cambia la escala, ya que al hacerlo se anula el propósito de almacenar en caché el trabajo de teselación. En su lugar, la aplicación debe volver a crear las realizaciones de geometría con menos frecuencia: por ejemplo, después de cada 2 veces aumento o disminución de la escala.

Cada vez que cambia la escala en una aplicación en respuesta a la interacción del usuario, la aplicación podría comparar la nueva escala con la escala a la que se crearon por última vez las realizaciones de geometría (almacenadas, por ejemplo, en un miembro m_lastScale ). Si los dos valores están cerrados (en este caso, dentro de un factor de 2), no se realiza ninguna otra acción. Pero si los dos valores no están cerca, se vuelven a crear las realizaciones de geometría. La función ComputeFlatteningTolerance se usa para calcular una tolerancia de aplanamiento adecuada para la nueva escala y m_lastScale se actualiza a la nueva escala.

Además, la aplicación siempre crea realizaciones con una tolerancia menor que la que normalmente se usaría para la nueva escala, pasando un valor de 2 como el parámetro maxZoomFactor a ComputeFlatteningTolerance. Esto permite escalar verticalmente las nuevas realizaciones de geometría mediante un factor adicional de 2 sin incurrir en artefactos de escalado.

Nota

Es posible que el enfoque descrito aquí no sea adecuado para todas las aplicaciones. Por ejemplo, si la aplicación permite que la escena se escale con factores muy grandes muy rápidamente (por ejemplo, si contiene un control deslizante de "zoom" que se puede mover del 100 % al 1000,000 % en el intervalo de unos pocos fotogramas), este enfoque puede dar lugar a un exceso de trabajo mediante la recreación de las realizaciones de geometría en cada fotograma. Un enfoque alternativo consiste en volver a crear las realizaciones de geometría solo después de que se haya completado cada manipulación de la escala de la escena (por ejemplo, después de que el usuario haya completado un gesto de reducir).

 

Información general sobre las geometrías

Mejora del rendimiento de las aplicaciones de Direct2D

Directrices generales para representar contenido estático complejo

ID2D1DeviceContext1

ID2D1GeometryRealization

Función ComputeFlatteningTolerance