在SpriteKit中加载SKTexture以处理内存管理

时间:2014-04-02 13:10:47

标签: ios sprite-kit

由于大量的动画和图片,我制作了一个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]];

0 个答案:

没有答案