Condividi tramite


Destinazioni di rendering, dispositivi e risorse

Una destinazione di rendering è semplicemente la posizione in cui verrà disegnato il programma. In genere, la destinazione di rendering è una finestra (in particolare, l'area client della finestra). Potrebbe anche essere una bitmap in memoria non visualizzata. Una destinazione di rendering è rappresentata dall'interfaccia ID2D1RenderTarget .

Un dispositivo è un'astrazione che rappresenta ciò che disegna effettivamente i pixel. Un dispositivo hardware usa la GPU per prestazioni più veloci, mentre un dispositivo software usa la CPU. L'applicazione non crea il dispositivo. Al contrario, il dispositivo viene creato in modo implicito quando l'applicazione crea la destinazione di rendering. Ogni destinazione di rendering è associata a un particolare dispositivo, sia hardware che software.

diagramma che mostra la relazione tra una destinazione di rendering e un dispositivo.

Una risorsa è un oggetto utilizzato dal programma per il disegno. Ecco alcuni esempi di risorse definite in Direct2D:

  • Pennello. Controlla la modalità di disegno delle linee e delle aree. I tipi di pennello includono pennelli a tinta unita e pennelli sfumato.
  • Stile tratto. Controlla l'aspetto di una linea, ad esempio tratteggiata o continua.
  • Geometria. Rappresenta una raccolta di linee e curve.
  • Mesh. Forma formata da triangoli. I dati mesh possono essere utilizzati direttamente dalla GPU, a differenza dei dati geometry, che devono essere convertiti prima del rendering.

Le destinazioni di rendering sono considerate anche un tipo di risorsa.

Alcune risorse traggono vantaggio dall'accelerazione hardware. Una risorsa di questo tipo è sempre associata a un particolare dispositivo, hardware (GPU) o software (CPU). Questo tipo di risorsa è denominato dipendente dal dispositivo. I pennelli e le mesh sono esempi di risorse dipendenti dal dispositivo. Se il dispositivo non è più disponibile, la risorsa deve essere ricreata per un nuovo dispositivo.

Altre risorse vengono mantenute nella memoria della CPU, indipendentemente dal dispositivo usato. Queste risorse sono indipendenti dal dispositivo, perché non sono associate a un determinato dispositivo. Non è necessario ricreare le risorse indipendenti dal dispositivo quando il dispositivo cambia. Gli stili e le geometrie dei tratti sono risorse indipendenti dal dispositivo.

La documentazione di Windows per ogni risorsa indica se la risorsa è dipendente dal dispositivo o indipendente dal dispositivo. Ogni tipo di risorsa è rappresentato da un'interfaccia che deriva da ID2D1Resource. Ad esempio, i pennelli sono rappresentati dall'interfaccia ID2D1Brush .

Oggetto Factory Direct2D

Il primo passaggio quando si usa Direct2D consiste nel creare un'istanza dell'oggetto factory Direct2D. Nella programmazione computer, una factory è un oggetto che crea altri oggetti. La factory Direct2D crea i tipi di oggetti seguenti:

  • Destinazioni di rendering.
  • Risorse indipendenti dal dispositivo, ad esempio stili di tratto e geometrie.

Le risorse dipendenti dal dispositivo, ad esempio pennelli e bitmap, vengono create dall'oggetto di destinazione di rendering.

diagramma che mostra la factory direct2d.

Per creare l'oggetto factory Direct2D, chiamare la funzione D2D1CreateFactory.

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

Il primo parametro è un flag che specifica le opzioni di creazione. Il flag D2D1_FACTORY_TYPE_SINGLE_THREADED significa che non si chiamerà Direct2D da più thread. Per supportare le chiamate da più thread, specificare D2D1_FACTORY_TYPE_MULTI_THREADED. Se il programma usa un singolo thread per chiamare in Direct2D, l'opzione a thread singolo è più efficiente.

Il secondo parametro della funzione D2D1CreateFactory riceve un puntatore all'interfaccia ID2D1Factory.

È necessario creare l'oggetto factory Direct2D prima del primo messaggio di WM_PAINT . Il gestore di messaggi WM_CREATE è un buon posto per creare la factory:

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

Creazione di risorse Direct2D

Il programma Circle usa le risorse dipendenti dal dispositivo seguenti:

  • Destinazione di rendering associata alla finestra dell'applicazione.
  • Pennello a tinta unita per disegnare il cerchio.

Ognuna di queste risorse è rappresentata da un'interfaccia COM:

Il programma Circle archivia i puntatori a queste interfacce come variabili membro della MainWindow classe :

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

Il codice seguente crea queste due risorse.

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

Per creare una destinazione di rendering per una finestra, chiamare il metodo ID2D1Factory::CreateHwndRenderTarget nella factory Direct2D.

  • Il primo parametro specifica le opzioni comuni a qualsiasi tipo di destinazione di rendering. In questo caso si passano le opzioni predefinite chiamando la funzione helper D2D1::RenderTargetProperties.
  • Il secondo parametro specifica l'handle della finestra più le dimensioni della destinazione di rendering, in pixel.
  • Il terzo parametro riceve un puntatore ID2D1HwndRenderTarget.

Per creare il pennello a tinta unita, chiamare il metodo ID2D1RenderTarget::CreateSolidColorBrush nella destinazione di rendering. Il colore viene assegnato come valore D2D1_COLOR_F. Per altre informazioni sui colori in Direct2D, vedere Uso del colore in Direct2D.

Si noti inoltre che se la destinazione di rendering esiste già, il CreateGraphicsResources metodo restituisce S_OK senza eseguire alcuna operazione. Il motivo di questa progettazione diventerà chiaro nell'argomento successivo.

Avanti

Disegno con Direct2D