Почему SpriteKit загружает в память текстуры устройств всех размеров (~ipad и @2x~ipad)?

Я загружаю текстуры в 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 с сетчаткой, приводит к тому, что приложение использует память для всех из них. Не только те, которые ему нужны.

Как я могу сделать так, чтобы в память загружались только те текстуры, которые нужны устройству, на котором работает приложение?


person Mark Reid    schedule 08.08.2014    source источник


Ответы (2)


Во-первых, я прочитал ответ Ноа Уизерспуна "Создайте отдельные атласы, по одному для каждого типа экрана".

Далее я вижу, что у вас все еще остались вопросы "В любом случае, как мне получить доступ к атласу на основе категории используемого устройства? Должен ли я просто проверить iPad или iPhone, а затем разобрать iPad в разделе у вас iPad 2?"

Я думаю, что Ной пытался указать, что вместо создания 1 большого атласа, содержащего все изображения для 3 разных версий разрешения экрана, ваш код, вероятно, должен создать 3 отдельных атласа (с 3 отдельными именами): по одному для каждой версии экрана. разрешающая способность.

Если вы придерживаетесь его подхода, то в своем коде на этапе инициализации вашего приложения, возможно, вы могли бы проверить устройство (или разрешение экрана), и тогда ваш код может сначала создать только 1 правильный атлас для этого конкретного разрешения экрана, а после этого ваш код может загрузить этот атлас в ОЗУ. Таким образом, ваше приложение создает и загружает в ОЗУ только 1 набор изображений для 1 конкретного устройства, а не загружает в ОЗУ все 3 набора изображений.

Итак, если вы выберете эту стратегию, вы сможете сэкономить большой объем оперативной памяти, которую ваше приложение использует во время выполнения. Это очень важно и ценно. Я видел, как многие приложения аварийно завершают работу после некоторого времени работы на iPad, потому что они используют слишком много оперативной памяти, особенно в iOS 9.0 и новее.


Если у вас есть лучшее решение, поделитесь с нами.

Я начинающий разработчик игр и все еще пытаюсь освоить множество новых приемов, чтобы улучшить свою игру. Итак, я был бы очень признателен за новые советы или уроки на этом форуме...

person Job_September_2020    schedule 01.08.2016
comment
В конце концов нам пришлось отказаться от использования анимации, которую мы хотели использовать на iPad 2. Текстуры были слишком большими, а анимация в конечном счете тормозила. Вместо этого мы выбрали более простую анимацию меньшего размера, когда устройством был iPad 2. - person Mark Reid; 01.08.2016
comment
Кроме того, учитывая истончение приложений, это также не так важно, как раньше. По крайней мере, в теории. Я также больше не работаю над играми, поэтому не могу сказать наверняка. Я бы сосредоточился на iOS 10 и более поздних версиях, просто исключив iPad 2 как можно скорее, если бы я создавал что-то новое для выпуска в конце этого года. - person Mark Reid; 01.08.2016
comment
Спасибо за совет по тестированию на iPad2. Я разрабатываю и тестирую свою игру на своем реальном устройстве iPad 3, и она работает хорошо. Но у меня нет реального устройства для iPad1 и iPad2, чтобы протестировать игру, и я боюсь, что могу столкнуться с проблемой задержки анимации. Итак, есть ли способ сообщить Apple, что я хочу выпустить свою игру только для iPad третьего и более нового поколения? Или Apple заставляет разработчиков убедиться, что игры должны работать на всех типах iPad (включая iPad1 и iPad2), прежде чем они смогут выпустить игру? Спасибо. - person Job_September_2020; 02.08.2016
comment
Обновлено: я только что понял, что вы имели в виду в своем предыдущем предложении для меня. Некоторые люди говорят мне, что скоро будет выпущена iOS 10, и, вероятно, iPad 2 не сможет работать с iOS 10. Итак, если я установлю требования к выпуску для своей игры так, чтобы она поддерживала только iOS 10 и более новые версии, тогда Возможно, я смогу пропустить поддержку iPad 1 и iPad 2. Спасибо. - person Job_September_2020; 02.08.2016
comment
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. - person Mark Reid; 05.08.2016
comment
К счастью, я только что узнал, что мой iPad на самом деле iPad 4. :-) Итак, я могу исключить iPad 3 и более старые модели, установив для iOS значение iOS 10 при отправке игры в App Store. Большое тебе спасибо. - person Job_September_2020; 05.08.2016

Настройте отдельные атласы, по одному для каждого типа экрана. Нет API SpriteKit для «загрузки этой текстуры, но только некоторых ее фрагментов».

person Noah Witherspoon    schedule 08.08.2014
comment
Спасибо. Я знаю, что атлас преобразуется в листы спрайтов, оканчивающиеся на @2x и тому подобное, поэтому я полагаю, что он загружает правильные изображения, но я все еще не понимаю, почему он может видеть все это в атласе, когда он разделен на разные спрайты. листы за кадром уже. - person Mark Reid; 11.08.2014
comment
В любом случае, как мне получить доступ к атласу на основе категории используемого устройства? Должен ли я просто проверить iPad или iPhone, а затем разбить раздел iPad на iPad 2? - person Mark Reid; 11.08.2014