Используют ли игровые объекты, расположенные вне камеры, компьютерные / мобильные ресурсы в Unity?

11

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

Будут ли эти игровые объекты использовать компьютерные / мобильные ресурсы во время игры?

Где я могу найти подробную информацию об использовании, как эти?

Gissipi_453
источник

Ответы:

13

То, что вы хотите, это профилировщик памяти, который есть в Unity. Здесь: http://docs.unity3d.com/Manual/ProfilerMemory.html

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

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

Рувим Кримп
источник
5

Я думаю, вам также следует знать об отбраковке Frustrum или удалении скрытой поверхности: http://en.wikipedia.org/wiki/Hidden_surface_determination

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

Клаву апостол
источник
2
@ Gissipi_453, исследуя в том же духе, также исследуйте квад- и окт-деревья (пространственная сортировка данных)
Jon
3

Краткий ответ - да"; все, что готово для использования в вашей игре, занимает память.

Другая вещь, которую нужно учитывать, это стоимость вашей частоты кадров:

5 объектов с 5 отдельными текстурами, нарисованными отдельно, требуют промежуточных изменений состояния. Вы можете сэкономить память, выгружая неиспользуемые текстуры.

При загрузке всех отдельных текстур в одну текстуру атласа объем памяти становится фиксированным, и вы больше не можете выгружать отдельную текстуру. После создания вам нужно только один раз связать атлас, чтобы нарисовать все ваши объекты.

Другой пример - простой буфер вершин и индексов. Если многие из точек часто переключаются между видимыми и нет, то быстрее оставить «устаревшие» точки в буфере вершин и загрузить только новый индексный буфер.

Есть много других случаев, когда увеличение первоначальной стоимости памяти предпочтительнее многих изменений состояния.

Если вы поворачиваете камеру, вы точно не уничтожите эти объекты, если не знаете, что камера не повернет назад, чтобы проверить этот объект. "- Кату

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

Джон
источник
1

Многие ответы в основном касаются графического аспекта вашего вопроса.

Дело в том, что они будут занимать различные ресурсы, и насколько они дороги по сравнению с рисованием объекта, не зафиксировано. Это не так редко, как некоторые ответы подразумевают, что ваши компоненты выполняют более дорогие операции, чем рисование, но вы можете минимизировать, сколько ресурсов они используют. Также имейте в виду, что GameObject занимает небольшой объем памяти, как и его компоненты. Компоненты также могут выполнять действия, которые занимают значительную часть памяти.

Самый простой способ минимизировать влияние компонентов вне экрана - это система, основанная на обратных вызовах OnBecameVisible и OnBecameInvisible .

void OnBecameVisible()
{
    myComplexComponent.enabled = true;
}
void OnBecameInvisble()
{
    myComplexComponent.enabled = false;
}

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

Селали Адобор
источник
1

Требуется память, чтобы поддерживать ее в актуальном состоянии и обновлять ее положение и другие свойства.

Но он не использует компьютерные / мобильные графические ресурсы, так как он не виден.

Так что да, он потребляет ресурсы памяти, но не графические ресурсы, как это делает видимый игровой объект.

Йоханн В.
источник
Большое спасибо. Это очень прямой ответ, который я искал.
Gissipi_453
0

Все, что находится в программе, потребляет ресурсы; Ты же не думаешь, что программы работают на надежде и мечте?

Вопрос должен состоять в том, сколько ресурсов потребляет игровой объект, и для этого я думаю, что это довольно солидный ответ: http://answers.unity3d.com/questions/280455/how-much-memory-a-gameobject- consume.html

Короче говоря, они потребляют незначительные ресурсы самостоятельно. Но почему вы хотите, чтобы куча игровых объектов просто сидела в вашей игре и ничего не делала? В конце концов, то, что вы на самом деле заставляете эти игровые объекты «делать», это то, что будет вызывать какие-либо накладные расходы, и сколько ресурсов требуется, очень много в каждом конкретном случае.

вернуть истину
источник
Большое спасибо. Так должен ли я уничтожать объекты, которые исчезли из поля зрения камеры во время игры?
Gissipi_453
1
Я думаю, что этот ответ на самом деле не пытается ответить на ваш вопрос вообще и, следовательно, просто неправильно. Если вы поворачиваете камеру, вы определенно не уничтожите эти объекты, если не знаете, что камера не повернет назад, чтобы проверить этот объект. Существуют игровые миры и движение ИИ, огни влияют на окружающую среду, даже если вы их не видите.
Кату
@Katu, это тоже точка. Спасибо. Если объект вообще не нужен, я не должен его уничтожать.
Gissipi_453
@Katu Я ответил на вопрос: «Будут ли эти игровые объекты (объекты в моей сцене, которые не видны камере) потреблять ресурсы компьютера / мобильного устройства во время игры?» Ответ таков: «Да. Все, что есть в программе, потребляет ресурсы». И я продолжил объяснять влияние пустых игровых объектов на сцену и стоимость ресурсов.
верните истину
2
@ Gissipi_453 Чтобы ответить на ваш вопрос, это полностью зависит от того, что на самом деле делают игровые объекты на сцене, как часто они создаются / удаляются, и других соображений. Знание того, когда оптимизировать, - это навык сам по себе, но главное правило - не беспокоиться об этом, пока есть о чем беспокоиться. Накладные расходы на дополнительные игровые объекты почти ничего не значат, так что не волнуйтесь. В некоторых случаях, если вы часто добавляете / удаляете объекты, пул объектов может спасти жизнь, а в других случаях вы можете выполнять другие приемы. Все зависит от того, есть ли и в чем именно проблема.
вернуть истину