14

在较慢的设备(Orange San Francisco aka ZTE Blade)上测试我的游戏,我得到了一个令人震惊的帧速率。

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

c = mSurfaceHolder.lockCanvas();

其他人看到这种行为吗?我通过扩展 View 和实现 onDraw() 临时替换了surfaceview,我得到了更好的帧率。

虽然总的来说,我的 HTC Desire 上的 surfaceView 速度要快得多。我怀疑这可能是 Android 2.1 的问题。如果可能的话,我正在考虑将手机植根并将其升级到 2.2,但我确实希望设备在 2.1 上运行,这样从长远来看可能会适得其反。

** 更新 **

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

我将手机植根并安装了2.2,但问题仍然存在。首次启动应用程序时,lockCanvas 按预期工作(0-1 毫秒)。然后在我初始化过程中的某个时刻,lockCanvas 突然开始花费大约 100 毫秒。

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

尽管我尽最大努力确定程序在缓慢发生时实际在做什么,但我无法做到。事实上,当我以调试模式和单步运行它时,它运行得很快!

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

但是,如果您按 Home,然后再切换回来,那么缓慢又回来了。

在这个愚蠢的不合逻辑的问题上,我几乎束手无策!我想把它归结为设备特定的问题。

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

我至少会对理论感兴趣。

4

4 回答 4

11

关于文档中的 lockCanvas() :

如果在 Surface 未准备好时(在 Callback.surfaceCreated 之前或 Callback.surfaceDestroyed 之后)重复调用它,您的调用将被限制为较慢的速率以避免消耗 CPU。

对于某些设备,您的绘图循环是否可能启动得太早?我认为这是问题所在,因为您写道:

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

于 2011-03-10T07:55:19.993 回答
0

那么,也许我们可以使用 holder.isCreating() 来检查状态?如果画布仍在创建,此方法将返回 true。

类似 while(holder.isCreating()) {} can=holder.lockCanvas();

但我现在有点困惑。据我所知,创建表面视图时会调用 colbeck。我们应该实现 SurfaceHolder.Callback 接口。当创建表面时,回调方法 public void surfaceCreated(SurfaceHolder holder) { } 将被调用。从surfaceCreated 方法我开始gameloop 线程。

于 2011-12-06T07:53:12.433 回答
0

我最近发现,如果使用大位图在画布上绘制并且这些位图存储在活动类中 - “_surfaceHolder.lockCanvas()”命令本身需要很长时间(大约 70 毫秒,具体取决于设备)。但是,将这些位图存储移动到其他类(在不同的文件中,比如 MY_DATA),并且活动只是对该新类的引用 - 解决了问题。

我对这种现象没有任何解释。

于 2013-06-22T08:50:01.913 回答
0

我在绘图时遇到了同样神秘的问题Canvas,但通过将Canvas绘图更改为在SurfaceView. 但现在我的电话一直很慢lockCanvas()。这是我的观察结果。问题仅出现在某些设备上:

  • Galaxy Note 3 n900:有问题
  • Galaxy Note 3 n9005:有问题
  • Galaxy S4 i9505:有问题
  • Galaxy Gio:没问题
  • LG G2 D802:有问题
  • Galaxy S2 i9100:没问题

我通过扩展 View 和实现 onDraw() 临时替换了surfaceview,我得到了更好的帧率

我还注意到,三星手机使用绘图GLES20Canvas而不是常规绘图,因此性能更好。CanvasonDraw()

于 2015-12-28T13:29:27.343 回答