速度较快的Android设备上的较慢FPS



我的2D Android游戏使用SurfaceView,我几乎已经完成了。它基于JBox2D。它在三星Galaxy S2上完美运行,其FPS为60。它在HTC Explorer上运行也很顺利,其FPS约为54。我想,如果我的游戏在这些相对旧的设备上运行良好,那么在新的设备上会运行得更好。但我错了!我昨天看到我在Galaxy Note 4上的游戏FPS值在22到45之间变化,具体取决于游戏对象的数量。

在谷歌和StackOverflow中调查了这个问题后,我推断像Galaxy Note 4这样分辨率更高(1440 x 2560)的新设备无法处理大图像,而小设备可以处理自己的小图像(Galaxy s2:480 x 800,HTC Explorer:320 x 480)。是的,新设备肯定比旧设备快,但我认为新设备的巨大分辨率是SurfaceView速度慢的原因。当然,这在SurfaceView条件下是有效的。如果我在游戏中使用OpenGL,那么对于具有高分辨率的新设备来说,这不会是一个问题。

我的位图是为800 x 1280设备设计的。根据不同的设备分辨率,我的游戏在每个级别开始时使用createScaledBitmap重新缩放图像。

我无法将我的游戏从SurfaceView转换到OpenGL平台,因为我的游戏即将结束,而且我对OpenGL没有足够的了解。

我该怎么办?

我相信您已经正确地发现了问题:较新的设备的像素数与27英寸显示器上的像素数(2560x1440)类似,因为制造商像追求相机百万像素一样追求屏幕分辨率。结果是渲染全屏需要更长的时间,尤其是当你在软件中进行渲染时。更快的CPU和增加的总线带宽会有所帮助,但全屏软件渲染是有问题的。

安卓的解决方案是缩小Surface,并让硬件在扫描时放大它。这比按比例放大每个项目要容易得多(也更高效)。您可以使用SurfaceHolder#setFixedSize()方法来完成此操作。例如,对于2560x1440的显示器,可以将"曲面"大小设置为1280x720,并且只渲染四分之一的像素。显示器执行像素加倍(使用双线性滤波)。

你可以在这里找到一篇博客文章,并可以在Grafika的"硬件缩放器练习者"活动(youtube演示视频)中看到这一点。

各种示例使用GLES,GLES也得益于填充的像素较少,但也适用于Canvas渲染。

最新更新