动画闪烁问题

时间:2011-05-25 16:29:56

标签: flicker allegro5

这是我的代码和绘图代码中的游戏循环:

 float frames_per_second = 60;

    display_timer = al_create_timer(1/frames_per_second);
    queue = al_create_event_queue();
    al_register_event_source(queue, al_get_timer_event_source(display_timer));
    al_start_timer(display_timer);
    while(!end_game)
    {
      ALLEGRO_EVENT event;
      al_wait_for_event(queue, &event);
      if(event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) break;
      if(event.any.source == al_get_timer_event_source(display_timer))
      {update_display();}
      update_input();
    }

    void update_display()
    {
      al_clear_to_color(al_map_rgb(255, 255,255));
      draw_objects(); //this is just an al_draw_bitmap() call
      al_flip_display();
    }

通过在屏幕上移动对象创建的动画闪烁,我对此感到惊讶,因为我写入屏幕的后缓冲区,因此我希望双缓冲。我该怎么做才能纠正闪烁?感谢。

1 个答案:

答案 0 :(得分:1)

与此问题无关,您可以通过查找ALLEGRO_EVENT_TIMER事件来检查计时器。如果您有多个计时器,可以使用event.timer.source来检查它是哪个计时器。

我认为这里的主要问题是你以60fps的速度绘制图形,但是你以无限的速率更新输入。这实际上是倒退。您想以固定速率更新输入。您可以随意绘制图形......但如果没有任何更改,更新图形是没有意义的。

所以看起来应该更像:

if(event.type == ALLEGRO_EVENT_TIMER)
{
   update_input();
   update_display();
}

但是,如果事情变得太慢,这不会实现跳帧。您应该做的是在专用队列中设置计时器(不包含其他事件源)。然后,只要有专门的计时器队列中有事件,就更新输入。

然后更新显示,假设您已经处理了至少一个勾选。所以,如果事情变得太慢,你可以在每个绘制的框架上进行多次输入更新。