概述
使用传统的渲染循环发现direct2d占用满CPU,而且是启用垂直同步的情况下。
我就纳闷了,不可能微软是骗人的吧。还“硬件加速”呢,全效渲染,帧率居然比directx9低。
代码使用simplerectangle。
后来发现导致cpu占用过高的代码居然是这个
在BenginDraw 和EndDraw之间的画格子的代码
D2D1_SIZE_F rtSize = m_pRenderTarget->GetSize();
// Draw a grid background.
int width = static_cast<int>(rtSize.width);
int height = static_cast<int>(rtSize.height);
for (int x = 0; x < width; x += 10)
{
m_pRenderTarget->DrawLine(
D2D1::Point2F(static_cast<FLOAT>(x), 0.0f),
D2D1::Point2F(static_cast<FLOAT>(x), rtSize.height),
m_pLightSlateGrayBrush,
0.5f
);
}
for (int y = 0; y < height; y += 10)
{
m_pRenderTarget->DrawLine(
D2D1::Point2F(0.0f, static_cast<FLOAT>(y)),
D2D1::Point2F(rtSize.width, static_cast<FLOAT>(y)),
m_pLightSlateGrayBrush,
0.5f
);
}
// Draw two rectangles.
D2D1_RECT_F rectangle1 = D2D1::RectF(
rtSize.width/2 - 50.0f,
rtSize.height/2 - 50.0f,
rtSize.width/2 + 50.0f,
rtSize.height/2 + 50.0f
);
D2D1_RECT_F rectangle2 = D2D1::RectF(
rtSize.width/2 - 100.0f,
rtSize.height/2 - 100.0f,
rtSize.width/2 + 100.0f,
rtSize.height/2 + 100.0f
);
// Draw a filled rectangle.
m_pRenderTarget->FillRectangle(&rectangle1, m_pLightSlateGrayBrush);
// Draw the outline of a rectangle.
m_pRenderTarget->DrawRectangle(&rectangle2, m_pCornflowerBlueBrush);
屏幕一共是640*480 那么就是循环64+48次画线,居然完全占用了我的cpu。。。立即刷新模式下,勉强可以到80。
代码使用微软提供的示例code,但我修改成不在wm_paint下面画,而是while peek render模式。
直接内牛满面到无语。后来去掉了这段代码,只渲染FPS,能达到1600帧,但这没什么值得高兴的,一看CPU,顿时又囧了。
好吧其实我什么都不懂,上个对比数据。同样只渲染FPS文字。
directx9:1468帧。CPU占用最高26.渲染一张满屏小图(640*480),帧率800,CPU最高18.
direct2d: 1600帧。CPU44。---同上渲染一张图,帧率下降到920帧。CPU最高30.
看来性能提升并不算明显,directx9用gdi+绘制文字的“诟病”看起来似乎也没那么严重(少量)的情况下。
大量测试绘制文字确实directx9不行。遍历1万次,帧率在4-5帧之间。
direct2d。。。。帧率只有1.6.....
不像OpenGL,微软directx这个画文字的囧病,看来一时之间是没办法解决的了。
那么我们为什么要选用direct2d?
看来只是引用了画刷,还有文字抗锯齿的功能,其他还是照旧,没多大变化。但不得不吐槽一下画线画各种的效率。。。
绘图虽然跟directx比起来,确实有点提升,但相当有限。而且占用的CPU。。(首先声明,本人的机器是支持硬件direct2d的)
不过本来direct2d就是定位在用来取代无法硬件加速的GDI上面的。
对于游戏开发里面的GUI,因为现在已有成熟的框架体系,所以,使用direct2d来开发游戏UI纯属多余。难怪网上对它的研究热度也并不高。
微软放的这个烟雾弹,呵呵,太.....
而且对于2D游戏开发来说,在2d上面可能是值得考虑移植到direct2d的。----但是用directx9来开发也是一样~~
只能说,两个用的API不同,但是对于把Textture封装好了的directx9,纹理融合等特效和alphablend(direct2d)方便程度上没多大区别。
最后
以上就是霸气草丛为你收集整理的Direct2d CPU占用过高的问题的全部内容,希望文章能够帮你解决Direct2d CPU占用过高的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复