1

我在两个数组 displayGrid1 和 displayGrid2 中都有一个编号为 1200 的 CCSprite 池。在显示墙壁或地板时,我将它们变为可见或不可见。地板有许多不同的纹理,并且不依赖于 z 顺序。墙壁也有几个纹理并且依赖于 z 顺序。

移动时我得到大约 6-7 帧,这没关系,因为它是基于回合的等距流氓。但是,我也得到了少量的闪烁,我认为这与性能有关,因为模拟器上没有闪烁。

我想提高性能。我正在考虑为地板使用数组 CCSpriteBatchNodes,它不依赖于 z 顺序,但我担心在该数组的元素之间频繁添加和删除精灵的成本,我认为这是必要的。

谁能告诉我如何提高性能?

4

1 回答 1

1

正如评论中提到的,您正在使用单独加载的多个小精灵文件,这可能会导致性能问题,因为浪费了内存来存储每个单独的精灵周围的多余像素数据。出于性能原因,OpenGL 纹理中的每一行像素数据必须具有总计为 2 的幂的字节数。尽管我相信 iOS 下的 OpenGL ES 会自动执行此操作,但它会带来很大的性能影响。将精灵组合成一个大小正确的纹理可以极大地提高渲染性能。

您可以使用 Zwoptex 之类的应用程序将所有这些较小的精灵文件分组到一个更大、更易于管理的精灵表/纹理图集中,并为每个精灵表/纹理图集使用一个 CCSpriteBatchNode。

Cocos2D 对使用带有纹理图集的精灵表有很好的支持,并且可以毫不费力地将代码转换为使用这些而不是单个文件。从纹理图集中创建单个精灵很容易,您只需按名称而不是从文件中调用精灵。

CCSpriteBatchNodes 将 OpenGL 调用组合在一起以调用它们的 sprite,这个过程称为批处理,这导致操作系统和 OpenGL 必须减少与 GPU 的往返次数,从而大大提高了性能。不幸的是,CCSpriteBatchNodes 仅限于为支持它们的纹理绘制精灵(输入精灵表/纹理图集)。

于 2012-10-18T19:44:38.350 回答