Создание новых объектов в методе Update()
Я где-то читал, что я не должен создавать новый экземпляр объекта в методе Update() игрового движка, потому что это приведет к пробуждению сборщика мусора и снижению производительности, но иногда я вижу в некоторых учебниках, что они используют новое ключевое слово в методе unity Update ()! Это нормально? И Юнити как-нибудь справится с этим, или нет?
1 ответ:
Это сбивает с толку новых программистов на C#.
Ответ на этот вопрос зависит от типа данных, в котором используется ключевое словоЭто нормально?
new. Это в основном тип значения vs тип ссылки. Смотрите ссылку в конце этого ответа для получения дополнительной информации об этом.
- Если это
class, то не используйте ключевое словоnewна нем в ФункцияUpdate. Используйте объединение объектов, или вы будете создавать новый объект каждый раз. рамка. Да, это дорого стоит.- Если это
struct, Вы можете свободно использовать ключевое словоnewна нем в функцияUpdateбез.
Возможно, вы видели такой код в функции
Update:Vector3 vec = new Vector3(0, 0, 0);Это прекрасно, потому что единство
Vector3являетсяstructнеclass.
Другой пример-это функция
Update:GameObject obj = new GameObject("MyObject");Это плохо, потому что
Обратите внимание на обведенный красным цветом текст, вы можете использовать его, чтобы определить, является ли используемый APIGameObjectявляетсяclass. Вы создаете Объект каждый кадр. Сделайте это один раз в функцииStart, а затем повторно используйте ее. Вы также можете использовать объединение объектов.classилиstruct.Вот еще что нужно знать:
1.c# value type vs reference type
2.есть ли смысл в рециркуляции типов ценностей unity
3.в чем разница между структура и класс в .NET?
4.объединение объектов в единое целое
Обратите внимание, что этот ответ фокусируется на использовании ключевого словаnewв Unity, как указано в вашем вопросе. Есть еще другие вещи, которые могут выделять память даже без использования ключевого словаnew. Примеры включают использование ключевого словаparamв параметре функции, возврат массива в функции, использованиеyield return 0вместо того, чтобыyield return null.И unity каким-то образом справится с этим, или нет?
Единственный, кто может ответить на этот вопрос, - этоустройство, на котором вы запускаете этот код . Обычно вы получаете некоторые икоты на мобильных устройствах из-за запуска GC. Объединение объектов очень важно на мобильных устройствах.


Comments