1

私がやりたいこと:

スプライトシートを使用して、ゲーム内のすべての敵をロードしたいと思います。それらは、善良な人によって破壊されたとき、または画面から消えたときに削除する必要があります。私には6〜7人の敵がいて、そのうちのいくつかはアニメーションです。何度も再利用します。それらをメモリから効果的にロードおよびアンロードしたいと思います。

私がしていること:

最初にスプライトシートをロードします。

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Obstacles.plist"];
CCSpriteBatchNode *obstaclesspriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"Obstacles.pvr.ccz"];
[self addChild:obstaclesspriteSheet]; 

私は悪者を扱うBadBoysと呼ばれるクラスを持っています。悪者を作成するたびに、クラスのインスタンスを作成します。クラス内でスプライトを作成し、レイヤーに追加します。

baddies[x] = [[BadBoys alloc] init];

//INSIDE THE CLASS
baddie = [CCSprite spriteWithSpriteFrameName:@"cannonball-hd.png"];

スプライトが破壊されたらレイヤーからスプライトを削除し、クラスのインスタンスを解放します。

[self removeChild:[baddies[x] getBaddie] cleanup:YES]; //getBaddie returns the sprite
[baddies[x] release];

私はこれがそれを行うための良い方法であることを知っています。私が知りたいのは、これがこれを行う最も効率的な方法であるかどうかです。画像を読み込む別の方法を考えました。

CCTextureCacheに非同期で画像をロードします。次に、キャッシュのテクスチャを使用してスプライトを作成します。生きているすべての敵を保持するNSMutableArrayに追加します。それから、もう必要なくなったら、次の方法で破壊できます。

CCTexture2D * texture = spriteName.texture;
[spriteName.parent removeChild:spriteName cleanup:YES];
[[CCTextureCache sharedTextureCache] removeTexture:texture];
[backgroundSprites removeObject:spriteName];

これはより良い方法ですか?あなたの意見や提案を共有してください。ありがとう。

4

1 に答える 1

2

あなたが言ったように、あなたがしていることは良いことです。

あなたの選択肢はひどい考えです。理由を説明します。ゲームプレイ中にテクスチャをメモリにロードしたり、メモリから頻繁に削除したりすることは避けたいと思うでしょう。フラッシュメモリからのテクスチャのロードは遅いです。メモリからテクスチャを削除するのにも少し時間がかかります。とにかく十分な空きメモリがある場合は、かなり無意味です。

さらに、スプライトシートを使用していて、障害物を1つ削除しているが、障害物のテクスチャ(Obstacles.pvr.ccz)もメモリから削除しようとすると、テクスチャキャッシュはテクスチャをメモリから削除しません。まだスプライトシートで使用されているからです。

最後に、時期尚早の最適化はすべての悪の根源です

于 2012-07-27T19:52:10.923 に答える