从SKShapeNode创build一个SKTexture

有没有办法从SKShapeNode创build一个SKTexture? 形状节点已知会导致内存问题,我正在寻找一种方法来创build一个静态graphics(.png最好)。

您可以使用名为textureFromNode:SKView方法textureFromNode:

以下是参考资料:

textureFromNode:

渲染并返回包含节点内容的Sprite Kit纹理。

 - (SKTexture *)textureFromNode:(SKNode *)node 

参数

节点

表示要渲染到纹理的内容的节点对象。

返回值

包含渲染图像的Sprite Kit纹理。

讨论正在渲染的节点不需要出现在视图的呈现场景中。 新纹理的创build大小等于节点的calculateAccumulatedFrame方法返回的矩形。 如果节点不是场景节点,则使用清晰的背景色([SKColor clearColor])进行渲染。

更新 – 探索SKShapeNode一点,并validation确实有一个内存泄漏问题围绕分配一个path,然后删除节点,我有一个想法…

不是一个真正的新想法,更重要的是一个新的想法。 这个奇妙的想法实际上让我可以使用SKShapeNodes到我的心中:)

POOLING

是的…我刚刚创build了一个SKShapeNodes池,我根据需要重用。 这有什么不同:)所以,只要需要重新定义path,完成使用返回到你的游泳池,它会在那里等待你再次玩。

你只需要重新定义path,当完成使用返回到你的游泳池,它会在那里等待你再次玩。

SKScene创build一个ivar或属性NSMutableArray ,并在初始化SKScene时创build它。 您可以在初始化期间使用形状节点填充arrays,也可以根据需要创build它们。

这是我为从池中获取新节点而创build的快速方法:

 -(SKShapeNode *)getShapeNode { if (pool.count > 0) { SKShapeNode *shape = pool[0]; [pool removeObjectAtIndex:0]; return shape; } // if there is not any nodes left in the pool, create a new one to return SKShapeNode *shape = [SKShapeNode node]; return shape; } 

所以在场景中你需要一个SKShapeNode,你可以这样做:

 SKShapeNode *shape = [self getShapeNode]; // do whatever you need to do with the instance 

完成使用形状节点时,只需将其返回到池并将path设置为。 例如 :

 [pool addObject:shape]; [shape removeFromParent]; shape.path = NULL; 

我知道这是一个解决方法,而不是一个理想的解决scheme,但是对于任何想要使用大量SKShapeNodes而不会泄漏内存的人来说,这是一个非常可行的解决方法。