Allegro学习笔记七

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也可以实现。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值