我在较慢的设备(Orange San Francisco,也称为ZTE Blade)上测试我的游戏,结果帧率极低。
我在绘制循环中加入了一些调试代码,并发现以下代码行需要超过100毫秒:
c = mSurfaceHolder.lockCanvas();
有其他人看到这种情况吗?我临时用扩展View并实现onDraw()来替换SurfaceView,帧率显著提高。
虽然一般来说,在我的HTC Desire上,SurfaceView要快得多。我怀疑这可能是一个Android 2.1的问题。我正在考虑root手机并升级到2.2(如果可能的话),但我确实想要一个运行在2.1上的设备,所以从长远来看可能会产生反效果。
** 更新 **
我继续处理这个问题,并发现了一些更加令人困惑的方面。
我root了手机并安装了2.2,但问题仍然存在。当应用程序首次启动时,lockCanvas按预期工作(0-1毫秒)。然后在我的初始化过程中的某个时候,lockCanvas突然开始花费大约100毫秒。
值得指出的是,我正在使用异步任务加载资产,以便可以显示加载屏幕。
尽管我尽力确定程序在减速时实际上正在执行什么操作,但我无法做到这一点。事实上,当我在调试模式下单步运行时,它运行得很快!
现在我发现,如果在我的SurfaceView构造函数中添加一个约10秒的延迟,那么减速就不会发生,一切都正常。
但是,如果按Home键,然后再切回来,减速问题就会重新出现。
我对这个愚蠢而不合逻辑的问题感到非常绝望!我认为这可能与内存使用有关。也许某些内容被交换出去,影响了视频RAM?
至少我对理论很感兴趣。