2012-03-19 60 views
0

我正在创建一个包含大约15种不同动画的应用程序。一些动画是在按钮水龙头上播放的,有些是在某些事件上播放的。由于我是cocos2d的新手,我无法弄清楚如何初始化这些动画。我为每个动画分开精灵表。我所做的是创建一个便捷类,它具有一个CCSprite对象作为数据成员。在init函数中,我已经放置了所有的代码来创建动画。但是一旦调用init函数,我会得到内存警告。初始化精灵多个动画时的内存警告

我甚至试图初始化动画时,只发送播放动画的请求,但我仍然得到内存警告。此外,如果我这样做,动画不会播放,直到整个精灵表被加载。

请检查下面的代码以供参考

- (void)initEntryAnimation 
    { 
     [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"entry.plist"]; 
     CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"entry.png"]; 
     [self.sardarSprite addChild:spriteSheet]; 

     NSMutableArray *entryFrames = [NSMutableArray array]; 
     for(int i = 0; i < 77; i++) { 

      if([[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"enter in scene%04i.png", i+1]]) 
      [entryFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"enter in scene%04i.png", i+1]]]; 
     } 

     self.entryAnimation = [CCAnimation animationWithFrames:entryFrames delay:0.05f]; 
    } 

    - (void)playEntryAnimation 
    { 
     [CCSpriteFrameCache purgeSharedSpriteFrameCache]; 

     [self.sardarSprite runAction:[CCAnimate actionWithAnimation:self.entryAnimation restoreOriginalFrame:NO]]; 
    } 

我已经建立了类似的功能,为所有15个动画。我一个接一个地调用所有初始化函数。每当发送动画请求时都会调用播放函数。

我非常需要一些专家意见。任何帮助将不胜感激。

+0

动画的框架有多大? – 2012-03-19 11:58:21

+0

我用于创建精灵表的图像是320 * 480,这是否重要,因为我将它们放入精灵表中占据了所有透明区域。 – Hammad 2012-03-20 09:45:46

+0

将它们放在精灵表中只会减少磁盘上的存储空间,然后减少精灵的内存使用量。你的精灵表有多大,你有多少?除非320x480上只有非常小的图像和很多透明空间,否则您仍然会使用大量内存。 – 2012-03-20 10:03:34

回答

0

的问题是你的精灵表的大小。精灵表单文件大小(png的大小)可能非常小,但这是磁盘上的大小。一旦你的应用程序将其加载到内存中,它将被存储为未压缩的,因此每个精灵表格的大小为2048x2048x8。

您可以减少RGBA4444的颜色深度,例如可能有所帮助。有关更多详细信息,请参阅TexturePacker。还有其他工具可用(我不以任何方式隶属于TexturePacker)。

您拥有的其他选项是进一步减少颜色深度或使用其他可用格式之一。你也可以看看你的动画,看看是否有任何方法将它们分解成更多离散的组件。例如,如果你有一个男人在运行的动画,也许不是拥有全屏的帧,你可以有一个躯干帧,然后使用不同的腿动画和手臂动画。

不知道确切的动画,很难提供建议。

0

尝试增加NSAutoreleasePool这样

- (void)initEntryAnimation 
    { 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"entry.plist"]; 
     CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"entry.png"]; 
     [self.sardarSprite addChild:spriteSheet]; 

     NSMutableArray *entryFrames = [NSMutableArray array]; 
     for(int i = 0; i < 77; i++) { 

      if([[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"enter in scene%04i.png", i+1]]) 
      [entryFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"enter in scene%04i.png", i+1]]]; 
     } 

     self.entryAnimation = [CCAnimation animationWithFrames:entryFrames delay:0.05f]; 
     [pool release]; 
    } 
+0

谢谢克里什我会尝试这个,看看它是否工作 – Hammad 2012-03-20 09:46:22