Memory management 如何有效地使用雪碧床单?

Memory management 如何有效地使用雪碧床单?,memory-management,cocos2d-iphone,sprite-sheet,Memory Management,Cocos2d Iphone,Sprite Sheet,我想做的是: 我想用精灵床单来装载游戏中所有的敌人。一旦他们被好人摧毁或者离开屏幕,他们就必须被移除。我有6-7个敌人,其中一些是动画。我将多次重复使用它们。我想从内存中有效地加载和卸载它们 我在做什么: 我首先加载精灵表: [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Obstacles.plist"]; CCSpriteBatchNode *obstaclesspriteSheet = [CCSp

我想做的是:

我想用精灵床单来装载游戏中所有的敌人。一旦他们被好人摧毁或者离开屏幕,他们就必须被移除。我有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];

这是更好的方法吗?请分享您的观点和建议。谢谢。

正如你所说,你现在做的很好

你的选择是个糟糕的主意。我会告诉你原因:你会希望避免在游戏中频繁地将纹理加载到内存中并从内存中删除它们。从闪存加载纹理很慢。从内存中删除纹理也需要一点时间,而且如果您有足够的可用内存,那么这是毫无意义的

此外,如果您正在使用精灵表,并且正在移除一个障碍物,但同时尝试从内存中移除障碍物的纹理(即障碍物.pvr.ccz),则纹理缓存不会从内存中移除纹理。因为spritesheet还在使用它


最后:

我明白你的意思。有道理。所以我就坚持我已经拥有的?我只是想确保我使用的是最佳实践:)也因为OpenGL ES 2,我现在被迫使用不同的方法来不断滚动我的背景。我过去经常重复纹理,但现在在为opengles 2重写时,效果就不那么平滑了。所以现在我遇到了一个重复背景的方法:我只是想知道这是不是一个好方法。