Оптимизация SKLabelNode для снижения проблем с производительностью

Создание RPG с помощью SpriteKit позволило мне создать SKLabelNode для отображения всего игрового текста. Я испытываю проблемы с производительностью (падение FPS и отставание игры) каждый раз, когда мое многострочное текстовое поле начинает автоматически вводить введенный текст, который использует SKLabelNode. Я также вижу снижение производительности при "вызове" элементов пользовательского интерфейса, таких как панели статистики персонажей (с большим количеством SKLabelNode для уровней навыков, названий навыков и т. Д.).

Ветеранские разработчики говорят, что предварительная загрузка данных всегда помогает, поэтому я сделал следующее (что уменьшило удар по производительности, но не устранило его, а текстовое поле все еще отстает):

// Preloaded model label (private property that is initialized in the class init method).
_modelLabel = [[SKLabelNode alloc] initWithFontNamed:_fontName];
_modelLabel.fontColor = _fontColor;
_modelLabel.fontSize = _fontSize;
_modelLabel.text = @"T";

// Constantly created label.
SKLabelNode *rowText = [[SKLabelNode alloc] initWithFontNamed:self.modelLabel.fontName];
rowText.fontColor = self.modelLabel.fontColor;
rowText.fontSize = self.modelLabel.fontSize;
rowText.text = row;
...
[self addChild:rowText];

Я был бы признателен за дополнительные приемы оптимизации при использовании SKLabelNode. Вот советы, которые я собрал до сих пор:

  • Предварительная загрузка требуется только при использовании шрифта, который недоступен через iOS.

  • Чтобы заставить шрифт действительно загружаться, вам также нужно установить текст для предварительной загрузки.

2 ответа

Решение

Попробуйте предварительно загрузить SKLabelNode со всеми символами, которые вам нужны. Возможно, SpriteKit отображает только необходимые глифы в текстуре.

// Preloaded model label (private property that is initialized in the class init method).
_modelLabel = [[SKLabelNode alloc] initWithFontNamed:_fontName];
_modelLabel.fontColor = _fontColor;
_modelLabel.fontSize = _fontSize;
_modelLabel.text = @"ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz0123456789-+=_()";

А затем добавьте свою модель в сцену с минимальным альфа-каналом (но без нуля, потому что, если у узла есть 0 альфа, он не будет нарисован); Постарайтесь сохранить этот узел в сцене

_modelLabel.alpha = CGFLOAT_MIN;
[self addChild:_modelLabel];

Если не помогает:

  • Организуйте узлы, выравнивая их zPosition (ака z-index). Вы должны отключить ignoresSiblingOrder за контроль над zPosition, Сделай все SKLabelNode быть нарисованным на одном уровне z.
  • Переключиться на растровые шрифты. Написание собственного рендерера растровых шрифтов очень просто. Единственное, что вы должны помнить - сделать так, чтобы все глифы были только в текстурном атласе, чтобы вы могли рисовать текст одним вызовом рисования.
  • Используйте родные ярлыки. Я не уверен, насколько это помогает. Если у вас сильные падения FPS (~5..10FPS), это может вам помочь

Мне кажется, вы создаете новые ярлыки каждый раз, когда вам нужен текст. Если бы я был, вы только создали ярлык один раз и просто изменили текст, когда это необходимо, а также просто скрыли строки, которые вы не используете.

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

Другие вопросы по тегам