我想做什么:
我想使用精灵表来加载游戏中的所有敌人。一旦它们被好人摧毁或者当它们离开屏幕时它们就必须被移除。我有6-7个敌人,其中一些是动画。我会多次重复使用它们。我想从内存中有效地加载和卸载它们。
我在做什么:
我首先加载spritesheets:
[[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"];
我从图层中删除了sprite,然后释放了该类的实例。
[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];
这是一种更好的方法吗?请分享您的意见和建议。感谢。
答案 0 :(得分:2)
正如你所说,你正在做的事情很好。
你的选择是一个糟糕的主意。我会告诉你原因:你会想要避免将纹理加载到内存中并在游戏过程中经常将它们从内存中删除。从闪存加载纹理很慢。从内存中删除纹理也需要一点时间,如果你有足够的可用内存,那么它就毫无意义。
此外,如果您正在使用spritesheet并且您正在移除一个障碍物但是尝试从内存中移除障碍物的纹理(也就是Obstacles.pvr.ccz),那么纹理缓存将不会从中移除纹理记忆无论如何。因为spritesheet仍在使用它。