Лучшие практики Unity для выгрузки неиспользуемых областей карты - PullRequest
0 голосов
/ 12 января 2020

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

Я только начал рассматривать эту проблему, как и я В настоящее время внедряю систему обнаружения теней с помощью Raycasts.

Моя проблема заключается в следующем:

  • У меня может быть около 100 источников света на моем уровне, которые в каждом кадре посылают Raycast соседним персонажам, чтобы определить, находятся ли эти символы в тени.

Моя игра - игра с низким поли P C, и я понимаю, что накладные расходы от Raycasting не так уж велики c. Так что это не главная проблема. Но я все еще не уверен в лучшем подходе к оптимизации этого.

Я думал о нескольких решениях, но не уверен, существует ли «стандарт», скажем.

1. выйдите из обновления l oop, если игрок слишком далеко

void Update() {
   if (Vector3.Distance(playerPos, transform.position) > someRadius) {
       return
   }
}

Это наиболее очевидное решение с еще более очевидными проблемами.

  1. Это обновление l oop будет продолжать загружать циклы процессора, выполняя 2 вычисления для каждого кадра, для каждой светлой точки.

2. Disable Light gameObjects, когда игрок находится слишком далеко

Этот метод более эффективен с точки зрения загрузки ЦП, так как он будет отменен. Однако я все еще занимаюсь ненужной памятью.

Чтобы сделать это решение более масштабируемым, мне нужно было бы разработать какой-то «активатор», который отслеживает игровые объекты, которые должны быть включены / отключены в зависимости от игрока. должность.

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

Есть ли альтернатива включению / отключению?

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

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

Вопрос

Является ли Unity оппонентом по этому поводу?

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

Может быть, мне не нужно беспокоиться так сильно, как я думаю

Спасибо!

1 Ответ

1 голос
/ 13 января 2020

Если вы не хотите отображать объекты, которые не находятся в области вашей камеры, Отбор окклюзии - это то, что вам именно нужно. Смотрите эту ссылку:

https://docs.unity3d.com/Manual/OcclusionCulling.html

Если вы хотите изменить внешний вид вашего объекта в зависимости от расстояния между камерой и вашим объектом, вы должны использовать LOD (Уровень детализации) . Вот документация:

https://docs.unity3d.com/Manual/class-LODGroup.html

...