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 を使用すると、これは発生しません。誰でもこれを修正できますか?

概要: スプライト キット テンプレート プロジェクトを作成し、多くの SKShapeNode を追加して、古い SKScene を新しいものに置き換えます。

サンプルプロジェクトをgithubに追加しましたhttps://github.com/zeiteisen/MemoryTest

4

2 に答える 2

1

別の投稿を読んでいるときに、この問題に気づきました。私SKShapeNodeは少しいじって、ここで特定されたメモリリークの問題を実際に確認しました。

そうこうしているうちに、ふと思いついた…

まったく新しいアイデアではなく、再利用されたアイデアです。この素晴らしいアイデアのおかげで、SKShapeNodes を心ゆくまで使用することができました :)

プーリング

うん... 必要に応じて再利用する SKShapeNodes のプールを作成しました。それがどんな違いを生むか:)

必要に応じて、return to your pool を使用してパスを再定義するだけで、後で再びプレイできるようにそこで待機します。

呼び出されたプールNSMutableArrayにivar またはプロパティを作成し、 . 初期化中に形状ノードを配列に入力するか、必要に応じて作成することができます。SKSceneSKScene

これは、プールから新しいノードを取得するために作成した簡単な方法です。

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

これは回避策であり、理想的なソリューションではないことは承知していますが、これは多数の SKShapeNode を使用し、メモリを浪費したくない人にとっては非常に実行可能な回避策です。

于 2014-05-06T00:46:33.383 に答える
0

形状を追加していて、それを削除した直後に、なぜですか?

[self addChild:shape];

[shape removeFromParent]
于 2013-12-27T10:13:14.787 に答える