如何解决动画闪烁问题
| 这是我的代码和绘图代码中的游戏循环: 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();
}
通过在屏幕上移动对象而创建的动画闪烁,这让我感到很惊讶,因为我写入了屏幕的后缓冲区,因此我希望实现双缓冲。我该如何纠正闪烁?谢谢。
解决方法
与此问题无关,您可以通过查找
ALLEGRO_EVENT_TIMER
事件来检查计时器。如果您有多个计时器,可以使用event.timer.source
检查它是哪个计时器。
我认为这里的主要问题是您以60fps的速度绘制图形,但是以无限制的速率更新输入。这实际上是倒退。您想要以固定的速率更新输入。您可以随心所欲地绘制图形...尽管在没有任何变化的情况下更新图形是没有意义的。
所以它看起来应该更像:
if(event.type == ALLEGRO_EVENT_TIMER)
{
update_input();
update_display();
}
但是,如果事情变得太慢,则不会实现跳帧。您应该做的是在专用队列(不包含其他事件源)中设置计时器。然后,只要该专用计时器队列中有事件,就更新输入。
假设您已处理至少一个刻度,然后更新显示。因此,如果事情变得太慢,则可以对每个绘制的帧进行多次输入更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。