有没有办法从SKShapeNode创建SKTexture?已知形状节点会导致内存问题,我正在寻找一种从它们创建静态图形的方法(最好是.png)。
答案 0 :(得分:12)
您可以使用名为SKView
textureFromNode:
方法
以下是参考文献:
<强> textureFromNode:强>
渲染并返回包含节点内容的Sprite Kit纹理。
- (SKTexture *)textureFromNode:(SKNode *)node
<强> 参数 强>
节点
表示要渲染到纹理的内容的节点对象。
返回值
保存渲染图像的Sprite Kit纹理。
<强>讨论强> 正在渲染的节点不需要出现在视图的呈现场景中。创建新纹理的大小等于节点的calculateAccumulatedFrame方法返回的矩形。如果节点不是场景节点,则使用清晰的背景颜色([SKColor clearColor])渲染。
UPDATE--在探索SKShapeNode之后,确认存在内存泄漏问题,围绕分配路径然后删除节点,我有一个想法...
不是一个新想法,更多是一个改变用途的想法。这个奇妙的想法实际上允许我使用SKShapeNodes到我心中的内容:)
<强>池强>
是的......我刚创建了一个SKShapeNodes池,我根据需要重用了它。这有什么不同:)所以只需在需要的时候重新定义路径,当使用返回你的游泳池完成时,它将等待你以后再次玩。
您只需在需要时重新定义路径,使用返回游泳池完成后,它将等待您以后再次玩游戏。
在NSMutableArray
被叫池中创建一个ivar或属性SKScene
,并在初始化SKScene
时创建它。您可以在初始化期间使用形状节点填充数组,也可以根据需要创建它们。
这是我为从池中获取新节点而创建的快速方法:
-(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
完成使用shape节点后,只需将其返回到池并将路径设置为。例如:
[pool addObject:shape];
[shape removeFromParent];
shape.path = NULL;
我知道这是一种解决方法而不是一个理想的解决方案,但对于任何想要使用大量SKShapeNodes而不是流失内存的人来说,这肯定是一种非常可行的解决方法。