【发布时间】: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);我没有看到任何变化。
-
好的,这是一个不同的问题。我会发布一个可能有帮助的答案。