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

正如你所说,你所做的很好。

你的替代方案是一个糟糕的主意。我会告诉你原因:你会希望避免在游戏过程中将纹理加载到内存中并经常从内存中删除它们。从闪存加载纹理很慢。从内存中删除纹理也需要一些时间,而且如果你有足够的可用内存可用,那就毫无意义了。

此外,如果您使用 spritesheet 并且您正在移除一个障碍物,但也尝试从内存中移除障碍物的纹理(即 Obstacles.pvr.ccz),那么纹理缓存无论如何都不会从内存中移除纹理。因为它仍然被 spritesheet 使用。

最后:过早优化是万恶之源

于 2012-07-27T19:52:10.923 回答