由于大量的动画和图片,我制作了一个SpriteKit游戏并面临很多内存管理问题
我知道SKSpriteNode
是要在屏幕上显示的对象,SKTexture
是图像的内存表示。
有多少SkSpriteNode可以共享一个SKTexture
来降低内存压力?
为了吸取教训压力,我制作了Singleton Class,它可以加载所有纹理和所有动画。
+ (GameTextureLoader *)sharedTextures{
static dispatch_once_t onceToken;
static id sharedInstance;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
...
SKSpriteNode *RedBird = [SKSpriteNode spriteNodeWithTexture:[self.loader.RedBird_LVL1 objectAtIndex:0]];
然后在游戏中使用它们,但我打开内存的每个屏幕都在增加 我认为在加载所有纹理和动画后它应该是不变的
btw我减少所有图像BitDepth并使用纹理输出格式RGBA4444_compressed
有什么建议吗?
这是我如何使用强指针加载NSMutableArray中的纹理
SKTextureAtlas *RedBirdAtlas = [SKTextureAtlas atlasNamed:@"RedBird-iPad"]; // don't put .atlas in there
[SKTextureAtlas preloadTextureAtlases:@[RedBirdAtlas] withCompletionHandler:^{
SKTexture *RedBird1 = [RedBirdAtlas textureNamed:@"RedBird_01_iPad.png"];
SKTexture *RedBird2 = [RedBirdAtlas textureNamed:@"RedBird_02_iPad.png"];
SKTexture *RedBird3 = [RedBirdAtlas textureNamed:@"RedBird_03_iPad.png"];
[self.RedBird_LVL1 addObject:RedBird1];
[self.RedBird_LVL1 addObject:RedBird2];
[self.RedBird_LVL1 addObject:RedBird3];
finishTextureCount++;
[self checkfinishLoading];
}];
我在Skcene中称它为:
SKSpriteNode *RedBird = [SKSpriteNode spriteNodeWithTexture:[self.loader.RedBird_LVL1 objectAtIndex:0]];
RedBird.position = RedBirdPoint;
RedBird.name = @"RedBird";
并在动画中使用它像这样:
SKAction* atlasAnimation = [SKAction animateWithTextures:[self.loader.RedBird_LVL1 objectAtIndex:0] timePerFrame:Cloud_Animation];
SKAction *resetTexture = [SKAction setTexture:[self.loader.RedBird_LVL1 objectAtIndex:2]];
_RedBirdAnimation = [SKAction sequence:@[atlasAnimation,resetTexture]];