Проблема мерцания анимации - PullRequest
1 голос
/ 25 мая 2011

Это игровой цикл в моем коде и код рисования:

 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 Ответ

1 голос
/ 25 мая 2011

Не имея отношения к проблеме, вы можете проверить таймер, ища событие ALLEGRO_EVENT_TIMER.Вы можете использовать event.timer.source, чтобы проверить, какой это таймер, если у вас их больше одного.

Я думаю, что основная проблема здесь заключается в том, что вы рисуете графику со скоростью 60 кадров в секунду, но обновляете ввод с неограниченнымтемп.Это на самом деле задом наперед.Вы хотите обновить вход с фиксированной скоростью.Вы можете рисовать графику так часто, как вам хочется ... хотя нет смысла обновлять графику, если ничего не изменилось.

Так что это должно выглядеть примерно так:

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

Однако, это не реализует пропуск кадров, если дела идут слишком медленно.Что вы должны сделать, это установить таймер в выделенной очереди (которая не содержит других источников событий).Затем, пока в этой выделенной очереди таймера есть события, обновите вход.

Затем обновите отображение, если вы обработали хотя бы один тик.Таким образом, вы можете, если дела идут слишком медленно, сделать несколько входных обновлений для каждого нарисованного кадра.

...