@i__egor

Как в юнити оптимально отображать часто меняющийся текст?

Вот есть в канвасе Text или TexhMeshProUGUI, каждый кадр текст нужно менять. Раньше не встречал такую проблему, но почему сейчас так сделать нельзя. Фпс запущенной в редакторе игры просаживается с 500 до 20 с фризами только из-за этого. Профайлере other -> EditorLoop занимает все время ~90%, еще и пики, из за чего игра фризит. В чем дело? этот текст на отдельном канвасе 6417e9183d5ef256289050.png
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Проблема 100% в коде, которого нет, поэтому я вдамся в гипотезы. Начну с самого хардкорного и закончу тем, что по лайтовее.

1. Авторазмер
Возможно, у вас есть скрипт, который при каждом изменении текста пытается отмасштабировать не шрифт, а границы самой компоненты. Проблема в том, что при любом изменении элементов интерфейса юнити перерисовывает вообще весь затронутый канвас. Речь не о свойствах типа цвет, а о перемещении и изменении границ.
Если у вас такая проблема, то стоит оставить текст в покое и изначально сделать задел по размеру текста на будущее.
Сюда же можно отнести перерисовку других элементов для ScrollView или использование UI Layouts.

2. GetComponent
Возможно, вы используете GetComponent. И делаете это довольно часто. Что-то типа такого:
public void SetupText(string textToDisplay) {
	GetComponent<TextMeshPro>().text = textToDisplay;
}

Парни с ютуба часто советуют такой треш. Под капотом этот метод довольно тяжёлый и будет тем тяжелее, чем больше компонент на объекте и чем больше раз за единицу времени вызывается.
Если это ваша проблема, то рекомендую заранее кешировать. Например, сделать это на старте:
private void Start() {
	someTextComponent = GetComponent<TextMeshPro>();
}

А ещё лучше просто создать видимое инспектором поле и руками туда передать ссылку.
[SerializeField] TextMeshPro someTextComponent;

3. Частота вызова
Ещё один треш, которому учат в интернете - менять что-то или проверять не тогда, когда это нужно, а просто в том же Update. Проблема здесь кроется в множестве "холостых" вызовов.
Если у вас обновление текста происходит всегда, а не только при необходимости, то стоит подумать лучше над архитектурой.

4. Размер текста
Особенность компонент пакета TMPro ещё в том, что метод SetText или аксессор .text не только просто берёт и вставляет, а ещё проводит довольно большую работу под капотом. Если у вас большой текст, вы реально увидите просадку даже на компе, не говоря уже о мобилках. Такая проблема очень актуальна. Например, если вы скриптом или твинами делаете постепенно появляющийся большой объём текста для диалога в игре.
Решением в данном случае будет либо анимация, либо написание своей реализации нужной компоненты.

Если среди проблем вашей нет, приложите код. Желательно весь, но в контексте задачи интересна цепочка вызовов от события к присвоению текста.

PS. на будущее, FPS проекта в редакторе и FPS игры в билде не одно и то же. Сделайте простой счётчик FPS и посмотрите на ситуацию в игре.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы