У меня есть игра с 4 текстурными атласами. Каждый атлас 4096 x 4096 и содержит примерно 300 спрайтов, все ~ 15kb - 50kb. Unoptimised в Texture Packer, они составляют около 2 - 4 МБ каждый, а около половины - при оптимизации.Как оптимизировать рисование из больших файлов SKTextureAtlas с предварительной загрузкой?
Они содержат активы для рисования символов, но я нахожу, что очень медленно нарисовать один символ (около 24 узлов) ~ 0,5 секунды. Это связано с многочисленными вызовами на [atlas textureNamed:textureName]
Чтобы ускорить процесс, я хочу предварительно загрузить атласы. В идеале я бы сохранил их в памяти, поскольку я всегда нуждаюсь в них. Итак, мой первый вопрос: возможно ли это с атласами такого размера? Я попытался позвонить [SKTextureAtlas preloadTextureAtlases:@[MaleFeatureAtlas] withCompletionHandler...]
, но я получаю сбой без трассировки стека, просто потерянное соединение с устройством.
В настоящее время у меня есть класс AtlasManager, который имеет статические переменные, которые Initialise друг текстурных атласе:
static SKTextureAtlas *MaleFeatureAtlas;
static SKTextureAtlas *MaleItemAtlas;
static SKTextureAtlas *FemaleFeatureAtlas;
static SKTextureAtlas *FemaleItemAtlas;
@implementation AtlasManager
{
}
#pragma mark - Initialisation Methods
+ (void)initialize
{
MaleFeatureAtlas = [SKTextureAtlas atlasNamed:MaleFeatures];
MaleItemAtlas = [SKTextureAtlas atlasNamed:MaleItems];
FemaleFeatureAtlas = [SKTextureAtlas atlasNamed:FemaleFeatures];
FemaleItemAtlas = [SKTextureAtlas atlasNamed:FemaleItems];
}
Каждый персонаж спрайт имеет экземпляр AtlasManager, но так как SKTextureAtlases статические переменные, я понял, они будут быстро рисовать. Но постоянные звонки на [atlas textureNamed:textureName]
действительно замедляют вытягивание. Я сохраняю NSDictionary узлов после рисования, поэтому перерисовка выполняется очень быстро, но исходная ничья занимает слишком много времени. Рендеринг 8 символов, всего более 100 узлов, занимает около 5 секунд.
Таким образом, это подход с одноэлементным режимом лучше, чем использование статических переменных? И разумно ли предварительно загружать атласы такого размера?
Спасибо за подробный ответ. Моя проблема заключается в том, что мои атласы содержат все спрайты, необходимые для создания пользовательских аватаров, и есть потенциально миллионы комбинаций, поэтому в любой момент мне, вероятно, понадобятся все атласы (особенно, если у меня есть более двух символов на экране). С их размером в уме, насколько вы знаете, это должно быть что-то, что можно предварительно загрузить? Или он будет потреблять слишком много памяти? – Smikey
@Smikey - Если у вас есть большое количество возможных комбинаций, значит ли это, что у вас есть текстура для каждой возможной комбинации или у вас есть какой-то другой механизм, который вы используете для этого? – sangony