Android游戏循环中的非恒定时序

时间:2012-01-07 18:13:35

标签: android loops timing

我正在为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
  • 每次迭代的平均时间:16 ms
  • 所有迭代的最长时间:97毫秒

drawFrame()几乎100%消耗了此时间,尤其是拨打lockCanvas()unlockCanvasAndPost()时,我无法避免这样做。

最奇怪的是,所有迭代的最长时间是97毫秒,远远低于我在执行游戏时注意到的延迟。所以,不知何故,我认为问题可能不在游戏循环代码中,而是在配置中,或者在其他地方。有没有人有任何建议?

2 个答案:

答案 0 :(得分:0)

你应该设计你的组件来绘制数字,就是这样。

然后你应该有一些实现游戏逻辑的其他类,等待一段时间,然后将一个数字传递给你的UI组件并要求它绘制数字。

让UI方法等待是一个非常糟糕的主意,你的游戏将无法响应。

此外,您的游戏逻辑组件应该执行较小的等待。等待100毫秒,每次检查在选择最后一个号码后是否等待超过500毫秒。

答案 1 :(得分:0)

试试这个:

使用500毫秒的计时器任务并更新您的mNumberBox,并使表面无效。

在表面类上,在onDraw()中,调用mRenderer.onDraw(canvas)。

这种解决方案不会消耗太多的CPU,非常适合电池使用,而且响应速度也很快。

您还将观察到您的延迟问题将得到解决。