为什么SpriteKit会将所有设备大小(~ipad和@ 2x~ipad)纹理加载到内存中?

时间:2014-08-08 15:14:02

标签: ios memory sprite-kit texture-atlas sktextureatlas

我将纹理加载到SpriteKit中,以便使用以下代码在动画中使用 -

NSMutableArray *animFrames = [NSMutableArray array];
SKTextureAtlas *animTextureAtlas = [SKTextureAtlas atlasNamed: @"bearAnimation"];

for (int i = 1; i < animTextureAtlas.textureNames.count / 3; i++) {
    NSString *texture = [NSString stringWithFormat:@"image%04d", i];
    [animFrames addObject:[animTextureAtlas textureNamed:texture]];
}

// This is a strong property of an NSArray where I store frames of animation
self.bearAnimationFrames = animFrames;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    [SKTexture preloadTextures:self.bearAnimationFrames withCompletionHandler:^{}];
});

我的问题是,在包含视网膜iPad的每个图像的三个版本的图集上使用上述代码,非视网膜iPad和视网膜iPhone导致应用程序使用所有这些的内存。不只是它需要的那些。

我怎样才能使加载到内存中的唯一纹理是应用程序运行的设备需要的?

2 个答案:

答案 0 :(得分:2)

设置单独的地图集,每种类型的屏幕一个。没有SpriteKit API可以“加载这个纹理,但只加载它的一些部分”。

答案 1 :(得分:0)

首先,我读了Noah Witherspoon的回答“ 设置单独的地图集,每种类型的屏幕都有一个。

接下来,我看到你还有更多的问题“ 无论如何我如何根据使用的设备类别访问地图集?我应该只是检查iPad或iPhone然后打破从iPad部分开始,你是iPad 2吗?

我认为诺亚试图指出,不是创建包含3种不同版本屏幕分辨率的所有图像的大型地图集,而是代码应该创建3个单独的地图集(具有3个不同的名称):每个版本中的一个屏幕分辨率。

如果你采用他的方法,那么在你的代码中,在初始化阶段或你的应用程序中,也许,你可以检查设备(或 屏幕分辨率 ),然后您的代码可以首先为该特定屏幕分辨率创建一个适当的图集,然后您可以将该图集加载到RAM中。这样,您的应用程序仅为1个特定设备创建并加载1组图像到RAM上,而不是将所有3组图像加载到RAM上。

因此,如果您采用此策略,则可以保存应用在运行时使用的大量RAM。这非常重要且有价值。我在iPad上运行一段时间后看到许多应用程序崩溃,因为它们使用了太多内存,特别是在iOS 9.0及更新版本中。

如果您有更好的解决方案,请与我们分享。

我是一名新游戏开发者,我仍在努力学习很多新技术来改进我的游戏。所以,我非常感谢这个论坛上的新技巧或课程......