Почему строковые переменные в Update - не хорошо
Есть страшный пример использования строк в Update, обновление количества жизней или ресурсов игрока. Начинающие разработчики часто используют Update для этой задачи, т.к. это самый очевидный вариант на старте. Это хороший пример, чтобы сразу разобрать несколько систем в Unity и программировании, на которые влияют строки, особенно в Update
Плохой пример:
void Update()
{
_textFieldCoins.text = player.CoinsAmount.ToString();
}
1. Самое стремное - перерисовка канваса. В Unity UI элементы (те, что UGUI) рисуются на канвасе, и любое изменение внутреннего элемента ведет к пересчету всего канваса. Что тяжелова-то, особенно если элементов много. Полная перерисовка канваса ведет к быстрой просадке FPS, особенно если значение меняется часто (например счетчик FPS).
2. В продолжение темы про “создание новых строк”. Это уже больше программистская тема - выделение памяти. Каждый кадр выделения памяти на коротенькие строки не страшен сам по себе в контексте количества памяти. Страшна фрагментация памяти. Когда свободные участки памяти дробятся и для выделения большого кусочка (например для загрузки спрайты) - нужно освободить память, которая уже не используется, но еще не очищена. Это очень трудоемкий процесс, так что ожидаются частые однокадровые просадки FPS. Как работает память и сборщик мусора с объяснением фрагментами рассказывал здесь и здесь в подробностях
Решение для многих известное - пользоваться событиями (Event) или реактивностью. И то и другое - разбирал на канале. Изменение значений в UI через события происходит только в момент изменения данных, не каждый кадр, что полностью убирает описанные выше проблемы.
void Start()
{
player.CoinsAmountChanged += OnCoinsAmountChanged;
}
void OnCoinsAmountChanged(int newAmount)
{
_textFieldCoins.text = newAmount.ToString();
}
P.S. не забудь отписаться от события
#полезное