http://wiki.allegro.cc/AllegroExamples 以上是英文例子站点。
by Shawn Hargreaves,allegro的作者
目录: 1 Allegro 例子
1.1 exhello
1.2 exmem
1.3 expat
1.4 expal
1.5 exflame
1.6 exbuf
1.7 exflip
还是上个例子,但是它展示了“双缓存技巧”和“翻页技巧”的不同之处
#include <allegro.h>
int main(void)
{
BITMAP *buffer;
BITMAP *page1, *page2;
BITMAP *active_page;
int c;
if (allegro_init() != 0)
return 1;
install_timer();
install_keyboard();
/* 一些平台在实现“翻页”技巧的时候,采用的是申请更大的screen,即使用
* “滚屏”技巧, 另外一些则会给你稍微小一些的唯一显示表面
* 如果你使用create_video_bitmap()函数,同样的代码可以在不同的平台上
* 正常工作,但是你首先还是得小心的处理如何设置正确的显示模式
* 我们想要2页320*200的显存,但是在DOS下,allegro使用的VGA驱动
* 可能并不会分配第2块(也许是VARM不够什么的)。如果采用申请320*400
* 的策略,可能在使用DirectX驱动的平台上会申请失败。总的来说,两种
* 方式都应该尝试:首先申请320*400,不行的话就申请320*200
*/
if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 400) != 0) {
if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) != 0) {
if (set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0) {
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Unable to set any graphic mode\n%s\n", allegro_error);
return 1;
}
}
}
set_palette(desktop_palette);
/* 普通的双缓存技巧,跟上个例子一样 */
buffer = create_bitmap(SCREEN_W, SCREEN_H);
/* 第一次使用双缓存... */
clear_keybuf();
c = retrace_count+32;
while (retrace_count-c <= SCREEN_W+32) {
clear_to_color(buffer, makecol(255, 255, 255));
circlefill(buffer, retrace_count-c, SCREEN_H/2, 32, makecol(0, 0, 0));
textprintf_ex(buffer, font, 0, 0, makecol(0, 0, 0), -1,
"Double buffered (%s)", gfx_driver->name);
blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
if (keypressed())
break;
}
destroy_bitmap(buffer);
/* 现在创建两个显存位图(非内存位图哦)用于实现“翻页”技巧 */
page1 = create_video_bitmap(SCREEN_W, SCREEN_H);
page2 = create_video_bitmap(SCREEN_W, SCREEN_H);
if ((!page1) || (!page2)) {
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Unable to create two video memory pages\n");
return 1;
}
active_page = page2;
/* 使用“翻页”技巧从而达到更好的效果... */
clear_keybuf();
for (c=-32; c<=SCREEN_W+32; c++) {
clear_to_color(active_page, makecol(255, 255, 255));
circlefill(active_page, c, SCREEN_H/2, 32, makecol(0, 0, 0));
textprintf_ex(active_page, font, 0, 0, makecol(0, 0, 0), -1,
"Page flipping (%s)", gfx_driver->name);
show_video_bitmap(active_page);
if (active_page == page1)
active_page = page2;
else
active_page = page1;
if (keypressed())
break;
}
destroy_bitmap(page1);
destroy_bitmap(page2);
return 0;
}
END_OF_MAIN()
-----------------------------------------------------------------------
小结七:
1、if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 400) != 0) {
if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) != 0) {
Shawn Hargreaves说的很明白了:)
2、page1 = create_video_bitmap(SCREEN_W, SCREEN_H);
page2 = create_video_bitmap(SCREEN_W, SCREEN_H);
创建显存位图,与之相对应的是show_video_bitmap();
3、if (active_page == page1)
active_page = page2;
else
active_page = page1;
flips“翻页”技巧的核心思想之一,另外一个就是直接操作显存,利用硬件加速。
PS:关于 double buffer & page flips
page flips和双缓存/3缓存技术的最大区别在于前者是操作显存,使用了硬件加速,后者是操作内存,没有使用硬件加速,是吗?
恩,flip一般会有硬件的支持,比如显存首址偏移。多缓冲则可软可硬,直接的内存拷贝可以实现,硬件加速的blit也可以实现。