这就是我所做的:
- 用 min 创建 textureAtlas。过滤器 = 最近和 mag。过滤器 = 最近。
- 从 textureAtlas.findRegion() 获取一个 TextureRegion。
- 使用 SpriteBatch 将其绘制到屏幕上。这很简单,但是当我绘制一个大区域(在我的情况下为 480x320)时,帧速率会大大降低!
绘制 1-30 个区域通常是 30 fps,但只有 1 个大的 480x320 区域只有 20 fps!
你是在模拟器上运行的吗?模拟器永远不是应用程序实际性能的指标。在真机上测试。
话虽这么说:在常见的 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();
这可以通过对相同纹理的绘制进行分组或使用纹理图集来解决。
如果您还没有阅读它,那么您可能会发现这篇文章很有用。它描述了绘制大纹理时的性能特征。
据我所知,在绘制许多区域时,一部分绘制命令会发送到 GPU 进行渲染,而您仍在向 spritebatch 添加新的绘制命令。
当达到批处理的大小、绑定新纹理或调用 flush() 时,会发生这种情况。
如果我对文档的理解正确,这样 cpu 和 gpu 就不必互相等待很长时间,并且可以获得性能提升。
但是,如果每帧只有一个大区域的绘制命令,则 spritebatch 无法将命令部分发送到 gpu,因为......嗯......只有一个^^
如果你真的只想画一个精灵,你可以把它分成几个区域......(正如你所说,你有 10fps 以上)
但我想一旦你必须绘制更多的精灵,除了大的,会有无需拆分它。