Compartir a través de


Destinos de representación, dispositivos y recursos

Un destino de representación es simplemente la ubicación donde dibujará el programa. Normalmente, el destino de representación es una ventana (en concreto, el área cliente de la ventana). También podría ser un mapa de bits en la memoria que no se muestra. Un destino de representación se representa mediante la interfaz ID2D1RenderTarget .

Un dispositivo es una abstracción que representa lo que realmente dibuja los píxeles. Un dispositivo de hardware usa la GPU para un rendimiento más rápido, mientras que un dispositivo de software usa la CPU. La aplicación no crea el dispositivo. En su lugar, el dispositivo se crea implícitamente cuando la aplicación crea el destino de representación. Cada destino de representación está asociado a un dispositivo determinado, ya sea hardware o software.

diagrama que muestra la relación entre un destino de representación y un dispositivo.

Un recurso es un objeto que el programa usa para dibujar. Estos son algunos ejemplos de recursos definidos en Direct2D:

  • Pincel. Controla cómo se pintan las líneas y las regiones. Los tipos de pincel incluyen pinceles de color sólido y pinceles degradados.
  • Estilo de trazo. Controla la apariencia de una línea, por ejemplo, discontinua o sólida.
  • Geometría. Representa una colección de líneas y curvas.
  • Malla. Forma formada por triángulos. Los datos de malla se pueden consumir directamente mediante la GPU, a diferencia de los datos de geometría, que se deben convertir antes de la representación.

Los destinos de representación también se consideran un tipo de recurso.

Algunos recursos se benefician de la aceleración de hardware. Un recurso de este tipo siempre está asociado a un dispositivo determinado, ya sea hardware (GPU) o software (CPU). Este tipo de recurso se denomina dependiente del dispositivo. Los pinceles y mallas son ejemplos de recursos dependientes del dispositivo. Si el dispositivo deja de estar disponible, se debe volver a crear el recurso para un nuevo dispositivo.

Otros recursos se mantienen en memoria de CPU, independientemente del dispositivo que se use. Estos recursos son independientes del dispositivo, ya que no están asociados a un dispositivo determinado. No es necesario volver a crear recursos independientes del dispositivo cuando cambie el dispositivo. Los estilos y geometrías de trazo son recursos independientes del dispositivo.

La documentación de MSDN para cada recurso indica si el recurso es dependiente del dispositivo o independiente del dispositivo. Cada tipo de recurso se representa mediante una interfaz que deriva de ID2D1Resource. Por ejemplo, los pinceles se representan mediante la interfaz ID2D1Brush .

El objeto de fábrica de Direct2D

El primer paso al usar Direct2D es crear una instancia del objeto de fábrica de Direct2D. En la programación de equipos, un generador es un objeto que crea otros objetos. La fábrica de Direct2D crea los siguientes tipos de objetos:

  • Destinos de representación.
  • Recursos independientes del dispositivo, como estilos de trazo y geometrías.

Los recursos dependientes del dispositivo, como pinceles y mapas de bits, se crean mediante el objeto de destino de representación.

un diagrama que muestra el generador de direct2d.

Para crear el objeto de fábrica de Direct2D, llame a la función D2D1CreateFactory .

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

El primer parámetro es una marca que especifica las opciones de creación. La marca D2D1_FACTORY_TYPE_SINGLE_THREADED significa que no llamarás a Direct2D desde varios subprocesos. Para admitir llamadas desde varios subprocesos, especifique D2D1_FACTORY_TYPE_MULTI_THREADED. Si el programa usa un único subproceso para llamar a Direct2D, la opción de subproceso único es más eficaz.

El segundo parámetro de la función D2D1CreateFactory recibe un puntero a la interfaz ID2D1Factory .

Debe crear el objeto de fábrica direct2D antes del primer mensaje de WM_PAINT . El controlador de mensajes WM_CREATE es un buen lugar para crear el generador:

    case WM_CREATE:
        if (FAILED(D2D1CreateFactory(
                D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
        {
            return -1;  // Fail CreateWindowEx.
        }
        return 0;

Creación de recursos de Direct2D

El programa Circle usa los siguientes recursos dependientes del dispositivo:

  • Destino de representación asociado a la ventana de la aplicación.
  • Pincel de color sólido para pintar el círculo.

Cada uno de estos recursos se representa mediante una interfaz COM:

El programa Circle almacena punteros a estas interfaces como variables miembro de la MainWindow clase :

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

El código siguiente crea estos dos recursos.

HRESULT MainWindow::CreateGraphicsResources()
{
    HRESULT hr = S_OK;
    if (pRenderTarget == NULL)
    {
        RECT rc;
        GetClientRect(m_hwnd, &rc);

        D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);

        hr = pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(m_hwnd, size),
            &pRenderTarget);

        if (SUCCEEDED(hr))
        {
            const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
            hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);

            if (SUCCEEDED(hr))
            {
                CalculateLayout();
            }
        }
    }
    return hr;
}

Para crear un destino de representación para una ventana, llame al método ID2D1Factory::CreateHwndRenderTarget en el generador de Direct2D.

  • El primer parámetro especifica las opciones que son comunes a cualquier tipo de destino de representación. Aquí, pasamos las opciones predeterminadas llamando a la función auxiliar D2D1::RenderTargetProperties.
  • El segundo parámetro especifica el identificador de la ventana más el tamaño del destino de representación, en píxeles.
  • El tercer parámetro recibe un puntero ID2D1HwndRenderTarget .

Para crear el pincel de color sólido, llame al método ID2D1RenderTarget::CreateSolidColorBrush en el destino de representación. El color se da como un valor de D2D1_COLOR_F . Para obtener más información sobre los colores en Direct2D, consulta Usar color en Direct2D.

Además, observe que si el destino de representación ya existe, el CreateGraphicsResources método devuelve S_OK sin hacer nada. El motivo de este diseño quedará claro en el tema siguiente.

Siguientes

Dibujo con Direct2D