Управление памятью Unity: спрайты в загруженных объектах сценариев --- Как память использует масштабирование? - PullRequest
0 голосов
/ 03 марта 2019

Я использовал объекты сценариев в качестве слоя модели (данных) для моей игры.Я храню такие вещи, как статистика юнитов.Я также начал помещать в него спрайты для модуля.

Мой вопрос: если я загружаю объект сценариев, имеющий ссылку на спрайт, автоматически ли загружается спрайт?Если я загружаю 1000 объектов сценариев со ссылками на спрайты, но я не использую эти спрайты (например, ни один GameObject не использует этот спрайт для рендеринга), есть ли еще потери памяти для этих ссылок на спрайты?Или использование памяти происходит только после того, как GameObject начинает использовать спрайт для фактического рендеринга?Если это так, если у меня есть несколько объектов сценариев со ссылками на один и тот же спрайт, это тоже увеличивает память?

Я попытался выполнить некоторую проверку памяти с помощью инспектора, но получал спорадические результаты, и объем памяти былслишком много менялось между прогонами, поэтому я не мог понять, что происходит (без изменения чего-либо, я бы использовал 2,2 ГБ, затем 3,1 ГБ, затем 2,6 ГБ).

1 Ответ

0 голосов
/ 05 марта 2019

Как сказал Дейв в своем комментарии, Sprite является ссылочным типом, поэтому Unity загружает спрайт в память один раз, а затем все другие экземпляры объектов, которые ссылаются на конкретную точку Sprite, на ее адрес памяти (как система указателей C).должно сработать).Так что в вашем случае, даже если вы создадите 1000 объектов из вашего объекта Scriptable, все они будут указывать на один и тот же спрайт.

Как правило, если вы используете Resources.Load() для объекта, то каждый загруженный объектбудет использовать ту же ссылку на переменную, что и родительский объект Scriptable.Но если вы создаете новый объект каждый раз, когда вы хотите создать его, скажем, с помощью конструктора класса, то каждый объект (и впоследствии их переменные) будет иметь свое собственное пространство в памяти.В вашем случае это произошло бы, если бы вы использовали Sprite mySprite = new Sprite() каждый раз, когда создавали объект Scriptable.

Таким образом, штраф за память не добавляется за добавление нескольких экземпляров одного и того же Sprite.в ваших объектах Scriptable (использование CPU / GPU - другая проблема, не связанная с вашим вопросом, но, тем не менее, заслуживающая упоминания).Проверка вашей памяти может иметь изменяющиеся значения, если вы выполняете ее в своей игре вместе со всеми другими выполняемыми операциями, поэтому я предлагаю вам создать новый проект и затем попытаться измерить значения из инспектора.Если вы сделаете это, пожалуйста, поделитесь своими выводами здесь, так как это интересная тема.

Кроме того, проверьте этот пост из обмена стека GameDev для получения дополнительной информации по вашему вопросу.

...