6

如果我在 SKScene sublass 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];

        }

每次我在我的 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];

我的内存使用量会增长,直到内存已满并崩溃。如果我使用 SKSpriteNode,则不会发生这种情况。有没有人解决这个问题?

总结:我创建了精灵套件模板项目,添加了很多SKShapeNodes,并用新的SKScene替换了旧的SKScene。

我向 github https://github.com/zeiteisen/MemoryTest添加了一个示例项目

4

2 回答 2

1

我在阅读另一篇文章时意识到了这个问题。我搞砸SKShapeNode了一点,确实验证了这里指出的内存泄漏问题。

在这样做的时候,我有一个想法......

并不是一个真正的新想法,更像是一个重新调整用途的想法。这个绝妙的想法实际上让我可以尽情使用 SKShapeNodes :)

汇集

是的...我刚刚创建了一个 SKShapeNodes 池,可以根据需要重复使用。这有什么区别:)

您只需在需要时重新定义路径,完成后使用返回您的池,它会在那里等待您稍后再次使用。

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;
}

因此,无论在场景中需要 SKShapeNode 的任何地方,都可以这样做:

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

使用完形状节点后,只需将其返回到池中并将路径设置为 NULL,例如:

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

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

于 2014-05-06T00:46:33.383 回答
0

您正在添加形状,然后直接删除它,为什么?

[self addChild:shape];

[shape removeFromParent]
于 2013-12-27T10:13:14.787 回答