Задать вопрос
@Jinxing

Когда выделяется память для переменных внутри функциях?

Я пишу сетевую игру, поэтому религиозно сражаюсь за легкость Update(), мне очень важно.

Берем класс Unit (MonoBehavior), а в нем функция Move(), по стечению несправедливых обстоятельств, она через одно рукопожатие в Update(). Движения бывают разные, и можно оформить это в Move(int) или Move(string), где параметр указывает на вперед-влево-поворот-прыжок-телепорт-КО. Писать это все семантически, Move("Forward") полезно для здоровья, но int имеет заметно меньше байтов - Move(1).
Вопрос в том, зависит ли скорость Update() от тяжести переменных, которые он вызывает, по сути, каждый кадр.
ИЛИ пространство для переменной внутри функции будет выделено 1 раз - при запуске или компиляции, неважно - и Update() с одинаковой скоростью записывает как int, так и string.
Коротко: у переменной внутри функции память выделяет 1 раз или каждый вызов функции?

Если не трудно, меня интересует еще пару мелких вопросов:
1. Насколько тяжелый if(?) (т.е. условие + проверка на null) в Update()? У меня есть вариант его избежать, создав 2 наследника класса вместо if.
  • Вопрос задан
  • 109 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
@SWA512
Gamedev
Одно ядро AMD Ryzen 5000 выполняет до 20 инструкций за такт, в том числе IF(JPM/JNC), если вы пишите игру для настольных систем, то такая оптимизация - это выкинутое на помойку ваше личное время, и время потраченное на другие аспекты игры (например тестирование, реиграбельность, начальная сложность и т.д.).
Если ваш Move не вызывается 10000 раз за кадр, то вам не стоит вообще на него обращать внимание.
Внимание стоит обратить на графы Profiler, там скорей всего есть более насущные пожиратели производительности устройства, которые могут превосходить ваш Move() в миллионы раз по кол-ву обращений и емкости памяти.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
В юнити неплохой профилировщик памяти - возьмите да посмотрите.
Но меня бы тут волновало не количество памяти, а то что внутри Move вы тогда сравниваете строки - а вот это уже дольше + сложность O(N). Сравнение интов - O(1).
А если вам хочется писать Move(Forward) - откройте для себя enum.

Я пишу сетевую игру, поэтому религиозно сражаюсь за легкость Update(), мне очень важно.

Нахер не надо. Напишите сначала СТАБИЛЬНУЮ СЕТЬ. А потом занимайтесь оптимизацией там, где это БУДЕТ НУЖНО.
Ответ написан
Комментировать
HemulGM
@HemulGM
Delphi Developer, сис. админ
Памяти на строку будет выделено больше, чем на число. Так что, да, число будет быстрее и экономнее
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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