较快的 Android 设备上的 FPS 较慢

The slower FPS on the faster Android devices

我将 SurfaceView 用于我几乎完成的 2D Android 游戏。它基于 JBox2D。在Samsung Galaxy S2上完美运行,FPS为60。在HTC Explorer上也运行流畅,FPS约为54。我想如果我的游戏在这些相对较旧的游戏中运行良好设备,它将在较新的设备中运行得更好。但是我错了!我昨天看到我的游戏在 Galaxy Note 4 上的 FPS 值在 22 到 45 之间变化,具体取决于游戏对象的数量。

在 Google 和 Whosebug 调查了这个问题后,我推断像 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 和增加的总线带宽会有所帮助,但全屏软件渲染存在问题。

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

你可以找到一个 blog post here, and can see this in action in Grafika's "hardware scaler exerciser" activity (youtube demo video).

各种示例都使用了 GLES——这也得益于需要填充的像素更少——但也适用于 Canvas 渲染。