首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Direct2D与没有专用图形卡的GDI+

Direct2D与没有专用图形卡的GDI+
EN

Stack Overflow用户
提问于 2020-05-27 17:59:10
回答 1查看 259关注 0票数 1

我一直在用GDI+写一个台球游戏。我投入了大量的时间,而且我的表现很差。当我真的想要50-60帧的时候,平均每秒13帧。我已经开始优化我的代码,但是我最大的瓶颈看起来并不能变得更好。仅仅绘制和填充几个多边形就需要20毫秒。

我已经读到,GDI+不能接近硬件来获得性能,而Direct2D则是这样。因为我没有专用的显卡,所以如果我用Direct2D重写这个项目,我不确定性能会有什么提高。这是真的吗?我愿意这样做,但我不想花几个小时重写它,除非有一个很好的机会,表现会更好。

编辑这个函数是我最大的瓶颈。我使用std::clock来超时函数的不同部分。我已经标记了不同的部分作为评论。

平均而言,第1段画9毫秒,第2段画8毫秒,第3段画1.5毫秒。我假设段1需要一段时间,因为它使用的是TextureBrush,它使用的是图像。段2是一个有25个顶点的多边形。我真的不知道我能不能把这个数目减少。还有什么我能做的吗?

代码语言:javascript
运行
复制
void CTable::Draw(Gdiplus::Graphics* graphics)
{
    // Segment 1
    graphics->FillRectangle(&woodBrush, mTLTable.X, mTLTable.Y, mLenTable, mWidTable);

    // Segment 2
    graphics->FillRectangle(&felt, mTLFelt.X, mTLFelt.Y, mFeltLen + 2 * mRailWid, mFeltWid + 2 * mRailWid);
    graphics->DrawPath(&feltBorder, &mFelt);

    // Segment 3
    graphics->FillPath(&pocketBrush, &mTLPocket);
    graphics->FillPath(&pocketBrush, &mBRPocket);
    graphics->FillPath(&pocketBrush, &mTRPocket);
    graphics->FillPath(&pocketBrush, &mBLPocket);
    graphics->FillPath(&pocketBrush, &mTMPocket);
    graphics->FillPath(&pocketBrush, &mBMPocket);
}

下面是创建图形对象的方式。图形对象传递给OnDraw函数,该函数将对每个游戏对象调用一个绘制函数(该函数将图形对象作为参数)。

代码语言:javascript
运行
复制
void CChildView::OnPaint()
{
    CPaintDC paintDC(this);     // device context for painting
    CDoubleBufferDC dc(&paintDC); // device context for painting
    Graphics graphics(dc.m_hDC);    // Create GDI+ graphics context
    mGame.OnDraw(&graphics);
    ...
}
EN

回答 1

Stack Overflow用户

发布于 2022-03-24 08:52:43

GDI+根本不使用硬件,不像GDI那样,对BitBlt的调用是硬件加速的。事实上,所有返回布尔值的GDI调用都是由硬件支持的,至少在某种程度上是这样。

在广泛使用了这两个API之后,重写渲染器以使用Direct2D肯定会大大提高性能--即使没有“专用”视频卡,我也认为安装在系统中的适配器支持Direct3D 11.x,这就是您所需要的。

我会鼓励你坚持下去。如果你被卡住了,你随时都可以来这里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62049839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档