【问题标题】:Why is SpriteKit loading all device sizes (~ipad and @2x~ipad) textures into memory?为什么 SpriteKit 将所有设备尺寸(~ipad 和@2x~ipad)纹理加载到内存中?
【发布时间】:2014-08-08 15:14:02
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    设置单独的图集,为每种类型的屏幕设置一个图集。没有 SpriteKit API 用于“加载此纹理,但只加载其中的一部分”。

    【讨论】:

    • 谢谢。我知道图集被转换为以@2x 结尾的精灵表,这就是为什么我认为它会加载正确的图像,但我仍然不明白为什么当它被分割成不同的精灵时它可以看到图集中的所有图像已经在幕后工作了。
    • 无论如何,我该如何根据使用的设备类别访问地图集?我应该只检查 iPad 或 iPhone,然后将 iPad 部分分解为您是 iPad 2 吗?
    【解决方案2】:

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

    接下来,我看到您还有更多问题“无论如何,我该如何根据所用设备的类别访问地图集?我应该只是检查 iPad 或 iPhone,然后再破解进入 iPad 部分,您是 iPad 2 吗?"

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

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

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


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

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

    【讨论】:

    • 最后,我们实际上不得不放弃使用我们想在 iPad 2 上使用的动画。纹理太大,动画最终滞后。当设备是 iPad 2 时,我们选择了更小更简单的动画。
    • 另外考虑到 App Thinning,这也不再像以前那样成为问题了。至少在理论上。我也不再从事游戏工作,所以我不能肯定。我会专注于 iOS 10,如果我要在今年晚些时候发布任何新内容,我会尽快放弃 iPad 2。
    • 感谢您在 iPad2 上进行测试的建议。我正在我的真实设备 iPad 3 上开发和测试我的游戏,它运行良好。但是,我没有真正的 iPad1 和 iPad2 设备来测试我的游戏,我担心我可能会遇到“动画滞后”的问题。那么,我有没有办法告诉 Apple 我只想为第三代和新一代 iPad 发布我的游戏?还是 Apple 是否强制开发者确保游戏必须适用于所有类型的 iPad(包括 iPad1 和 iPad2)才能发布游戏?谢谢。
    • 更新:我刚刚理解了你之前对我的建议的意思。有人告诉我,iOS 10 即将发布,iPad 2 可能无法运行 iOS 10。所以,如果我将游戏的发布要求设置为只支持 iOS 10 和更新版本,那么我也许可以跳过对 iPad 1 和 iPad 2 的支持。谢谢。
    • Apple 已宣布 iOS 10 将不支持 iPad 2,但它也将不支持 iPad 3,因为该设备严重不足,并且仅在市场上出现了几个月的时间。被 iPad 4 取代。如果您唯一的设备是 iPad 3,那么这对您的开发来说可能是个问题。不幸的是,没有其他方法可以排除 iPad 2 设备。如果您仅支持 iOS 6 及更高版本的设备,那么 iPad 1 将无法运行您的应用程序。我会去的最低的是iOS 8.1。如果您使用的是 SpriteKit,则 8.1 中的一些错误修复值得不使用 8.0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2012-10-13
    • 2012-04-12
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多