Sprite kit 减少SpriteKit中的绘图计数(过程)数

Sprite kit 减少SpriteKit中的绘图计数(过程)数,sprite-kit,sknode,Sprite Kit,Sknode,我想优化抽签数量,但不知道从哪里开始 有人能简单地解释一下(或给我指出正确的方向)哪些因素会影响绘图,有没有查看/调试它们的方法,有没有优化技巧?抽签的最佳计数是多少 例如,我的游戏为整个ui加载一个纹理图集,并使用子节点作为不同游戏菜单的容器(而不是单独的场景)。但是一个屏幕的绘制计数为20+,fps下降10-15,这是一个问题。绘制计数是需要以正确的顺序对场景进行分层的结果,例如,如果某些节点具有一定的透明度,则它们可能依赖于场景后面的内容 1:减少绘制计数的最大方法之一是一次渲染多个节点-

我想优化抽签数量,但不知道从哪里开始

有人能简单地解释一下(或给我指出正确的方向)哪些因素会影响绘图,有没有查看/调试它们的方法,有没有优化技巧?抽签的最佳计数是多少


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

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

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

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

3:不要在UI中使用SpriteKit!这就是UIKit的用途!您有您的
SKView
,它保存您的
SKScene
SKView
UIView
的一个子类,这意味着您将其放置在一个视图控制器中。您只需在
SKView
顶部的视图控制器中添加移动视图或按钮或任何您想要的内容,就可以设置了


要获得更多的优化,我建议查看:。

好吧,认为游戏场景是由层组成的。每个zPosition都引用属于某个层的节点。(该属性之所以称为zPosition,是因为它的节点位置沿zAxis)

如果你有一个有4个SKSpriteNodes的游戏场景,并给出了节点的位置,如上图所示,那么系统会将你的意图解释为如上图所示。渲染时,系统的绘制计数为4。在“绘制计数1”中,将渲染位置为1的所有节点。在“绘制计数2”中,将渲染zPosition为2的所有节点,依此类推。这就是所谓的画家算法。就像画家画画一样

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

var ignoresSiblingOrder: Bool { get set }
开始起作用。如果设置为false,则新节点将在父节点3之后呈现。所以它的位置是3.5。我们的抽签数量现在增加到了5。如果设置为true,系统将忽略子/父关系,我们的绘制计数将再次降至4,但无法保证系统将首先渲染什么。节点3或我们的新节点。这是一个不确定的结果,意味着它不会返回相同的结果。有时节点3将在其子节点的顶部进行渲染。其他时候,子节点将在父节点的顶部渲染

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

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

这是关键,也可能是最重要的一点。如果可能,避免节点重叠。zPosition仅在节点覆盖期间考虑。如果有1000个节点都有不同的位置,但没有一个重叠,猜猜看。。。。你的抽签数是1

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


希望这有帮助

您确定第1点吗?如果添加的节点附着了多个节点,且每个节点具有不同的zPosition值,则不会减少绘制计数。即使考虑到成本(只是一点点……但仍然如此),再加上乔治的观点,我想说最重要的一件事是看看你在做什么,并认为我真的需要有一个不同的立场。如果答案是肯定的,那就这样吧。如果你不能摆脱它。抽签计数基于您拥有的不同位置的数量。编译器操作系统足够聪明,不会使用未引用的zPositions,因此如果有2个节点。节点1位于Z1位置,节点2位于Z100位置,您仍然只有2个绘图计数。ignoresSiblingOrder设置为true。但现在我很困惑。zPosition是否影响绘图或父/子关系,或两者都影响?我应该使用委托将节点传递给1个节点并在那里使用addChild(),或者尽可能减少zPos,或者两者兼而有之?@elektricni是指节点的位置和层次结构决定渲染顺序。如果您有一个大的节点树,这可能会非常昂贵。仅在
ignoresSiblingOrder=true
时使用
zPosition
zPosition
仅将节点放置在右侧渲染层上,但不会减少绘制调用。当场景中的节点较少时,绘制调用会减少(这就是为什么可以将多个节点添加到父节点,以便SpriteKit知道它们都将一起渲染)。@hoboBob我想说的是,不要将节点的
zPosition
设置为都是父节点的子节点。我不确定这方面的性能,但父节点应该代表整个层(例如,胸围板网格的父节点为64个,不需要
zPosition
)。等等,