我正在开发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