从SKShapeNode创建SKTexture

Iva*_*sko 8 objective-c ios sprite-kit

有没有办法从SKShapeNode创建SKTexture?已知形状节点会导致内存问题,我正在寻找一种从它们创建静态图形的方法(最好是.png).

pro*_*cal 12

您可以使用SKView调用的方法textureFromNode:

这是来自参考:

textureFromNode:

呈现并返回包含节点内容的Sprite Kit纹理.

- (SKTexture *)textureFromNode:(SKNode *)node
Run Code Online (Sandbox Code Playgroud)

参数

节点

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

回报价值

保存渲染图像的Sprite Kit纹理.

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

更新 - 在探索SKShapeNode之后,确认存在内存泄漏问题,围绕分配路径然后删除节点,我有一个想法......

不是一个新想法,更多是一个改变用途的想法.这个奇妙的想法实际上允许我使用SKShapeNodes到我心中的内容:)

POOLING

是的......我刚创建了一个SKShapeNodes池,我根据需要重用了它.这有什么不同:)所以只需在需要的时候重新定义路径,当使用返回你的游泳池完成时,它将等待你以后再次玩.

您只需在需要时重新定义路径,使用返回游泳池完成后,它将等待您稍后再次玩游戏.

NSMutableArraySKScene被调用的池中创建一个ivar或property ,并在初始化时创建它SKScene.您可以在init期间使用形状节点填充数组,也可以根据需要创建它们.

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

-(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;
}
Run Code Online (Sandbox Code Playgroud)

所以无论你在场景中需要SKShapeNode,你都会这样做:

SKShapeNode *shape = [self getShapeNode];
// do whatever you need to do with the instance
Run Code Online (Sandbox Code Playgroud)

完成使用shape节点后,只需将其返回到池并将路径设置为.例如 :

[pool addObject:shape];
[shape removeFromParent];
shape.path = NULL;
Run Code Online (Sandbox Code Playgroud)

我知道这是一种解决方法,而不是一个理想的解决方案,但对于任何想要使用大量SKShapeNodes而不是流失内存的人来说,这肯定是一种非常可行的解决方法.