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

    @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 и посмотрите на ситуацию в игре.
    Ответ написан
    Комментировать