zei*_*sen 6 memory-management ios7 sprite-kit
如果我在SKScene子类init方法中运行此代码
for (int i = 0; i < 100; i++) {
SKShapeNode *shape = [SKShapeNode node];
shape.antialiased = NO;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, CGRectMake(arc4random()%320, arc4random()%320, 10, 10));
shape.path = path;
[shape setStrokeColor:[UIColor blackColor]];
CGPathRelease(path);
[self addChild:shape];
[shape removeFromParent];
}
Run Code Online (Sandbox Code Playgroud)
每次我在SKView控制器中运行此代码
SKView * skView = (SKView *)self.view;
// Create and configure the scene.
SKScene * scene = [ZTMyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
Run Code Online (Sandbox Code Playgroud)
我的内存使用量一直在增长,直到内存已满并崩溃.如果我使用SKSpriteNode,则不会发生这种情况.有没有人解决这个问题?
简介:我创建了sprite kit模板项目,添加了很多SKShapeNodes并用新的SKScene替换旧的SKScene.
我向github https://github.com/zeiteisen/MemoryTest添加了一个示例项目
我在阅读另一篇文章时意识到这个问题。我搞了一下SKShapeNode
,确实验证了这里指出的内存泄漏问题。
当我这样做的时候,我有了一个想法......
这并不是一个真正的新想法,更多的是一种重新利用的想法。这个奇妙的想法实际上让我能够使用 SKShapeNodes 来满足我的心意:)
池化
是的...我刚刚创建了一个 SKShapeNode 池,并根据需要重复使用。这是多么不同的事情啊:)
您只需在需要时重新定义路径,完成后使用返回池,它就会在那里等待您稍后再次玩。
NSMutableArray
在被调用池中创建一个 ivar 或属性SKScene
,并在初始化SKScene
. 您可以在初始化期间使用形状节点填充数组,也可以根据需要创建它们。
这是我创建的用于从池中获取新节点的快速方法:
-(SKShapeNode *)getShapeNode
{
if (pool.count > 0)
{
SKShapeNode *shape = pool[0];
[pool removeObject:shape];
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)
使用完形状节点后,只需将其返回到池中并将路径设置为 NULL,例如:
[pool addObject:shape];
[shape removeFromParent];
shape.path = NULL;
Run Code Online (Sandbox Code Playgroud)
我知道这是一种解决方法,而不是理想的解决方案,但对于任何想要使用大量 SKShapeNode 且不占用内存的人来说,这无疑是一种非常可行的解决方法。