我一直在用GDI+写一个台球游戏。我投入了大量的时间,而且我的表现很差。当我真的想要50-60帧的时候,平均每秒13帧。我已经开始优化我的代码,但是我最大的瓶颈看起来并不能变得更好。仅仅绘制和填充几个多边形就需要20毫秒。
我已经读到,GDI+不能接近硬件来获得性能,而Direct2D则是这样。因为我没有专用的显卡,所以如果我用Direct2D重写这个项目,我不确定性能会有什么提高。这是真的吗?我愿意这样做,但我不想花几个小时重写它,除非有一个很好的机会,表现会更好。
编辑这个函数是我最大的瓶颈。我使用std::clock来超时函数的不同部分。我已经标记了不同的部分作为评论。
平均而言,第1段画9毫秒,第2段画8毫秒,第3段画1.5毫秒。我假设段1需要一段时间,因为它使用的是TextureBrush,它使用的是图像。段2是一个有25个顶点的多边形。我真的不知道我能不能把这个数目减少。还有什么我能做的吗?
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函数,该函数将对每个游戏对象调用一个绘制函数(该函数将图形对象作为参数)。
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);
...
}
发布于 2022-03-24 08:52:43
GDI+根本不使用硬件,不像GDI那样,对BitBlt的调用是硬件加速的。事实上,所有返回布尔值的GDI调用都是由硬件支持的,至少在某种程度上是这样。
在广泛使用了这两个API之后,重写渲染器以使用Direct2D肯定会大大提高性能--即使没有“专用”视频卡,我也认为安装在系统中的适配器支持Direct3D 11.x,这就是您所需要的。
我会鼓励你坚持下去。如果你被卡住了,你随时都可以来这里。
https://stackoverflow.com/questions/62049839
复制相似问题