Найти в Дзене

Почему строковые переменные в Update - не хорошо

Почему строковые переменные в 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. не забудь отписаться от события

#полезное