2012-01-07 84 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,对电池非常友好,而且响应速度非常快。

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