Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5513759
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2010-03-11 11:08:48

在游戏开发中,有时候为了加快屏幕绘制速度,需要用到屏幕缓冲区,即双缓冲。

这里说的屏幕缓冲区其实本质是一块与屏幕大小相对应的内存空间,

240X320的手机屏幕,它的缓冲区大小是240x320x2(16位的 bmp图片显示字节,就是150KB左右。

 
我们在绘制文字和图片时,其实就是往该内存里面写数据,也就是向内存里面绘制。最终,将内存中的数据一次性刷新到屏幕显示上。
 
下面,举例说明屏幕缓冲区的具体使用方法:

// 成功返回0, 失败返回 -1

int ScreenDoubleBuffer(void)
{
    // screen buffer point

    int* p_old_buf = NULL;
    int* p_new_buf = NULL;
    
    // screen width and height

    int scr_w = 240;
    int scr_h = 320;
    
    // screen buffer size

    int size = scr_w*scr_h*2;
    
     // 要显示字符串的宽高

    int text_w = 0
    int text_h = 0;

    char* pcText = "Test Screen buffer!";
    int ret = -1;
    int x,y;
    
    //--<1> get current screen buffer point

    p_old_buf = getScreenBuffer();
    if( NULL == p_old_buf ){
        return ret;
    }
    
    //<2>create new screen buffer

    p_new_buf = malloc(size);
    if( NULL == p_new_buf ){
        return MR_FAILED;
    }
    
    //<3>set new screen buffer

    setScreenBuffer( p_new_buf );
    
    //<4>draw text to new screen buffer

    clearScreen( 100, 100,100);
    
    // 得到要显示字符穿的宽高信息

    textWidthHeight( pcText, FALSE, MR_FONT_MEDIUM, &text_w,&text_h);
    
    // 居中显示

    x = ( scr_w - text_w )/2;
    y = ( scr_h - text_h )/2;
    
    // 是指将数据画到 new_buf 中了,并没有刷新界面显示

    drawText( pcText, x, y, 255, 255, 255, FALSE, MR_FONT_MEDIUM);
    
    //<5> recover screen buffer

    setScreenBuffer(p_old_buf);
    memcpy(p_old_buf,p_new_buf,size);
    
    refreshScreen(0,0,240,320); // 刷新屏幕显示

    
    return 0;
}

总结:

P_old_buf, 专门负责刷新屏幕显示
p_new_buf, 专门负责处理图片,文字的各种绘制操作, 然后将绘制的结果交给 p_old_buf 进行显示。。

阅读(1244) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~