Renderziele, Geräte und Ressourcen

Ein Renderziel ist einfach der Ort, an dem Ihr Programm zeichnet. In der Regel ist das Renderziel ein Fenster (insbesondere der Clientbereich des Fensters). Es kann sich auch um eine Bitmap im Arbeitsspeicher handeln, die nicht angezeigt wird. Ein Renderziel wird durch die ID2D1RenderTarget-Schnittstelle dargestellt.

Ein Gerät ist eine Abstraktion, die das darstellt, was die Pixel tatsächlich zeichnet. Ein Hardwaregerät verwendet die GPU für eine schnellere Leistung, während ein Softwaregerät die CPU verwendet. Die Anwendung erstellt das Gerät nicht. Stattdessen wird das Gerät implizit erstellt, wenn die Anwendung das Renderziel erstellt. Jedes Renderziel ist einem bestimmten Gerät zugeordnet, entweder Hardware oder Software.

Ein Diagramm, das die Beziehung zwischen einem Renderziel und einem Gerät zeigt.

Eine Ressource ist ein Objekt, das das Programm zum Zeichnen verwendet. Im Folgenden finden Sie einige Beispiele für Ressourcen, die in Direct2D definiert sind:

  • Pinsel. Steuert, wie Linien und Bereiche gezeichnet werden. Pinseltypen umfassen Vollfarbpinsel und Farbverlaufspinsel.
  • Strichstil. Steuert die Darstellung einer Linie, z. B. gestrichelt oder durchgezogen.
  • Geometrie. Stellt eine Auflistung von Linien und Kurven dar.
  • Gitter. Eine Form, die aus Dreiecken gebildet wird. Mesh-Daten können direkt von der GPU genutzt werden, im Gegensatz zu Geometriedaten, die vor dem Rendern konvertiert werden müssen.

Renderziele werden auch als Ressourcentyp betrachtet.

Einige Ressourcen profitieren von der Hardwarebeschleunigung. Eine Ressource dieses Typs ist immer einem bestimmten Gerät zugeordnet, entweder Hardware (GPU) oder Software (CPU). Dieser Ressourcentyp wird als geräteabhängig bezeichnet. Pinsel und Gitter sind Beispiele für geräteabhängige Ressourcen. Wenn das Gerät nicht mehr verfügbar ist, muss die Ressource für ein neues Gerät neu erstellt werden.

Andere Ressourcen werden unabhängig davon, welches Gerät verwendet wird, im CPU-Arbeitsspeicher aufbewahrt. Diese Ressourcen sind geräteunabhängig, da sie keinem bestimmten Gerät zugeordnet sind. Es ist nicht erforderlich, geräteunabhängige Ressourcen neu zu erstellen, wenn sich das Gerät ändert. Strichstile und Geometrien sind geräteunabhängige Ressourcen.

In der MSDN-Dokumentation für jede Ressource wird angegeben, ob die Ressource geräteabhängig oder geräteunabhängig ist. Jeder Ressourcentyp wird durch eine Schnittstelle dargestellt, die von ID2D1Resource abgeleitet ist. Beispielsweise werden Pinsel durch die ID2D1Brush-Schnittstelle dargestellt.

Das Direct2D Factory-Objekt

Der erste Schritt bei der Verwendung von Direct2D besteht darin, eine instance des Direct2D-Factoryobjekts zu erstellen. Bei der Computerprogrammierung ist eine Factory ein Objekt, das andere Objekte erstellt. Die Direct2D-Factory erstellt die folgenden Objekttypen:

  • Renderziele.
  • Geräteunabhängige Ressourcen, z. B. Strichstile und Geometrien.

Geräteabhängige Ressourcen, z. B. Pinsel und Bitmaps, werden vom Renderzielobjekt erstellt.

Ein Diagramm, das die Direct2d-Factory zeigt.

Um das Direct2D-Factoryobjekt zu erstellen, rufen Sie die Funktion D2D1CreateFactory auf .

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

Der erste Parameter ist ein Flag, das Erstellungsoptionen angibt. Das flag D2D1_FACTORY_TYPE_SINGLE_THREADED bedeutet, dass Sie Direct2D nicht aus mehreren Threads aufrufen. Um Aufrufe von mehreren Threads zu unterstützen, geben Sie D2D1_FACTORY_TYPE_MULTI_THREADED an. Wenn Ihr Programm einen einzelnen Thread zum Aufrufen in Direct2D verwendet, ist die Singlethreadoption effizienter.

Der zweite Parameter für die Funktion D2D1CreateFactory empfängt einen Zeiger auf die ID2D1Factory-Schnittstelle .

Sie sollten das Direct2D-Factoryobjekt vor der ersten WM_PAINT-Nachricht erstellen. Der WM_CREATE-Nachrichtenhandler ist ein guter Ort, um die Factory zu erstellen:

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

Erstellen von Direct2D-Ressourcen

Das Circle-Programm verwendet die folgenden geräteabhängigen Ressourcen:

  • Ein Renderziel, das dem Anwendungsfenster zugeordnet ist.
  • Ein Volltonpinsel zum Zeichnen des Kreises.

Jede dieser Ressourcen wird durch eine COM-Schnittstelle dargestellt:

Das Circle-Programm speichert Zeiger auf diese Schnittstellen als Membervariablen der MainWindow -Klasse:

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

Mit dem folgenden Code werden diese beiden Ressourcen erstellt.

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

Um ein Renderziel für ein Fenster zu erstellen, rufen Sie die ID2D1Factory::CreateHwndRenderTarget-Methode für die Direct2D-Factory auf.

  • Der erste Parameter gibt Optionen an, die für jeden Renderzieltyp gemeinsam sind. Hier übergeben wir Standardoptionen, indem wir die Hilfsfunktion D2D1::RenderTargetProperties aufrufen.
  • Der zweite Parameter gibt das Handle für das Fenster plus die Größe des Renderziels in Pixel an.
  • Der dritte Parameter empfängt einen ID2D1HwndRenderTarget-Zeiger .

Um den Volltonpinsel zu erstellen, rufen Sie die ID2D1RenderTarget::CreateSolidColorBrush-Methode für das Renderziel auf. Die Farbe wird als D2D1_COLOR_F Wert angegeben. Weitere Informationen zu Farben in Direct2D finden Sie unter Verwenden von Farben in Direct2D.

Beachten Sie außerdem, dass, wenn das Renderziel bereits vorhanden ist, die CreateGraphicsResources Methode S_OK zurückgibt, ohne etwas zu tun. Der Grund für diesen Entwurf wird im nächsten Thema deutlich.

Nächste

Zeichnen mit Direct2D