减少 SpriteKit 中的绘制计数(通过)

Reducing number of draw counts (passes) in SpriteKit

我想优化绘制计数,但不知道从哪里开始。

有人可以简要解释(或指出正确的方向)哪些因素会影响平局,是否有办法 view/debug 它们以及是否有任何优化提示?抽奖的最佳次数是多少?

例如,我的游戏为整个 ui 加载一个纹理图集,并使用子节点作为不同游戏菜单的容器(而不是单独的场景)。但是一个屏幕的draw count是20+,fps下降10-15,这是个问题。

绘制计数是需要以正确的顺序对场景进行分层的结果,例如,如果某些节点具有一定的透明度,则它们可能依赖于其背后的内容。

1:减少绘制次数的最大方法之一是一次渲染多个节点——这可以通过在同一层中添加你想要的子节点来实现一个父节点。例如,有一个名为 nodeCollection 的父节点,并使用 addChild() 添加多个要一起渲染的节点以降低性能损失。

2: 您可以做的另一件事是在 SKView 上将 ignoresSiblingOrder 设置为 true,并在 zPosition 上使用 zPosition每个节点 - 这意味着 SpriteKit 必须做更少的工作,因为你更明确。

3: 不要为 UI 使用 SpriteKit!这就是 UIKit 的用途!你有你的 SKView,里面有你的 SKSceneSKViewUIView 的子类,这意味着您已将其放置在您的视图控制器之一中。您需要做的就是在 SKView 顶部的视图控制器中添加移动视图或按钮或任何您想要的内容,然后就可以了!

如需更多优化,我建议查看:Hacking with Swift - 15 tips to optimize your SpriteKit game

好的,游戏场景的境界是由层组成的。每个 zPosition 都引用属于一个层的节点。 (属性 被称为 zPosition 的原因是因为它的节点位置沿 zAxis)

如果您有一个带有 4 个 SKSpriteNode 的 gameScene 并如上所示为节点提供了 zPositions,那么系统会将您的意图解释为如上图所示。渲染系统时,绘制计数为 4。绘制计数为 1 时,将渲染所有 zPosition 为 1 的节点。在绘制计数为 2 时,将渲染所有 zPosition 为 2 的节点,依此类推。这被称为画家算法。就像画家画画一样。

现在说在我们的游戏场景中,我们想将另一个 SKSpriteNode 添加到节点 3。如果我们将它作为子节点添加到节点 3,那么这就是

var ignoresSiblingOrder: Bool { get set }

开始发挥作用。如果设置为 false 那么我们的新节点将在父节点 3 之后呈现。所以它的 zPosition 应该是 3.5。我们的绘制计数现在已增加到 5。如果设置为 true,系统将忽略 child/parent 关系,我们的绘制计数将再次下降到 4,但无法保证系统将首先呈现什么。节点 3 或我们的新节点。这是结果是不确定的,意味着它不会 return 相同的结果。有时 node3 会在其子节点之上呈现。其他时候,子节点将呈现在父节点之上。

最后一点也是非常重要的一点是,只有当两个节点之间发生重叠时,系统才会考虑 zPosition。

优化的一个好方法是尽可能制作单一纹理。如果不需要单独的节点,那就不要!创建一个纹理并使用它。

这是关键,可能也是最重要的一点。如果可能,避免节点重叠。 zPosition 仅在节点覆盖期间被考虑在内。如果你有 1000 个节点都具有不同的 zPositions,但是 none 其中重叠猜猜是什么......你的绘制计数为 1.

如果无法避免节点覆盖,并且在某些情况下通常无法避免。将 ignoreSiblingOrder 设置为 true。 (您实际上不需要这样做,但它使事情变得更简单并允许您指定绘制周期)确保为所有节点设置 zPositions。但是关键记住,每次你创建一个新的 zPosition 时,只要该节点与另一个节点相交,你就会将绘制计数增加 1。

希望对您有所帮助