0

给定一张纹理表,拥有一个或多个 CCSpriteBatchNode 更好吗?或者这不会影响处理不可见 CCSprite 四边形的 GPU 计算成本吗?

我正在考虑性能并参考我得到的这个问题和答案。基本上它建议我应该使用多个 CCSpriteBatchNode,即使我只有一个文件。我不明白“太多的批处理精灵仍然会对性能产生负面影响,即使它们不可见或在屏幕之外”这句话是否也适用于有两个 CCSpriteBatchNode 而不是一个。换句话说,这句话是否指的是“GPU负责取消由于完全在屏幕之外而不可见的四边形的绘制。它仍然需要处理这些四边形。”?如果是这样,这应该意味着我的 CCSpriteBatchNode 实例如何使用相同的纹理表并不重要,对吧?

我该如何优化呢?我的意思是,我怎样才能避免 GPU 不得不处理不可见的四边形?

你能至少回答粗体字的问题吗?

4

3 回答 3

2

第一种情况:场景中有太多节点(或精灵),其中许多节点超出屏幕/可见区域。在这种情况下,对于每个精灵,GPU 必须检查它是否在可见区域之外。太多的精灵节点意味着 GPU 上的负载过多。

添加更多 CCSpriteBatchNode 不会影响性能。因为 sprite-sheet 位图被加载到 GPU 内存中,并且应用程序保存了一个坐标数组来绘制单个 sprite。因此,如果您将 2 个图像放在 2 个不同的 CCSpriteBatchNodes 中或将 2 个图像放在 1 个中,CPU 和 GPU 将是相同的。

如何优化?最好的方法是从父级中删除不可见的节点/精灵。但这取决于您的应用程序。

于 2012-09-24T12:24:50.160 回答
1

FPS 下降肯定有两个原因:

  • fillrate - 当很多精灵相互重叠时(另外,如果我们将高分辨率纹理渲染成小精灵)
  • 冗余状态更改- 在这种情况下,最重的是着色器和纹理切换

您可以在单个批次中在屏幕外渲染精灵,这不会显着降低性能。请注意,渲染具有零不透明度(或透明纹理)的精灵与非透明精灵所花费的时间相同。

于 2012-09-24T11:28:27.490 回答
0

首先,这听起来确实像是一个过早优化的案例。使用您希望在屏幕上显示的精灵数量进行测试,并添加一些,删除一些。您在最旧的受支持设备上获得 60 fps 吗?如果是,很好,不需要优化。如果不是,请调整代码设计以查看实际有什么不同。

 I mean, how can I avoid the GPU having to process the non visible quads?

你不能,除非你要重写 cocos2d 如何处理精灵/批量精灵的绘制。

it doesn't really matter how may CCSpriteBatchNode instances I have using the same texture sheet, right?

每个额外的精灵批处理节点都会添加一个绘制调用。考虑到他们可以将多少精灵批处理到一个绘图调用中,好处远远超过缺点。无论您有一个、两个还是三个 sprite 批处理节点,都完全没有区别。

于 2012-09-25T10:20:58.497 回答