Неправильно ли создавать новые объекты в Update ()?

8

Я использую Unity, и иногда я использую newключевое слово th Update, как и new Vector3()т.д ...

Интересно, это вызывает утечку памяти? Я имею в виду, что в каждом кадре создается новый Vector3. Если это способ работы, это означает, что в памяти созданы тысячи Векторов. Это правда или я не прав?

user98816
источник
2
Это звучит как вопрос от типичного пользователя C ++, который не знаком с тонкостями C #, будет ли это адекватным предположением?
Pharap
Я ответил на аналогичный вопрос здесь . Это хорошо, new Vector3потому что Vector3это struct. Если это класс, то это проблема. Прочитайте весь пост об использовании пула объектов.
Программист

Ответы:

15

В C # есть два типа типов: грубо говоря, типы значений и ссылочные типы .

Вы используете newпри создании обоих, но типы значений создаются в стеке (большую часть времени), и в куче создаются только ссылочные типы. После создания ссылочные типы сохраняются до тех пор, пока не появится сборщик мусора, определят, что они больше не нужны, и соберут их. Экземпляры в стеке эффективно уничтожаются, когда кадр стека исчезает (когда функция, в которой они были созданы, заканчивается).

Vector3это тип значения в Unity, поэтому почти все экземпляры, которые вы когда-либо создаете, будут храниться в стеке и, следовательно, будут дешевы как для создания, так и для уничтожения. Таким образом, вы вряд ли делаете что-то не так здесь. Это, конечно, не создает утечку памяти, и почти наверняка это не будет проблемой производительности (во всяком случае, вы захотите профилировать).

Создание большого количества новых ссылочных типов в каждом кадре может быть проблематичным, поскольку это может побудить сборщик мусора работать чаще, вызывая заминки, поскольку он приостанавливает работу всех ваших потоков. Но типы значений, такие как, Vector3являются довольно безопасной ставкой.


источник
1
Я думаю, вы должны подчеркнуть, что «типы значений создаются в стеке (большую часть времени)» верно только для локальных переменных . Я знаю, что это немного педантично, но то, как оно в настоящее время сформулировано, может ввести в заблуждение новичков. intПоле в ссылочного типа заканчивается в куче , так как ссылочные типы, хранятся в куче. Именно в сторону, +1
Doval
1
@Довал бы гораздо более точным утверждением, что «типы значений помещаются в ранее выделенное пространство, как в стеке или внутри выделенного пространства ссылочного типа».
урод