Я использую Unity, и иногда я использую new
ключевое слово th Update
, как и new Vector3()
т.д ...
Интересно, это вызывает утечку памяти? Я имею в виду, что в каждом кадре создается новый Vector3. Если это способ работы, это означает, что в памяти созданы тысячи Векторов. Это правда или я не прав?
new Vector3
потому чтоVector3
этоstruct
. Если это класс, то это проблема. Прочитайте весь пост об использовании пула объектов.Ответы:
В C # есть два типа типов: грубо говоря, типы значений и ссылочные типы .
Вы используете
new
при создании обоих, но типы значений создаются в стеке (большую часть времени), и в куче создаются только ссылочные типы. После создания ссылочные типы сохраняются до тех пор, пока не появится сборщик мусора, определят, что они больше не нужны, и соберут их. Экземпляры в стеке эффективно уничтожаются, когда кадр стека исчезает (когда функция, в которой они были созданы, заканчивается).Vector3
это тип значения в Unity, поэтому почти все экземпляры, которые вы когда-либо создаете, будут храниться в стеке и, следовательно, будут дешевы как для создания, так и для уничтожения. Таким образом, вы вряд ли делаете что-то не так здесь. Это, конечно, не создает утечку памяти, и почти наверняка это не будет проблемой производительности (во всяком случае, вы захотите профилировать).Создание большого количества новых ссылочных типов в каждом кадре может быть проблематичным, поскольку это может побудить сборщик мусора работать чаще, вызывая заминки, поскольку он приостанавливает работу всех ваших потоков. Но типы значений, такие как,
Vector3
являются довольно безопасной ставкой.источник
int
Поле в ссылочного типа заканчивается в куче , так как ссылочные типы, хранятся в куче. Именно в сторону, +1