Información general sobre los recursos

Un recurso de Direct2D es un objeto que se usa para dibujar y se representa mediante una interfaz direct2D, como ID2D1Geometry o ID2D1RenderTarget. En este tema se describen los tipos de recursos de Direct2D y cómo se pueden compartir.

Este tema contiene las siguientes secciones:

Acerca de los recursos de Direct2D

Muchas API 2D aceleradas por hardware están diseñadas en torno a un modelo de recursos centrado en la CPU y un conjunto de operaciones de representación que funcionan bien en cpu. A continuación, alguna parte de la API se acelera por hardware. La implementación de estas API requiere un administrador de recursos para asignar recursos de CPU a recursos en la GPU. Debido a las limitaciones de GPU, es posible que algunas operaciones no se puedan acelerar en todas las circunstancias. En estos casos, el administrador de recursos debe comunicarse entre la CPU y la GPU (que es costosa) para que pueda realizar la transición a la representación de CPU. En algunos casos, podría forzar de forma impredecible la representación para revertir completamente a la CPU. Además, las operaciones de representación que aparecen simples pueden requerir pasos de representación intermedios temporales que no se exponen en la API y que requieren recursos adicionales de GPU.

Direct2D proporciona una asignación más directa para hacer un uso completo de la GPU. Proporciona dos categorías de recursos: independientes del dispositivo y dependientes del dispositivo.

  • Los recursos independientes del dispositivo, como ID2D1Geometry, se mantienen en la CPU.
  • Los recursos dependientes del dispositivo, como ID2D1RenderTarget e ID2D1LinearGradientBrush, se asignan directamente a los recursos de la GPU (cuando la aceleración de hardware está disponible). Las llamadas de representación se realizan combinando información de vértices y cobertura de una geometría con información de texturización generada por los recursos dependientes del dispositivo.

Al crear recursos dependientes del dispositivo, los recursos del sistema (la GPU, si están disponibles o la CPU) se asignan cuando se crea el dispositivo y no cambian de una operación de representación a otra. Esta situación elimina la necesidad de un administrador de recursos. Además de las mejoras generales de rendimiento proporcionadas por la eliminación de un administrador de recursos, este modelo permite controlar directamente cualquier representación intermedia.

Dado que Direct2D proporciona tanto control sobre los recursos, debe comprender los diferentes tipos de recursos y cuándo se pueden usar juntos.

recursos de Device-Independent

Como se describe en la sección anterior, los recursos independientes del dispositivo siempre residen en la CPU y nunca están asociados a un dispositivo de representación de hardware. A continuación se muestran los recursos independientes del dispositivo:

Use un id2D1Factory, en sí mismo un recurso independiente del dispositivo, para crear recursos independientes del dispositivo. (Para crear un generador, use la función CreateFactory ).

Excepto para los destinos de representación, todos los recursos creados por una factoría son independientes del dispositivo. Un destino de representación es un recurso dependiente del dispositivo.

recursos de Device-Dependent

Cualquier recurso que no tenga nombre en la lista anterior es un recurso dependiente del dispositivo. Los recursos dependientes del dispositivo están asociados a un dispositivo de representación determinado. Cuando la aceleración de hardware está disponible, ese dispositivo es la GPU. En otros casos, es la CPU.

Para crear la mayoría de los recursos dependientes del dispositivo, use un destino de representación. En la mayoría de los casos, use un generador para crear un destino de representación.

A continuación se muestran ejemplos de recursos dependientes del dispositivo:

  • ID2D1Brush y las interfaces que heredan de él. Use un destino de representación para crear pinceles.
  • ID2D1Layer. Use un destino de representación para crear capas.
  • ID2D1RenderTarget y las interfaces que heredan de él. Para crear un destino de representación, use un generador u otro destino de representación.

Nota

A partir de Windows 8, hay nuevas interfaces que crean recursos dependientes del dispositivo. Id2D1Device y id2D1DeviceContext pueden compartir un recurso si el contexto del dispositivo y el recurso se crean a partir del mismo ID2D1Device.

 

Los recursos dependientes del dispositivo se vuelven inutilizables cuando los dispositivos de representación asociados dejan de estar disponibles. Esto significa que, al recibir el error de D2DERR_RECREATE_TARGET para un destino de representación, debe volver a crear el destino de representación y todos sus recursos.

Uso compartido de recursos de fábrica

Puede compartir todos los recursos independientes del dispositivo creados por una fábrica con todos los demás recursos (independientes del dispositivo o dependientes del dispositivo) creados por la misma fábrica. Por ejemplo, puede usar dos objetos ID2D1RenderTarget para dibujar el mismo ID2D1RectangleGeometry si ambos objetos ID2D1RenderTarget fueron creados por la misma fábrica.

Las interfaces de receptor (ID2D1SimplifiedGeometrySink, ID2D1GeometrySink y ID2D1TessellationSink) se pueden compartir con los recursos creados por cualquier fábrica. A diferencia de otras interfaces de Direct2D, se puede usar cualquier implementación de una interfaz de receptor. Por ejemplo, podría usar su propia implementación de ID2D1SimplifiedGeometrySink.

Uso compartido de recursos de destino de representación

La capacidad de compartir recursos creados por un destino de representación depende del tipo de destino de representación. Al crear un destino de representación de tipo D2D1_RENDER_TARGET_TYPE_DEFAULT, los recursos creados por ese destino de representación solo se pueden usar en ese destino de representación (a menos que el destino de representación se ajuste a una de las categorías descritas en las secciones siguientes). Esto se produce porque no sabe qué dispositivo terminará usando el destino de representación; podría acabar con la representación en hardware, software o hardware local de un cliente remoto. Por ejemplo, podría escribir un programa que deje de funcionar cuando se muestre de forma remota o cuando el destino de representación aumente de tamaño más allá del tamaño máximo admitido por el hardware de representación.

En las secciones siguientes se describen las circunstancias en las que se puede compartir un recurso creado por un destino de representación con otro destino de representación.

Destinos de representación de hardware

Puede compartir recursos entre cualquier destino de representación que use explícitamente hardware, siempre y cuando el modo de comunicación remota sea compatible. Solo se garantiza que el modo de comunicación remota es compatible cuando ambos destinos de representación usan la marca de uso D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING o D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE , o si no se especifica ninguna marca. Esta configuración garantiza que los recursos siempre se ubicarán en el mismo equipo. Para especificar un modo de uso, establezca el campo de uso de la estructura de D2D1_RENDER_TARGET_PROPERTIES que usó para crear el destino de representación con una o varias marcas de D2D1_RENDER_TARGET_USAGE .

Para crear un destino de representación que use explícitamente la representación de hardware, establezca el campo de tipo de la estructura de D2D1_RENDER_TARGET_PROPERTIES que usó para crear el destino de representación en D2D1_RENDER_TARGET_TYPE_HARDWARE.

Destinos de representación de Surface DXGI

Puede compartir recursos creados por un destino de representación de superficie DXGI con cualquier otro destino de representación de superficie DXGI que use el mismo dispositivo Direct3D subyacente.

Destinos de representación compatibles y mapas de bits compartidos

Puede compartir recursos entre un destino de representación y destinos de representación compatibles creados por ese destino de representación. Para crear un destino de representación compatible, use el método ID2D1RenderTarget::CreateCompatibleRenderTarget .

Puede usar el método ID2D1RenderTarget::CreateSharedBitmap para crear un ID2D1Bitmap que se pueda compartir entre los dos destinos de representación especificados en la llamada al método, si el método se realiza correctamente. Este método se realizará correctamente siempre que los dos destinos de representación usen el mismo dispositivo subyacente para la representación.