Оптимизация 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, чтобы вернуть символы шрифта обратно, что, в свою очередь, должно дать вам лучший эффект прокрутки, так как вы не делаете это по одному символу за раз.