较快的 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 渲染。
我将 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 渲染。