【问题标题】:Why can't my SurfaceView's game loop run a decent FPS?为什么我的 SurfaceView 的游戏循环不能运行像样的 FPS?
【发布时间】:2023-03-10 00:04:01
【问题描述】:

我拼凑了一个简单的游戏循环,主要使用似乎很流行的技术,特别是在《Killer Game Programming in Java》一书和我刚刚发现的本教程中:Here 只是一个带有后台缓冲区的简单定时游戏循环。

问题在于它不会以良好的 FPS 重绘屏幕。我能从我的摩托罗拉 Xoom 中获得的最佳效果是 15FPS,目标是 24。

如果我将后台缓冲区的大小减半,速度会大大提高,所以我猜这个问题可能与使用 Xoom 上的屏幕有关(我的 SurfaceView 的大小是 1280x727)......然而其他游戏在相同大小下运行良好。

我没有任何其他设备可以测试,所以我现在有点不知道该怎么做。

我在做什么错/错过/不知道?

【问题讨论】:

  • 个人资料! Traceview 是您的朋友。 developer.android.com/guide/developing/debugging/…在您分析完后,用更多信息更新您的问题
  • 我可以从分析器中得出的结果将 98% 以上的负载用于将缓冲区绘制到 SurfaceView 画布上。

标签: android surfaceview frame-rate game-loop


【解决方案1】:

可能是您的位图和表面的像素格式不同,导致每次绘制位图时都会发生转换?这肯定会导致开销。尝试使用SurfaceHolder.setFormat() 进行试验,看看是否有帮助。

由于您的位图使用Bitmap.Config.ARGB_8888,您可以尝试将表面支架格式设置为PixelFormat.RGBA_8888。或者,如果可以,请尝试使用Bitmap.Config.RGB_565PixelFormat.RGB_565

【讨论】:

  • 这真是太划算了。谢谢你。我将缓冲区位图的格式更改为 RGB_565,它可以流畅地运行到每秒约 50 帧。
  • 好!也就是说,请注意可能的兼容性问题。如果您更改默认像素格式,那么我建议您在多台设备上进行测试。我认为在你的情况下应该没问题,但是在使用 OpenGL 做类似的事情时我已经遇到了一些颜色问题。
  • 你在这里的回答帮助我解决了一个不相关的问题,所以 +1。通过在我的SurfaceView 中应用PixelFormat.RGBA_8888,我消除了由于SurfaceView 默认情况下显然不是ARGB_8888 而导致的恼人的渐变色带。
【解决方案2】:

需要一些代码,但我怀疑您没有使用任何线程?如果您不使用线程,那么您的程序将不稳定并经常崩溃,因为您的所有处理都在同一个线程上

简而言之,确保你已经创建了一个新线程,我使用 OpenGL,它无论如何都需要一个线程,所以这可能是你最好的路线

【讨论】:

  • 是的。我正在使用线程。我没有发布任何代码,因为我的实现几乎与指定的链接完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2022-11-12
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多