Ios 如何一次渲染多个SpriteKit节点?

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:) 为所有列指定一个与该列

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

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

最有效的方法是什么?

我试过:

  • 根据每个
    GridNode所处的列(例如
    @“column-4
    )命名每个
    GridNode。然后使用
    EnumerateChildNodeWithName:
    ,字符串为
    @“column-n”
    ,更改枚举块中每个节点的颜色(通过更改
    SKShapeNode
    setFillColor:)
  • 为所有列指定一个与该列关联的父节点。然后告诉父节点更改其alpha(从而更改其所有子节点的alpha)
  • 为不同的列创建数组,然后循环通过每个节点并更改其颜色或alpha
  • 我曾尝试将
    网格点
    类设置为
    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。