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

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

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

    使用三缓冲代码如下:

view plaincopy to clipboardprint?
// Create surfaces  
memset( &ddsd, 0, sizeof( ddsd ) );  
ddsd.dwSize = sizeof( ddsd );  
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;  
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP;  
ddsd.dwBackBufferCount = 2;  
ddrval = lpDD->CreateSurface(  &ddsd, &lpFrontBuffer, NULL ); 
    // Create surfaces
    memset( &ddsd, 0, sizeof( ddsd ) );
    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP;
    ddsd.dwBackBufferCount = 2;
    ddrval = lpDD->CreateSurface(  &ddsd, &lpFrontBuffer, NULL );

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

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

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fgwntg/archive/2010/05/14/5593507.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值