如何一次渲染许多SpriteKit节点?

时间:2015-04-13 21:58:59

标签: ios opengl-es sprite-kit

我正在使用SpriteKit渲染一个大的(20 x 20)点网格,如下所示: enter image description here

我想根据用户输入突出显示行或列。例如,我想将1-10行更改为红色,或将5-15​​列更改为蓝色。

最有效的方法是什么?

我试过了:

  1. 根据其所在的列(例如GridNode)命名每个@"column-4。然后使用enumerateChildNodesWithName:将字符串作为@"column-n",更改每个节点的颜色(通过更改枚举块中的SKShapeNode setFillColor :)。
  2. 为所有列提供与该列关联的父节点。然后告诉父节点更改其alpha(从而更改其所有子节点的alpha)。
  3. 为不同的列创建数组,然后循环遍历每个节点并更改其颜色或alpha。
  4. 我尝试将GridDot课程设为SKEffectNodeshouldRasterize:设为YES。我已尝试将SKShapeNodeSKSpriteNode作为其子项。我还试图删除SKEffectNode父级,只渲染SKSpriteNode

    这些选项中的每一个都会使我的整个应用程序滞后,并使我的帧速率下降到~10 FPS。更改许多节点的颜色/ alpha的正确方法是什么(不丢帧)?

    其核心问题是渲染这么多节点,是吗?

2 个答案:

答案 0 :(得分:3)

当我在使用SKShapeNode时遇到类似的性能问题时,我提出了这个解决方案:

  1. 使用所需的路径和颜色创建SKShapeNode
  2. 使用SKView的方法textureFromNode:crop:将SKShapeNode转换为SKTexture
  3. 重复步骤1,2,为节点创建所有必需的纹理。
  4. 从纹理
  5. 创建SKSpriteNode
  6. 在场景中使用已创建的SKSpriteNode,而不是SKShapeNode
  7. 使用SKSpriteNode的{​​{1}}属性
  8. 在需要时更改节点的纹理

    如果您的圆点有一组有限的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 代表设备性能。