lockCanvas()真的很慢

Kev*_*vin 14 performance android frame-rate surfaceview

在较慢的设备上测试我的游戏(Orange旧金山又名中兴Blade),我的帧速率令人震惊.

我将一些调试代码放入绘制循环中,发现以下行占用了100ms:

c = mSurfaceHolder.lockCanvas();
Run Code Online (Sandbox Code Playgroud)

其他人看到过这种行为吗?我通过扩展查看和执行的onDraw()暂时取代了surfaceview,我获得了很多更好的帧率.

虽然一般来说,SurfaceView在我的HTC Desire上要快得多.我怀疑这可能是Android 2.1问题.如果可能的话,我正在考虑生根并将其升级到2.2,但我确实想要在2.1上运行设备,这样从长远来看可能会适得其反.

**更新**

我一直在研究这个问题,并且发现了一些令人费解的方面.

我根据手机安装了2.2并且问题仍然存在.当应用程序首次启动时,lockCanvas按预期工作(0-1毫秒).然后在初始化期间的某个时刻,lockCanvas突然开始大约需要100ms.

值得指出的是,我正在异步任务中加载我的资产,以便我可以显示加载屏幕.

尽管我尽力确定程序在发生缓慢时实际正在做什么,但我无法做到这一点.事实上,当我在调试模式下单步运行时,它运行得很快!

现在我发现如果我在SurfaceView的构造函数中添加延迟(大约10秒),则不会发生缓慢而且一切正常.

但是,如果您按Home键然后切换回来,则缓慢返回.

对于这个愚蠢的不合逻辑的问题,我几乎已经到了最后!我有心思把它归结为特定于设备的问题.

我觉得它可能与内存使用有关.也许有些东西被换掉了,它会影响视频内存?

我至少对理论很感兴趣.

Sim*_*eon 11

关于docs中的lockCanvas():

如果在Surface未准备好时(Callback.surfaceCreated之前或Callback.surfaceDestroyed之后)重复调用此方法,则会限制您的调用速度以避免消耗CPU.

对于某些设备,您的绘制循环是否可能过早启动?我认为这是问题,因为你写道:

现在我发现如果我在SurfaceView的构造函数中添加延迟(大约10秒),则不会发生缓慢而且一切正常.