【问题标题】:Animation flickering problem动画闪烁问题
【发布时间】:2011-05-25 16:29:56
【问题描述】:

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

 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();
    }

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

【问题讨论】:

  • 默认情况下它是双缓冲的。能发一下绘图代码吗?您给出的那一点与问题无关。
  • 我已经更新了帖子。我很好奇,游戏循环如何无关紧要?这就是控制屏幕更新率的原因,我在想这一定是更新率问题。
  • 这无关紧要,因为如果它是双缓冲的,那么刷新屏幕的速度并不重要......你永远不会闪烁。闪烁,你的意思是屏幕变白了一会儿,然后你看到了物体? (而不是在对象被切成两半的地方进行剪切。)您可能想在创建显示之前尝试al_set_new_display_option(ALLEGRO_SINGLE_BUFFER, 0, ALLEGRO_REQUIRE);。
  • 嗯,我可以用键移动屏幕上的图像,但动画不流畅。好像每隔一段时间就会减速。我确实尝试了 al_set_new_display_option(ALLEGRO_SINGLE_BUFFER, 0, ALLEGRO_REQUIRE);我没有看到任何变化。
  • 好的,这是一个不同的问题。我会发布一个可能有帮助的答案。

标签: flicker allegro5


【解决方案1】:

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

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

所以它应该看起来更像:

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

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

然后更新显示,假设您已经处理了至少一个刻度。因此,如果事情变得太慢,您可以为每个绘制的帧进行多次输入更新。

【讨论】:

  • 动画没有闪烁太多,但它仍然存在。我猜在这种情况下使用al_get_next_event 而不是al_wait_for_event 应该没问题。我注意到al_wait_for_event 的内存使用量有所增加。
猜你喜欢
  • 2023-03-29
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2011-11-25
  • 2011-12-02
  • 2012-03-12
  • 2011-03-30
相关资源
最近更新 更多