我是靠谱客的博主 霸气草丛,最近开发中收集的这篇文章主要介绍Direct2d CPU占用过高的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用传统的渲染循环发现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占用过高的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部