Ios 如何一次渲染多个SpriteKit节点?
我正在使用SpriteKit渲染一个大的(20 x 20)点网格,如下所示: 我想根据用户输入突出显示行或列。例如,我想将第1-10行更改为红色,或将第5-15列更改为蓝色 最有效的方法是什么? 我试过:Ios 如何一次渲染多个SpriteKit节点?,ios,opengl-es,sprite-kit,Ios,Opengl Es,Sprite Kit,我正在使用SpriteKit渲染一个大的(20 x 20)点网格,如下所示: 我想根据用户输入突出显示行或列。例如,我想将第1-10行更改为红色,或将第5-15列更改为蓝色 最有效的方法是什么? 我试过: 根据每个GridNode所处的列(例如@“column-4)命名每个GridNode。然后使用EnumerateChildNodeWithName:,字符串为@“column-n”,更改枚举块中每个节点的颜色(通过更改SKShapeNodesetFillColor:) 为所有列指定一个与该列
GridNode所处的列(例如@“column-4
)命名每个GridNode。然后使用EnumerateChildNodeWithName:
,字符串为@“column-n”
,更改枚举块中每个节点的颜色(通过更改SKShapeNode
setFillColor:)
网格点类设置为SKEffectNode
,并将shouldRasterize:
设置为YES
。我曾尝试将SKShapeNode
和SKSpriteNode
作为其子级。我还尝试移除SKEffectNode
父级,只渲染SKSpriteNode
这些选项中的每一个都会使我的整个应用程序滞后,并使我的帧速率下降到~10 FPS。更改许多节点的颜色/alpha(而不下降帧)的正确方法是什么
问题的核心是渲染这么多节点,是吗?当我在使用SKShapeNode时遇到类似的性能问题时,我提出了以下解决方案:
使用所需的路径和颜色创建SKShapeNode
使用SKView
的方法textureFromNode:crop:
将SKShapeNode转换为SKTexture
重复步骤1、2为节点创建所有必需的纹理
从纹理创建SKSpriteNode
在场景中使用创建的SKSpriteNode
,而不是SKShapeNode
需要时使用SKSpriteNode
的纹理
属性更改节点的纹理
如果你的点有一组有限的Collor,我认为这个方法很适合你的任务。与@amobi的说法相反,400个节点不是很多。例如,我有一个约400个节点的场景,渲染时间为9.8毫秒和9个绘制调用
但是,如果您有400个绘制调用,您应该尝试减少该数量。要确定渲染的每个帧所需的绘制调用量,请实现(部分)以下代码。它实际上取自我自己的SpriteKit应用程序的ViewController类,其中包含SpriteKit场景
skView.showsFPS = YES;
skView.showsNodeCount = YES;
skView.showsDrawCount = YES;
提议的解决办法
我建议使用。这样,具有相等zPosition
的SKSpritEndodes将在一个绘制调用中绘制,这(对于您似乎拥有的节点/绘制)非常有效。请在SKView的ViewController的-viewDidLoad
方法中进行设置
skView.ignoresSiblingOrder = YES;
在这种情况下,我看不出有任何理由让GPU负担SKEffectNodes。它们通常是降低帧速率的好方法
最后的想法
基本性能问题意味着您有CPU或GPU瓶颈。根据当前信息,很难猜出您遇到了什么问题。您可以启动探查器,但当您在连接的设备上运行应用程序时,Xcode本身也会提供有价值的信息。模拟器中的FPS不能代表设备性能ance.你的网格有多大?20 x 20个节点,1024 x 768像素。更改节点的颜色不应该那么昂贵……你是在更新方法中这样做的吗?但是400个节点太多了。我不会在更新循环中更改颜色。我应该发布一个代码片段吗?还是要发布一组节点更改的代码片段颜色?(这对我很有帮助!)有用的更新:如果我使用随机纹理渲染SKSpriteNode
s并来回切换纹理,我会得到55 FPS。但是如果我将它们放入SKEffectNode(要获得shouldRasterize=YES
),切换时FPS会下降到10。