我正在開發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毫秒,遠遠低於我在執行遊戲注意到的延遲。所以,不知何故,我認爲問題可能不在遊戲循環代碼中,但可能在配置中或其他地方。有沒有人有任何建議?
'w'和'h'只是包含畫布寬度和高度的兩個變量。在創建視圖時,它們可能不會被初始化,因此爲零,但在此之後,它們的值不會改變。因此,條件檢查總是如此。 – betabandido 2012-01-07 18:19:07