Renderziele, Geräte und Ressourcen

Ein Renderziel ist einfach die Stelle, an der Ihr Programm die Zeichnung ausführt. In der Regel ist das Renderziel ein Fenster (genauer gesagt, der Clientbereich eines Fensters). Es kann sich auch um eine Bitmap im Arbeitsspeicher handeln, die nicht angezeigt wird. Ein Renderziel wird durch die Schnittstelle ID2D1RenderTarget dargestellt.

Ein Gerät ist eine Abstraktion zur Darstellung der Einheit, die die Pixel tatsächlich zeichnet. Ein hardwarebasiertes Gerät verwendet die GPU für eine schnellere Leistung, während ein softwarebasiertes Gerät die CPU verwendet. Das Gerät wird nicht von der Anwendung erstellt. Das Gerät wird stattdessen implizit erstellt, wenn die Anwendung das Renderziel erstellt. Jedes Renderziel ist einem bestimmten Gerät (hardware- oder softwarebasiert) zugeordnet.

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

Eine Ressource ist ein Objekt, das vom Programm zum Zeichnen verwendet wird. Dies sind einige Beispiele für Ressourcen, die in Direct2D definiert sind:

  • Pinsel. Steuert die Art der Zeichnung von Linien und Bereichen. Pinseltypen umfassen Pinsel mit Volltonfarbe und Pinsel mit Farbverlauf.
  • Strich. Strichtypen steuern die Darstellung einer Linie, z. B. gestrichelt oder einfarbig.
  • Geometrie. Eine Geometrie stellt eine Sammlung von Linien und Kurven dar.
  • Gitter. Gitter werden aus Dreiecken gebildet. Im Gegensatz zu Geometriedaten, die vor dem Rendern konvertiert werden müssen, können Gitterdaten direkt von der GPU genutzt werden.

Renderziele werden auch als Ressourcentyp betrachtet.

Einige Ressourcen profitieren von einer Hardwarebeschleunigung. Eine Ressource dieses Typs ist stets einem bestimmten Gerät zugeordnet, hardwarebasiert (GPU) oder softwarebasiert (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 bleiben unabhängig vom verwendeten Gerät im CPU-Speicher gespeichert. Diese Ressourcen sind geräteunabhängig, da sie keinem bestimmten Gerät zugeordnet sind. Geräteunabhängige Ressourcen müssen nicht neu erstellt werden, wenn das Gerät geändert wird. Strichtypen und Geometrien sind geräteunabhängige Ressourcen.

Die Windows-Dokumentation für die einzelnen Ressourcen gibt an, ob eine Ressource geräteabhängig oder geräteunabhängig ist. Jeder Ressourcentyp wird durch eine Schnittstelle dargestellt, die von ID2D1Resource abgeleitet wird. Beispielsweise werden Pinsel durch die Schnittstelle ID2D1Brush dargestellt.

Das Direct2D-Factoryobjekt

Der erste Schritt bei der Verwendung von Direct2D besteht in der Erstellung einer Instanz des Direct2D-Factoryobjekts. In der Programmierung ist ein Factoryobjekt ein Objekt, das andere Objekte erstellt. Das Direct2D-Factoryobjekt erstellt die folgenden Objekttypen:

  • Renderziele.
  • Geräteunabhängige Ressourcen wie Strichtypen und Geometrien.

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

Ein Diagramm mit dem Direct2D-Factoryobjekt.

Zum Erstellen des Direct2D-Factoryobjekts muss die Funktion D2D1CreateFactory aufgerufen werden.

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

Der erste Parameter ist ein Flag, das die Erstellungsoptionen angibt. Das Flag D2D1_FACTORY_TYPE_SINGLE_THREADED gibt an, dass Direct2D nicht aus mehreren Threads aufgerufen wird. Um Aufrufe aus mehreren Threads zu unterstützen, muss D2D1_FACTORY_TYPE_MULTI_THREADED angegeben werden. Wenn Ihr Programm einen einzelnen Thread für den Aufruf von Direct2D verwendet, ist die Singlethread-Option effizienter.

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

Sie sollten das Direct2D-Factoryobjekt vor der ersten WM_PAINT-Nachricht erstellen. Der Nachrichtenhandler WM_CREATE ist eine gute Stelle für die Erstellung des Factoryobjekts:

    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 mit dem Anwendungsfenster verknüpft ist.
  • Ein Volltonfarbenpinsel zum Zeichnen des Kreises.

Jede dieser Ressourcen wird durch eine COM-Schnittstelle dargestellt:

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

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

Der folgende Code erstellt diese beiden Ressourcen.

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

Rufen Sie zum Erstellen eines Renderziels für ein Fenster die Methode ID2D1Factory::CreateHwndRenderTarget für das Direct2D-Factoryobjekt auf.

  • Der erste Parameter gibt Optionen an, die allen Renderzieltypen gemeinsam sind. Hier werden Standardoptionen durch den Aufruf der Hilfsfunktion D2D1::RenderTargetProperties übergeben.
  • Der zweite Parameter gibt das Handle für das Fenster sowie die Größe des Renderziels in Pixeln an.
  • Der dritte Parameter empfängt einen ID2D1HwndRenderTarget-Zeiger.

Zum Erstellen des Volltonfarbenpinsels wird die Methode ID2D1RenderTarget::CreateSolidColorBrush für das Renderziel aufgerufen. 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 die Methode CreateGraphicsResources den Wert S-OK zurückgibt, ohne dass etwas ausgeführt wird. Der Grund für dieses Design wird im nächsten Thema erklärt.

Nächste

Zeichnen mit Direct2D