【问题标题】:Low framerate when use large textureRegion in libgdx在 libgdx 中使用大纹理区域时帧速率低
【发布时间】:2016-12-03 07:04:28
【问题描述】:

这就是我的做法:

  1. 创建textureAtlas,最小。过滤器 = 最近和 mag。过滤器 = 最近。
  2. 从 textureAtlas.findRegion() 获取 TextureRegion。
  3. 使用 SpriteBatch 将其绘制到屏幕上。 这很简单,但是当我绘制一个大区域(在我的情况下为 480x320)时,帧速率会大大降低!

绘制 1-30 个区域通常为 30 fps,但仅 1 个大型 480x320 区域仅为 20fps!

【问题讨论】:

  • 480x320 不大。一个平庸的安卓设备应该能够毫无问题地处理几个 1028x1028 纹理。发布您的代码,以便我们进一步分析它。任何其他信息(例如您用于测试的设备及其使用年限)也会很有用。

标签: android textures libgdx


【解决方案1】:

你是在模拟器上运行这个吗?模拟器永远不是应用程序实际性能的指标。在真机上测试。

话虽如此:在普通的 Android 设备上,您可以填充屏幕大约 1.6-2 次。这个数字当然只是一个大概的数字,并且受以下因素的影响,例如是否启用混合(如果启用则更糟)、过滤(接近、线性,需要更多的处理能力)、纹理的颜色深度(16 位RGB,32位RGBA,越高需要的带宽越多)。

虽然不是您的问题的一部分,但您也应该尽可能避免切换纹理。例如,这将是一个反模式:

batch.begin();
batch.draw(tex1, 0, 0);
batch.draw(tex2, 10, 30);
batch.draw(tex1, 40, 20);
....
batch.end();

这可以通过对相同纹理的绘制分组或使用纹理图集来解决。

【讨论】:

  • 就我而言,我只使用了一个 1024-1024 TextureAtlas。当我为模拟器启用 GPU 加速时,FRS 总是大 40-60,即使有 8-12 个大区域。如果我只是购买一部真正的手机进行性能测试,也许会更好。无论如何,非常感谢!
  • P/s:如果我对2个TextureAtlas使用两个不同的SpriteBatch,还是叫纹理切换吗?
【解决方案2】:

如果您还没有阅读它,那么您可能会发现this article 很有用。它描述了绘制大纹理时的性能特征。

【讨论】:

  • 我花了 2 个小时阅读和尝试,但没有运气 :((。而且我认为提供的解决方案是在您需要缩放时使用的,对吗?在我的情况下,没有进行缩放。此外,当我使用 MipmapLN-Nearest 过滤器时,它甚至会减慢到 9 fps(1 480x320 纹理)。:(
【解决方案3】:

据我所知,在绘制多个区域时,一部分绘制命令会发送到 GPU 进行渲染,而您仍在向 spritebatch 添加新的绘制命令。
当达到批量大小、绑定新纹理或调用 flush() 时会发生这种情况。
如果我对文档的理解正确,这样 cpu 和 gpu 就不必相互等待很长时间,并且可以获得性能提升。
但是,如果每帧只有一个大区域的绘制命令,则 spritebatch 无法将命令部分发送到 gpu,因为......嗯......只有一个^^

如果你真的只想画一个精灵,你可以把它分成几个区域......(正如你所说,你有 10fps 更多)
但我想一旦你必须绘制除了大精灵之外的更多精灵,就没有必要分割它了。

【讨论】:

  • 是的,我可以通过多次绘制来做到这一点,但是是不是有点奇怪,绘制10次比只绘制1次要慢:D?此外,在这种情况下不会发生“达到批次的大小”,对吧(只有 1 个区域)?我可以使用任何其他方法来绘制大纹理,例如背景吗?游戏背景怎么画?
猜你喜欢
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多