Я делаю игру, и я заметил, что во время некоторых сцен мой FPS продолжал падать вокруг области 55-60FPS (используя текстурный атлас). Это заставило меня замочить, поэтому я решил поместить все свои активы в папку Images.xcassets и voila, установив 60FPS.
Я думал, что это была случайность или что я делал что-то неправильно, поэтому я решил начать новый проект и выполнить некоторые тесты...
В документации Apple говорится, что использование текстурного атласа улучшит производительность приложения. В принципе, это позволяет вашему приложению использовать пакетный рендеринг. Однако...
Тест (https://github.com/JRam13/JSGlitch):
- (void)runTest
{
SKAction *spawn = [SKAction runBlock:^{
for (int i=0; i<10; i++) {
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
sprite.xScale = 0.5;
sprite.yScale = 0.5;
sprite.position = CGPointMake(0, [self randomNumberBetweenMin:0 andMax:768]);
SKAction *action = [SKAction rotateByAngle:M_PI duration:1];
[sprite runAction:[SKAction repeatActionForever:action]];
SKAction *move = [SKAction moveByX:1200 y:0 duration:2];
[sprite runAction:move];
//notice I don't remove from parent (see test2 below)
[self addChild:sprite];
}
}];
SKAction *wait = [SKAction waitForDuration:.1];
SKAction *sequence = [SKAction sequence:@[spawn,wait]];
SKAction *repeat = [SKAction repeatActionForever:sequence];
[self runAction:repeat];
}
Результаты:
Тесты неоднократно показывают, что использование xcassets выполняется лучше, чем контраст атласа в FPS. Кажется, что атлас управляет памятью немного лучше, чем xcassets.
Кто-нибудь знает, почему эти результаты показывают, что изображения .xcassets имеют лучшую производительность, чем атлас?
Некоторые гипотезы, которые я придумал:
- xcassets лучше оптимизирован, чем атласы.
- atlasas хороши при рисовании большого количества изображений в одном проходе ничьей, но имеют большие накладные расходы с повторяющимися спрайтами. Если это правда, это означает, что если ваш спрайт появляется несколько раз на экране (что было в моей оригинальной игре), лучше удалить его из атласа.
-
атласные листы должны быть заполнены для оптимизации производительности
Обновление
Для этого следующего теста я пошел вперед и удалил спрайт из родителя после его выхода на экран. Я также использовал 7 разных изображений. Мы должны увидеть огромный прирост производительности, используя атлас из-за подсчета ничьей, но...