基于S3C6410 的windows ce 6.0 DirectDraw使用三缓冲

来源:互联网 发布:自动结束进程软件 编辑:程序博客网 时间:2024/06/05 19:50

      S3c6410 使用DirectDraw画图时老是闪屏,网上收了好久说是使用双缓冲就可以解决闪屏问题,搞了2天图画多了还是会闪屏,帧数也达不到要求,很是郁闷!

     在网上寻觅了好久说是可以使用三缓冲技术,终于解决了闪屏问题,动画帧还能达到34帧。还要感谢《M8SDK教程-游戏开发心得》作者gzdanny。

    使用三缓冲代码如下:

     其实只要把ddsd.dwBackBufferCount的值由原来的1改成2就是使用3缓冲,这样DDraw会自动为我们提供2BackBuffer交替使用,同时省去了上一次Flip的等待时间.三缓冲比双缓冲虽然要多消耗一些资源,但是依据微软的说法,速度能再快20%左右,是一种比较好的方案。

    使用双缓冲还闪屏,据我个人猜测可能是在flip返回DD_OK的时候,6410其实还没有真正的把图片画出去,只把执行命令放进2D引擎的32-word command FIFO,由于6410有一个16KB的指令Cache,程序执行的速度远远高于SDRAM拷贝的的速度,这时你再使用Blt数据块拷贝还是把命令放进FIFO,多执行几个Blt再flip时就要等待上一次的指令执行完才能再次画图,这样一来程序会有一个比较长等待时间因此降低效率,使用三缓冲可以有效降低此过程的等待时间。

    但ddsd.dwBackBufferCount=3在速度上不会提升,可能是受到SDRAM拷贝速率的影响。