我正在使用SpriteKit渲染一个大的(20 x 20)点网格,如下所示:
我想根据用户输入突出显示行或列。例如,我想将1-10行更改为红色,或将5-15列更改为蓝色。
最有效的方法是什么?
我试过了:
GridNode
)命名每个@"column-4
。然后使用enumerateChildNodesWithName:
将字符串作为@"column-n"
,更改每个节点的颜色(通过更改枚举块中的SKShapeNode
setFillColor :)。我尝试将GridDot
课程设为SKEffectNode
,shouldRasterize:
设为YES
。我已尝试将SKShapeNode
和SKSpriteNode
作为其子项。我还试图删除SKEffectNode
父级,只渲染SKSpriteNode
。
这些选项中的每一个都会使我的整个应用程序滞后,并使我的帧速率下降到~10 FPS。更改许多节点的颜色/ alpha的正确方法是什么(不丢帧)?
其核心问题是渲染这么多节点,是吗?
答案 0 :(得分:3)
当我在使用SKShapeNode时遇到类似的性能问题时,我提出了这个解决方案:
SKShapeNode
。SKView
的方法textureFromNode:crop:
将SKShapeNode转换为SKTexture SKSpriteNode
SKSpriteNode
,而不是SKShapeNode
SKSpriteNode
的{{1}}属性如果您的圆点有一组有限的collors,我认为这种方法适合您的任务。
答案 1 :(得分:3)
与@ amobi的陈述相反,400个节点不很多。例如,我有一个约400个节点的场景和9.8ms的渲染时间和9个绘制调用。
如果您有400次绘制电话,则应尝试减少该号码。要确定每个渲染帧所需的绘制调用量,请实现(某些)以下代码。它实际上来自我自己的SpriteKit应用程序的ViewController类,它包含SpriteKit场景。
skView.showsFPS = YES;
skView.showsNodeCount = YES;
skView.showsDrawCount = YES;
我建议使用SKView's ignoresSiblingOrder
。这样,具有相等zPosition
的SKSpriteNodes将在一个绘制调用中绘制,这对于您看起来具有的多个节点/绘图非常有效。在SKView的ViewController的-viewDidLoad
方法中设置它。
skView.ignoresSiblingOrder = YES;
在这种情况下,我认为没有理由让GPU加载SKEffectNodes。它们通常是提高帧速率的好方法。
基本性能问题意味着您有CPU或GPU瓶颈。用当前的信息很难猜出你正在遭受哪些困扰。您可以启动Profiler,但是当您在连接的设备中运行应用程序时,Xcode本身也会提供有价值的信息。模拟器中的FPS 不代表设备性能。