我正在为Android开发游戏。由于这是我的第一款Android游戏,我希望尽可能简单。我想显示一系列随机数(一次一个)。在每对数字之间应该通过一段给定的时间(我目前正在使用500ms)。
问题是两个数字之间的延迟不是恒定的(模拟器上和运行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()
更新要绘制的数字,应该每隔500毫秒调用一次。它的代码非常简单:
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 drawFrame()
几乎100%消耗了此时间,尤其是拨打lockCanvas()
和unlockCanvasAndPost()
时,我无法避免这样做。
最奇怪的是,所有迭代的最长时间是97毫秒,远远低于我在执行游戏时注意到的延迟。所以,不知何故,我认为问题可能不在游戏循环代码中,而是在配置中,或者在其他地方。有没有人有任何建议?
答案 0 :(得分:0)
你应该设计你的组件来绘制数字,就是这样。
然后你应该有一些实现游戏逻辑的其他类,等待一段时间,然后将一个数字传递给你的UI组件并要求它绘制数字。
让UI方法等待是一个非常糟糕的主意,你的游戏将无法响应。
此外,您的游戏逻辑组件应该执行较小的等待。等待100毫秒,每次检查在选择最后一个号码后是否等待超过500毫秒。
答案 1 :(得分:0)
试试这个:
使用500毫秒的计时器任务并更新您的mNumberBox,并使表面无效。
在表面类上,在onDraw()中,调用mRenderer.onDraw(canvas)。
这种解决方案不会消耗太多的CPU,非常适合电池使用,而且响应速度也很快。
您还将观察到您的延迟问题将得到解决。