2012-01-07 21 views
1

我正在開發Android遊戲。由於這是我的第一款Android遊戲,我希望儘可能簡單。我想顯示一系列隨機數(一次一個)。在每對數字之間應該有一定的時間(我目前使用的是500ms)。在Android遊戲循環中的非恆定時機

的問題是,兩個數字之間的延遲是不恆定的(既不在模擬器上也不運行Android 2.3.4在實際設備上)。大多數時候數字會以恆定的速度變化,但有時會出現顯着的延遲(甚至超過1秒)。

我包含負責渲染數字的代碼部分。我使用的是SurfaceView和下面的部分是在額外的線程執行的遊戲循環的run()方法:

while (!mDone) { 
    long now = System.nanoTime(); 
    if (mLastTime == -1) mLastTime = now; 
    long delta = now - mLastTime; 
    if (delta > 500000000) { 
     mNumberBox.update(); 
     mLastTime = now; 
    } 

    if ((w > 0) && (h > 0)) { 
     Canvas canvas = mSurfaceHolder.lockCanvas(); 
     if (canvas != null) { 
      mRenderer.drawFrame(canvas); 
      mSurfaceHolder.unlockCanvasAndPost(canvas); 
     } 
    } 
} 

mNumberBox.update()更新要繪製的數量,它應該被稱爲每500ms。它的代碼很簡單:

mCurrNumber = mRand.nextInt(9) + 1; 

mRenderer.drawFrame()是負責渲染屏幕上的數字。這裏是代碼:

canvas.drawRoundRect(mBoxRect, 45, 45, mBoxPaint); 
String numStr = String.format("%d", mCurrNumber); 
Rect bounds = new Rect(); 
mTextPaint.getTextBounds(numStr, 0, 1, bounds); 
int height = bounds.bottom - bounds.top; 
canvas.drawText(numStr, canvas.getWidth()/2, canvas.getHeight()/2 + height/2, mTextPaint); 

我已經剖析了代碼,執行約260秒的應用程序。這些是我發現的結果:

run()
  • 循環迭代:每次迭代16765
  • 平均時間:16毫秒
  • 最長時間爲所有的迭代:97毫秒

幾乎100%的時間消耗在drawFrame()中,特別是在lockCanvas()unlockCanvasAndPost()的呼叫中,這是我無法避免的。

最奇怪的是,對於所有迭代的最長時間爲97毫秒,遠遠低於我在執行遊戲注意到的延遲。所以,不知何故,我認爲問題可能不在遊戲循環代碼中,但可能在配置中或其他地方。有沒有人有任何建議?

+0

'w'和'h'只是包含畫布寬度和高度的兩個變量。在創建視圖時,它們可能不會被初始化,因此爲零,但在此之後,它們的值不會改變。因此,條件檢查總是如此。 – betabandido 2012-01-07 18:19:07

回答

0

你應該設計你的組件來繪製數字,就是這樣。

那麼你應該有一些其他類實現遊戲邏輯,等待一段時間,然後通過一個號碼給您的UI組件,並要求它畫的數量。

讓UI方法等待是一個非常糟糕的主意,您的遊戲將無法響應。

此外,你的遊戲邏輯組件應該做更小的等待。等待100 ms,並且每次選擇最後一個號碼後,檢查是否等待超過500 ms。

+0

實際上,遊戲循環從不阻止(即渲染的發生速度儘可能快於硬件)。我知道這可能不是電池消耗方面的最佳選擇,但它應該提供最佳性能。所以基本上,循環會在最後一段中說出你所說的內容(除非它不阻止,即使是100ms也是如此)。 – betabandido 2012-01-07 18:56:19

0

試試這個:

使用計時器任務與500毫秒和更新mNumberBox,並失去你的面。

在onDraw()中的Surface類上,調用mRenderer.onDraw(canvas)。

該解決方案不會消耗太多的CPU,對電池非常友好,而且響應速度非常快。

您還將觀察到您的延遲問題將得到解決。