使用Android Canvas API进行高性能2D渲染

时间:2017-07-26 05:00:11

标签: android performance android-canvas android-bitmap

在过去的一个月里,我尝试使用Android的默认画布API尝试使用简单的2d侧卷轴。

简而言之,我的问题归结为“Canvas API的性能是否足以用一个带有多层,并行背景的简单侧卷轴拉动60fps?”。

现在听我说,因为我已经尝试了很多不同的方法,到目前为止,我已经相当空洞地提出如何从我的尝试中提高效率。

首先,解决容易出现的问题:

  1. 我没有在游戏循环中分配任何东西
  2. Surface是硬件加速
  3. 在开始游戏之前加载位图,并在不缩放的情况下绘制。
  4. 除了游戏循环中的位图绘制(主要是更新位置变量和获取时间)之外,我不相信我正在做任何有意义的事情。
  5. 正如您可能已经猜到的那样,问题开始于parallaxing BG。总共七层,虽然我一直在试验少至3,但仍然无法保持60fps。我正在裁剪重叠的部分,以尽量减少透支,但我猜我还在画~~ 2-3倍透支,所有总结。

    当游戏运行时,我经常以~60fps开始,但是大约30/40秒,fps下降到大约20.时间是随机的,它似乎是手机的状态,而不是代码中的任何结果(强行杀死应用程序并重新启动会导致新应用程序以~20fps开始,但让手机静置一段时间会导致更高的fps)。我的猜测是CPU上的热量限制......

    现在我正在测试5倍,天真地认为这些问题可能会在更快的设备(6P)上消失。当然,由于屏幕较大,问题变得更糟,因为它连续运行~15fps。

    一位同事建议加载小位图并在绘制时拉伸它们,而不是将负载上的位图缩放到它们在屏幕上显示的大小。通过使每个位图的大小为1/3来实现这一点,并使用canvas.drawBitmap(位图,srcRect,destRect,Paint)方法来补偿大小和规模,从而产生更差的整体性能(尽管我确信它有助于内存占用) 。我没有尝试过drawMesh方法,但我想象普通的旧drawBitmap不会更高效。

    在另一次尝试中,我给了一个ImageViews数组,认为Android View类可能正在做一些我不喜欢的魔法,但经过一个小时的摆弄它,它看起来不再有希望了。 / p>

    最后,设备上的GPU分析仍然远远低于绿线,表示60fps,但屏幕似乎没有反映出来。不知道那里发生了什么。

    我应该咬紧牙关切换到OpenGL吗?我认为Canvas可以胜任具有平行背景的侧卷轴的任务,但我要么做错了,要么使用错误的工具来完成工作。

    真诚地感谢任何帮助或建议,并为啰嗦的帖子道歉。

0 个答案:

没有答案
相关问题