【问题标题】:Sprite Kit - Animations & memory managmentSpritekit - 动画和内存管理
【发布时间】:2013-11-11 16:36:53
【问题描述】:

我目前正在 iOS 上使用 Sprite Kit 来确定它是否适合制作相对简单的 2D 游戏。

由于我的 ActionScript 背景,我很乐意在代码方面使用 Sprite Kit

但有些事情我就是想不通。以纹理图集作为资源的动画节点非常耗费内存。我已经将地图集导入到我的项目中(纹理大小约为 35MB)。将纹理预加载到 RAM 中似乎没问题,但在我运行实际动画的那一刻,堆大小呈指数增长(从大约 80MB 到 780MB)

这是我的代码:

self.noahFrames = [[NSMutableArray alloc] init];
SKTextureAtlas *noahAtlas = [SKTextureAtlas atlasNamed:@"noahAnimati"];

int imgCount = noahAtlas.textureNames.count;
for (int i=1; i <= imgCount; i++) {
    NSString *textureName = [NSString stringWithFormat:@"NoahMainMenuAnimation_%d", i];
    SKTexture *temp = [noahAtlas textureNamed:textureName];
    [self.noahFrames addObject:temp];
}


SKSpriteNode *noahNode = [self createSpriteWithName:@"noah" imagePath:@"Noah_main_menu_hd" positionXPath:@"MainMenu.Noah.x" positionYPath:@"MainMenu.Noah.y" scalePath:@"MainMenu.Noah.scale"];
[self addChild:noahNode];

//up to this point everything goes fine

[noahNode runAction:[SKAction repeatActionForever:
                     [SKAction animateWithTextures:self.noahFrames
                                      timePerFrame:0.1f
                                            resize:YES
                                           restore:YES]] withKey:@"animatedNoah"];

所以我想我的实际问题是为什么应用程序在调用 SKAction 动画后会变得如此严重的内存?我一定遗漏了一些相当明显的东西......

【问题讨论】:

  • 那么当您单步越过 runAction 行时,内存使用量会增加吗?还是您可能在每一帧一遍又一遍地运行此操作,可能针对多个节点?
  • 没错。不,我不会一遍又一遍地调用这个动作。它只调用一次且用于一个节点。
  • 我在 iPad 2 上遇到了同样的问题。我今天在应用商店发布的基于 spritekit 的应用程序在显示带有 spritekit 视图的视图控制器时立即崩溃。这些 spritekit 视图没有动画,只有简单的单色 spritenodes(甚至没有任何图像,只是简单的单色节点)。我在同一页面上确实有 7 个 spritekit 视图,但 iPad 2 无法处理。
  • 另一种减少纹理内存的方法可以在这个答案stackoverflow.com/a/38679128/763355中找到

标签: ios memory-management sprite-kit


【解决方案1】:

我确实知道当纹理加载到图形内存中时,它是在没有任何压缩的情况下加载的,但我不认为 xcode 监视图形内存,所以这对我来说真的很奇怪。 我通常像你一样加载和执行动画,我没有这样的记忆行为,但我在模拟器上测试时注意到了它。您是否使用 iOS 模拟器进行测试?当您达到这些内存级别时,您的应用程序会崩溃吗?

【讨论】:

  • 这是一个很好的观点。达到这些内存级别后,应用程序不会崩溃。我目前没有 iOS 设备,但我会将它发送给我的朋友,这样他就可以在他的 iPad 上试用它,看看是什么。我会让你知道它是怎么回事。
  • 所以我尝试在设备 (iPad2) 上运行该应用程序。开始动画堆大小后的几帧达到 256MB(这是 iPad 2 上最多的系统......我猜)并崩溃。
  • 可能您的代码被多次调用(尝试使用 nslog 进行调试)或者错误出在程序的另一部分。
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多