2011-05-25 118 views
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(); 
    } 

通過在屏幕上移動對象創建動畫閃爍,我很驚訝這個,因爲我寫的後臺緩衝區屏幕因此我期望雙緩衝。我能做些什麼來糾正閃爍?謝謝。

+0

默認情況下它是雙緩衝的。你可以發佈圖紙代碼嗎?你所提供的一點與這個問題無關。 – Matthew 2011-05-25 16:34:54

+0

我已更新帖子。我很好奇,遊戲循環如何不相關?這就是控制屏幕更新的速度,我認爲這必須是更新率問題。 – Findrzkeeprz 2011-05-25 16:46:11

+0

這是無關緊要的,因爲如果它是雙緩衝的,刷新屏幕的速度有多快並不重要,你永遠不會閃爍。而通過閃爍,你的意思是屏幕白色短暫一秒,然後你看到的物體? (與剪切物體顯示的一半剪切相反)。在創建顯示之前,您可能需要嘗試'al_set_new_display_option(ALLEGRO_SINGLE_BUFFER,0,ALLEGRO_REQUIRE);'。 – Matthew 2011-05-25 16:50:35

回答

1

與問題無關,您可以通過查找ALLEGRO_EVENT_TIMER事件來檢查計時器。如果您有多個計時器,您可以使用event.timer.source來檢查它是哪個計時器。

我認爲這裏的主要問題是您正在以60fps的速度繪製圖形,但是您正在以無限制的速率更新輸入。這實際上是倒退。您想要以固定的速率更新輸入。您可以隨心所欲地繪製圖形...儘管如果沒有更改,更新圖形是沒有意義的。

所以應該看起來更像是:

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

然而,這並沒有實現跳幀如果事情變得過於緩慢。你應該做的是在一個專用隊列中設置定時器(不包含其他事件源)。然後只要有事件坐在專用定時器隊列中,就更新輸入。

然後更新顯示器,假設您已經處理了至少一個記號。所以,如果速度太慢,可能會爲每個繪製幀執行多個輸入更新。

+0

動畫不閃爍,但仍然存在。我猜在這種情況下使用'al_get_next_event'而不是'al_wait_for_event'應該沒問題。我注意到'al_wait_for_event'增加了內存使用量。 – Findrzkeeprz 2011-05-25 17:47:33