1

我正在使用以下代码将纹理加载到 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 的每个图像的三个版本的图集上使用上述代码会导致应用程序使用所有这些图像的内存。不仅仅是它需要的那些。

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

4

2 回答 2

2

设置单独的图集,每种屏幕都有一个图集。没有 SpriteKit API 用于“加载这个纹理,但只加载它的一部分”。

于 2014-08-08T15:19:15.883 回答
0

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

接下来,我看到您还有更多问题“无论如何,我该如何根据使用的设备类别访问地图集?我应该只检查 iPad 还是 iPhone,然后将 iPad 部分分解为您是否是 iPad 2?

我认为 Noah 试图指出,与其创建 1 个包含 3 个不同版本屏幕分辨率的所有图像的大图集,不如您的代码应该创建 3 个单独的图集(具有 3 个单独的名称):每个版本的屏幕之一解析度。

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

因此,如果您采用这种策略,您可以节省应用程序在运行时使用的大量 RAM。这是非常重要和有价值的。我看到许多应用程序在 iPad 上运行一段时间后崩溃,因为它们使用了太多的 RAM,尤其是在 iOS 9.0 和更高版本中。


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

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

于 2016-08-01T10:26:04.160 回答