GDI versus Direct2D

Ich bin die Programmierung einer simulation im moment, und ich will mein port Anwendung von der Verwendung von GDI mit Direct2D. Aber meine Direct2D-code ist wesentlich langsamer als meine GDI-code.

Ich machen eine Menge von Ellipsen auf dem Bildschirm. In meinem GDI Anwendung ich ziehen, um einen Speicher-Gerätekontext und verwenden Sie dann BitBlt zu ziehen auf den windows-Gerätekontext. Mit Direct2D, ich zeichne auf ein ID2D1HwndRenderTarget.

Mein Problem ist, bei der Verwendung von GDI, ich kann ziehen leicht 400+ Ellipsen und haben noch 400 FPS. Wenn ich die gleiche Anzahl von Ellipsen mit Direct2D, meine FPS sinkt auf 30FPS.

Ich schon umgestiegen antialiasing ausschalten, aber es spielt nicht wirklich helfen. Das interessante an der Sache ist, dass die Zeichnung nur ein paar Ellipsen ist schneller in Direct2D im Vergleich zu GDI. Kann ich irgendetwas tun zur Verbesserung der Leistung in Direct2D, oder sollte ich meine Anwendung mit GDI?

Hier ist meine Zeichnung code mit GDI:

VOID Begin() {
    SelectObject(this->MemDeviceContext, this->MemoryBitmap);
    this->BackgroundBrush = CreateSolidBrush(this->BackgroundColor);
    HBRUSH OldBrush = (HBRUSH)SelectObject(this->MemDeviceContext, this->BackgroundBrush);
    Rectangle(this->MemDeviceContext, -1, -1, 801, 601);
    SelectObject(this->MemDeviceContext, OldBrush);
    DeleteObject(this->BackgroundBrush);
    SetViewportOrgEx(this->MemDeviceContext, 400, 300, &this->OldOrigin);
}
VOID End() {
    SetViewportOrgEx(this->MemDeviceContext, this->OldOrigin.x, this->OldOrigin.y, 0);
    BitBlt(this->DeviceContext, 0, 0, 800, 600, this->MemDeviceContext, 0, 0, SRCCOPY);
}

Zwischen dem Begin-und End-Funktion, ziehe ich meine Ellipsen die standard-GDI-Weg.

Hier sind meine die begin-und end-Funktionen, die mit Direct2D:

VOID BeginDrawing() {
    this->RenderTarget->BeginDraw();
    RenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
    RenderTarget->SetTransform(this->ScalingMatrix * this->TranslateMatrix);
}
VOID EndDrawing() {
    this->RenderTarget->EndDraw();
}

Und hier ist, wie ich meine Direct2D-Schnittstellen. Es ist alles eingewickelt in der Klasse; das ist, warum ich kann nicht nach der vollständige code:

    if(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &Direct2DFactory) != S_OK)
        throw std::runtime_error("RENDERWINDOW::InitializeDirect2D: Failed to create a factory interface.");
    RECT WindowRect;
    memset(&WindowRect, 0, sizeof(RECT));
    GetClientRect(this->WndHandle, &WindowRect);
    D2D1_SIZE_U WindowSize = D2D1::SizeU(WindowRect.right, WindowRect.bottom);
    Direct2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_HARDWARE), 
    D2D1::HwndRenderTargetProperties(this->WndHandle, WindowSize, D2D1_PRESENT_OPTIONS_IMMEDIATELY), &RenderTarget);

Vielen Dank im Voraus.

Sie zeigen nicht die Zeichnung code von D2D
Die Zeichnung code ist standerd Direct2D code zum zeichnen einer ellipse. Ich benutze die FillEllipse und DrawEllipse Funktion und sonst nichts, das ist, warum ich mich nicht per post.
Der Hauptgrund für die Einführung von Direct2D wurde eine neue, saubere API und das Basis-framework für DirectWrite. Zeichnen von Text ist die heutige teuersten Betrieb und DirectWrite hat eine große Verbesserung der Geschwindigkeit für qualitativ hochwertige Texte. Vielleicht sollten Sie überlegen, Tests mit anderen basic-Zeichnung primitiven. Ich bezweifle, dass deine app nur zeichnen von Ellipsen.

InformationsquelleAutor roohan | 2012-11-08

Schreibe einen Kommentar