我在场景退出后删除我的精灵表时遇到了一些问题..
我基本上通过删除init
中未使用的纹理来遵循Ray的说明[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];
[[CCDirector sharedDirector] purgeCachedData];
在dealloc我有
CCTexture2D * texture = spriteNode.textureAtlas.texture;
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromTexture:texture];
[[CCTextureCache sharedTextureCache] removeTexture:texture];
如果转换到场景不是当前场景,则此方法可以正常工作。 但当我试图“重新启动”当前场景时,它会崩溃。
[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:2.0 scene:[currentScene scene] withColor:ccBLACK]];
似乎问题是当用“新”当前场景替换当前场景时,在当前场景被释放之前调用“新”当前场景init。因此,我的“新”当前场景spritesheet在创建后立即被解除分配。
在这种情况下,如何正确删除spritesheets? 或者我重启当前场景的方法不正确?
更新: 我试图按照建议添加加载场景,但无法使其工作..这是我的加载场景
+(CCScene *) scene
{
// 'scene' is an autorelease object.
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
LoadingLayer * layer = [[[LoadingLayer alloc]init]autorelease];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}
-(id) init{
if(self = [super init]){
winSize = [CCDirector sharedDirector].winSize;
CCLabelTTF * loadingLabel = [CCLabelTTF labelWithString:@"Loading..." fontName:@"Marker Felt" fontSize:30];
}
loadingLabel.position = ccp(winSize.width/2, winSize.height/2);
[loadingLayer addChild:loadingLabel];
[self scheduleUpdate];
}
return self;
}
-(void) update:(ccTime)dt{
[self unscheduleUpdate];
NSString * bgPlist = @"backgroundsIPAD.plist";;
NSString * hudPlist = @"hudSpritesIPAD.plist"
NSString * gameOnePlist = @"gameOneSpritesIPAD.plist";
// load background
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:bgPlist];
// load hud
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:hudPlist];
// load sprites
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:gameOnePlist];
[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:2.0 scene:[GameTwoLayer scene] withColor:ccBLACK]];
}
在这种情况下,这会给我一个GameTwoLayer,然后是黑屏...... 我做错了什么?
答案 0 :(得分:0)
确实,新场景的init在您的当前场景被释放之前运行。这是有道理的,因为您在当前场景对象中创建了一个新的场景对象。
出于这个原因,你不应该在init期间删除纹理等。它不是正确的地方。使用资源的场景应该负责删除这些资源。删除纹理等应该在场景的dealloc方法中完成。
如果你需要同时避免内存中两个场景的内存峰值,你必须添加一个中间的" loading"场景,以便在下一个场景开始之前释放前一个场景。