2010-11-16 40 views
3

我不確定我的幀速率代碼是否正確,而且我一直無法找到正在查找的確切示例。正確地在自定義Java組件上查找幀速率

本質上,我已經子類java.awt.Component,並在paint(Graphics)方法內呼叫我的calculateFrameRate()函數,如下所示。 update()中我沒有做任何增量繪圖。從這個數字看起來很高,我想知道是否組件類固有的雙緩衝​​意味着油漆被調用兩次,因爲它正在呈現?儘管如此,我在雙緩衝區中生鏽了,但這可能完全不正確。

這裏是幀速率的方法:

private List<Long> updateTimes = new ArrayList<Long>(); 

private void calculateFrameRate() { 
    long time = System.currentTimeMillis(); 

    updateTimes.add(new Long(time)); 

    // We will have the wrong framerate for the first 30 draws. No big. 
    float timeInSec = (time - updateTimes.get(0))/1000f; 

    currentFrameRate_ = 30f/timeInSec; 

    if (updateTimes.size() == 31) 
     updateTimes.remove(0); 

} 

乾杯,

Hamy

回答

1

作爲替代方案,你可以看看System.nanoTime()。該example計算由FRAMES定義的前一幀數的平均值。

+0

原來,我的方法與您給出的例子精確匹配。那麼,大多數;)只適用於複雜的繪畫。我的方法不僅測量繪畫功能中的時間,還計算繪畫之間的時間。如果你有簡單的繪畫,那麼給出的例子將會錯過總時間中相對較大的比例,因爲繪畫所需的時間只佔總數的很小一部分,因此會給你提供更高的fps。我不知道在fps計算中是否有'正確'的答案,但是我要用總秒數的幀數來計算,而不是每秒鐘在幀數中花費的幀數;) – Hamy 2010-11-16 17:44:33

+0

我明白了你的觀點:我通常會盡量減少在paint()中花費的時間,但是你正在考慮優化整體速率(fps)。 – trashgod 2010-11-16 22:08:22