Обновить
Комментарии 7
О! Я как раз писал для Unity ассет, который (по-умному) отключает объекты за пределами области видимости. По опыту — совет дельный, производительность подскакивает довольно круто — однако, существуют проблемы с увязкой логики и с интеграцией Occlusion Culling. Другое дело, что реализовывать это лучше централизованным менеджером, так достигается экономия и на числе вызовов update.
Скрин из профайлера на тестовой сцене
image
А какие именно объекты отключаете? Ведь меши и так не отрисовываются, если они не попадают в кадр (или скрыты другими, более громоздкими объектами при настроенном Occlusion Culling). Вроде бы только Animator разумно отключать вне поля видимости, но ведь там и так есть способы, при которых Animator не будет жрать ресурсов за пределами кадра.

В первую очередь, я отключаю объекты со сложными и/или ресурсоёмкими скриптами — это, в основном, персонажи и противники, особо мудрёные интерактивные объекты уровня, даже интерактивные двери и тому подобное. Пробую отключать объекты со сложной постоянно обсчитываемой физикой, но пока однозначного ответа, стоит ли это делать, не могу дать. Отключать сложные для рендера объекты реального смысла нет — с этим хорошо справляются встроенные механизмы движка, отсечение невидимых граней и OC — с ними не попадающее в кадр просто не рендерится.
Но не всё так просто — например, если враг зашёл за спину героя, то он должен напроситься на него сзади, а не остановиться, пропав из поля зрения камеры. С этим пришлось потрудиться, но решение нашлось :)

Понятно, спасибо. Просто я так понимаю сие дело позиционируется как ассет, значит должно быть гибким. Допустим движение противников у всех может быть реализовано разными способами, каким образом ассет определит, что отключать следует, а что нет, а что стоит отключить наполовину. Ну да ладно :)
Можно отключить объект целиком. Тогда не идёт его отрисовка, не осуществляется обновление для скриптов поведения, не рассчитывается физика, и так далее. Идея с отключение отдельных компонентов — хорошая, но с ней очень просто запутаться при настройке (хотя я и думал о таком функционале). Потому я сделал ассет так, чтобы объект деактивировать целиком. Условия деактивации задаёт левел-дизайнер: например, монстры могут деактивироваться чтобы при достаточном удалении игрока от комнаты, где они спавнятся, а разрушаемые предметы — при выходе их из зоны видимости игрока. Соответственно, активируется они при приближении игрока и возвращении в зону видимости соответственно. Это просто и довольно надёжно.
P.S. Если есть интерес, напишите в личку — могу сбросить посмотреть сам ассет :)
Я просто что-то подобное для Animator-а делал в одном из проектов. Так же отключал при выходе из кадра, получался хороший прирост. В текущем проекте нет необходимости в этом.
Можно также коллизии просчитывать не каждый кадр.
Если объектов крайне много, то можно проверять на коллизию только тех, кто в той же области, что и игрок, а не всех существующих.
А вообще вот рендеринг видимого в Horizon:
image
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.