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

来源:互联网 发布:如何理解域名的重要性 编辑:程序博客网 时间:2024/05/16 13:01

  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

原创粉丝点击