2011-02-04 52 views
7

我在过去6个月左右一直在研究Android游戏,并且在这里发布了几次关于我无法摆脱的各种滞后问题。是不可能让Android游戏免费的吗?我在这里疯狂

我最终抓住了LunarLander的例子,并将其剥离到它的核心组件,看看我是否能够做任何不滞后的事情。它所做的只是更改画布每帧的翻译量,然后在画布上绘制背景。即使这样,你可以得到一个SurfaceView应用程序一样简单 - 口吃...

我的游戏是一个滚动游戏,你不断向上移动屏幕(想象飞行游戏),但我目前的方式做背景会导致大约50-100毫秒每秒不断的口吃。这不是游戏突破,但它非常分散注意力,使得游戏看起来好像是由一个完整的白痴编程的(尽管我开始怀疑这可能是这种情况)。

不,它不是垃圾收集器,在游戏的运行循环中根本没有创建新对象,并且GC在我的游戏运行时几乎没有运行。

我实际上把我的头发弄得沮丧。我花了超过40个小时,试图摆脱这个简单的应用程序例子在上个星期的滞后,这让我疯狂。应用程序如何与我所链接的应用程序一样简单可能存在滞后问题?你不会认为滚动的背景可能会比这更简单...

注意:这个演示在我的手机(摩托罗拉里程碑)上不断获得60fps左右。在示例中取消注释FPS代码以查看FPS。

TL; DR:非常简单的程序,只是一个滚动的背景显示口吃。请看看...

基于链路断LunarLander例如下载简单的口吃例如: http://dl.dropbox.com/u/4972001/LunarLander.rar

+0

是否喷气男孩演示有口吃上运行时,您的手机? http://developer.android.com/resources/samples/JetBoy/index.html – jhouse 2011-02-04 16:04:32

+0

Traceview告诉你什么?另外,在将来,请跳过火焰诱饵标题。 – CommonsWare 2011-02-04 16:12:40

+0

对不起火焰诱饵,当我写出来的时候,我非常沮丧(因为我相信你可以说)。 Traveview没有什么特别之处。所有draw/updatePhysics调用之间有相同的间隔。这似乎是可见但不可衡量的东西,这是令人困惑的。另外,是的,JetBoy也有口吃问题。 – Smills 2011-02-04 16:18:15

回答

4

我已经下载了RAR文件与滚动背景(看起来像一片草地),并安装它在我的Motorolla Droid上。

我可以感觉到没有口吃,因为它滚动,我已经观察了一分钟。

根据你的描述,我打赌里程碑硬件/平台有一些奇怪的视频绘图/计时问题。

也许解释是这样的:里程碑的diplay刷新频率为60Hz(只是在这里选择一个数字,我不知道它是什么),而且你的帧速率略微偏离了这个水平 - 比如说63或57赫兹......难以想象,大约每秒一次的抽奖时间,以及硬件显示更新不匹配的时间恰好足以使背景不会重新画一次,并且必须等到你的下一帧?偶尔,时序排列恰到好处,您可能会错过连续两次或三次绘制的时间(取决于您的帧周期离实际屏幕刷新周期有多远)。

编辑:其实,我看了一分钟,我确实看到一个很短(只是可感知)口吃。

0

您是否考虑过jhouse对最小帧时间的建议?

我在当前项目中使用了这个想法。我预计手机硬件在未来一两年会有相当大的改进,所以这会阻止你的游戏在未来变得不可玩。

我的代码是这样的:

long frameTime; // calculate time to process this frame 

    while (mSurfaceAvailable) { 
     // ensure minimum frame time can be calculated 
     frameTime = SystemClock.uptimeMillis(); 

     // code to move everything and display a single frame goes here 

     // ensure minimum frame time 
     frameTime = SystemClock.uptimeMillis() - frameTime; 
     if (frameTime < 0) frameTime = MIN_FRAME_TIME;  // cope with wrap-around of uptimeMillis 
     if (frameTime < MIN_FRAME_TIME) { 
      /*DEBUG*/Log.v(this.getClass().getName(), "run: Sleeping for "+(MIN_FRAME_TIME - frameTime)+"ms"); 
      try { 
       sleep(MIN_FRAME_TIME - frameTime); 
      } catch (InterruptedException e) { 
       /*DEBUG*/Log.i(this.getClass().getName(), "run: Thread sleep was interrupted (not a problem)"); 
      } 
     } else { 
      if (frameTime != MIN_FRAME_TIME) { 
       /*DEBUG*/Log.v(this.getClass().getName(), "run: System is too slow, by "+(frameTime - MIN_FRAME_TIME)+"ms per frame"); 
      } 
     } 

我睡眠异常,从一个论坛处理(大概这一个!),但从未见过抛出异常

1

我一直有这个相同在我的比赛中有一个滞后的问题(我做了类似你对LunarLander循环的类似的结论,并得出了类似的结论)。如果你打开logcat,你会发现滞后与GC_FOR_MALLOC(50 ... 100 ms,我们的滞后时间)一起发生。我怀疑问题的根源在于垃圾收集器。然后我发现这个职位:

http://fanitis.com/2011/02/09/android-game-performance-garbage-collection/

我会尽量减少使用垃圾收集,看看我实现无滞后状态呵呵呵=]