我现在正在编写一个模拟程序,我想将我的应用程序从使用 GDI 移植到使用 Direct2D。但是我的 Direct2D 代码比我的 GDI 代码慢得多。
我在屏幕上渲染了很多椭圆。在我的 GDI 应用程序中,我绘制到内存设备上下文,然后使用 BitBlt 在 Windows 设备上下文上绘制。使用 Direct2D,我在 ID2D1HwndRenderTarget 上绘图。
我的问题是,当使用 GDI 时,我可以轻松绘制 400 多个椭圆并且仍然有 400 FPS。当我用 Direct2D 做相同数量的椭圆时,我的 FPS 下降到 30FPS。
我已经关闭了抗锯齿,但它并没有真正帮助。有趣的是,与 GDI 相比,在 Direct2D 中仅绘制几个椭圆会更快。我可以做些什么来提高 Direct2D 的性能,还是应该让我的应用程序继续使用 GDI?
这是我使用 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);
}
在我的 Begin 和 End 函数之间,我以标准 GDI 方式绘制椭圆。
这是我使用 Direct2D 的开始和结束函数:
VOID BeginDrawing() {
this->RenderTarget->BeginDraw();
RenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
RenderTarget->SetTransform(this->ScalingMatrix * this->TranslateMatrix);
}
VOID EndDrawing() {
this->RenderTarget->EndDraw();
}
下面是我设置 Direct2D 接口的方法。一切都在课堂上;这就是为什么我不能发布完整的代码:
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);
先感谢您。