1

これは、私のコードと描画コードのゲーム ループです。

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

画面上のオブジェクトを動かすことで作成されるアニメーションがちらつくのですが、画面のバック バッファーに書き込みを行っているため、ダブル バッファーリングが予想されるため、これには驚きました。ちらつきを修正するにはどうすればよいですか? ありがとう。

4

1 に答える 1

1

問題とは関係ありませんが、ALLEGRO_EVENT_TIMERイベントを探すことでタイマーを確認できます。event.timer.source複数のタイマーがある場合は、どのタイマーであるかを確認するために使用できます。

ここでの主な問題は、グラフィックを 60fps で描画しているのに、入力を無制限に更新していることだと思います。これは実際には逆です。固定レートで入力を更新したい。グラフィックスは何度でも描画できますが、何も変更されていない場合、グラフィックスを更新しても意味がありません。

したがって、次のようになります。

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

ただし、処理が遅くなりすぎた場合のフレーム スキップは実装されません。あなたがすべきことは、タイマーを専用のキュー (他のイベント ソースを含まない) に設定することです。次に、その専用タイマー キューにイベントが存在する限り、入力を更新します。

次に、少なくとも 1 つのティックを処理したと仮定して、表示を更新します。そのため、処理が遅くなりすぎた場合は、描画されたフレームごとに複数の入力更新を行うことができます。

于 2011-05-25T17:08:14.083 に答える