Войти
Unreal EngineФорумОбщее

Продвинутый стриминг

Advanced: Тема повышенной сложности или важная.

#0
18:46, 8 фев. 2020

Unreal Engine предлагает из коробки два варианта стриминга.
Автоматический через Level Streaming Volume
и ручной через Load/Unload

Про ручной пока забудем, ручной менеджмент стриминга это отдельная тема и его пока касаться не хотелось бы. Хочется получить нормальный настраеваемый автоматический способ.
Насколько я могу судить, Level Streaming Volume достаточно тупая и не гибкая штука. Заранее прописываем набор уровней и всё: вошли в объем - началась загрузка, вышли из объема - запланировалась выгрузка.
Это совсем не то, что я хочу получить:

1) Стриминг по динамическому вольюму вокруг игрока. То есть нам надо проверять не то, что игрок вошел или вышел из объема. А что level для стриминга попал или выпал  из объема, который перемещается вслед за камерой.
Как это проще всего сделать?

2) Стриминг с заменой ЛОДа.
Предположим есть локация на карте с кучей объектов. Её надо выгружать и загружать. Но она достаточно большая и её видно очень издалека. Поэтому после выгрузки нельзя оставить голый ландшафт - нужно поставить несколько простых объектов, который издалека будут создавать видимость этой локации
Как это сделать? Вручную ловить событие загрузки/выгрузки соответствующего уровня? Я даже событий таких не вижу, чтобы к ним привязаться.

#1
18:58, 8 фев. 2020

@!!ex
> Стриминг с заменой ЛОДа.

зачем стриммит геометрию ? сколько занимает средний меш и текстура?

#2
(Правка: 19:15) 19:03, 8 фев. 2020

innuendo
Речь о том, чтобы стримить целую локацию.
Поселок, скажем. Там тасячи пропсов с соответствующим количеством текстур.

#3
20:54, 8 фев. 2020

@!!ex
> Поселок, скажем. Там тасячи пропсов с соответствующим количеством текстур.

всё равно сравни

#4
20:57, 8 фев. 2020

innuendo
> всё равно сравни
Выше меня уже провели оценку и пришли к выводу что надо выгружать. Это не моя задача.
Моя задача - выгрузить level и на его место воткнуть lod.
И я сейчас ищу как сделать это максимально автоматизированным способом(в крайнем случае написать инструмент для автоматизации). Сейчас пытаюсь разобраться, какие решения есть, чтобы сходу не городить велосипед просто от того, что не знаю о существующих решениях.

#5
0:01, 9 фев. 2020

А ты не пробовал настроить precomputed visibility и агресивные HLODы?

#6
8:17, 9 фев. 2020

Wazzdaka
Проблемы производительности вторичны.

#7
9:50, 9 фев. 2020

Мне кажется, тут описан стандартный WorldComposition, стримминг идет по дистанции от игрока до LevelBounds (для разных уровней можно настроить разные дистанции) + автоматическая замена всего уровня на лоды (прокси меш со всей статики на уровне + меш из ландшафта)

#8
(Правка: 9:54) 9:54, 9 фев. 2020

думаю надо сделать класс менеджер
для централизованного управления уровнями
и все там, через него и загружать/выгружать , и запускать сопровождающие события.
и даже возможно определять что загружать:
- каким нить AABB вокруг персонажа, чтоб не добавлять ему компонент коллизию размером в пол километра.
- или индексы соседних уровней от текущего
- или как нибудь еще

#9
12:31, 9 фев. 2020

@!!ex
> А что level для стриминга попал или выпал  из объема, который перемещается
> вслед за камерой.
Почему нельзя вольюм левел стриминга просто сделать побольше, это будет компенсировать дистанцию, которую ты хотел добавить вольюмом вокруг игрока.

@!!ex
> 2) Стриминг с заменой ЛОДа.
Я вижу два варианта. Первый это сделать HLOD с прокси геометрией для крупных объектов, а всё остальное уже по левел стримингу.

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

#10
(Правка: 20:41) 20:40, 9 фев. 2020

n3td0g
> + автоматическая замена всего уровня на лоды (прокси меш со всей статики на
> уровне + меш из ландшафта)
Я не вижу в документации как это настроить. Я даже плохо понимаю что здесь вообще написано. Где почитать об этом?

n3td0g
> стримминг идет по дистанции от игрока до LevelBounds
Про это ни слова в документации по стримингу, или я не туда смотрю. Подскажите куда смотреть.

Sn_a_ke
> думаю надо сделать класс менеджер
Самописное что-то делать конечно есть в списке. Но прежде чем что-то делать надо убедиться, что это уже не сделан.
ЧАстая болезнь разрабов на UE - пилить велосипед просто потому, что не знаешь о существовании готового. Хочу избежать этой ошибки.

arte_de_mort
> Почему нельзя вольюм левел стриминга просто сделать побольше, это будет
> компенсировать дистанцию, которую ты хотел добавить вольюмом вокруг игрока.
Он стоит на горке. Он видит вообще всё.
В зависимости от того, есть у него в руках винтовка с оптикой или бинокль - я могу выгружить или загружать уровни. Взял пистолет - радиус стриминга уменьшился. Взял бинокль - увеличился. Просто увеличение размеров вольюмов тут не поможет.

arte_de_mort
> Я вижу два варианта. Первый это сделать HLOD с прокси геометрией для крупных
> объектов, а всё остальное уже по левел стримингу.
ЛОДы это отдельная тема и они по большей части сделаны. Но они никак не решают проблемы потребления памяти. А у меня именно эта проблема ключевая.

#11
22:03, 9 фев. 2020
Я не вижу в документации как это настроить. Я даже плохо понимаю что здесь вообще написано. Где почитать об этом?

В этом доке есть и про стримминг и про лоды.

https://docs.unrealengine.com/en-US/Engine/LevelStreaming/WorldBr… er/index.html

На дистанции уровень выгружается со всеми ресурсами, заменяется на один прокси меш. Есть встроенные инструменты, чтоб этот лод вместо целого уровня сгенерировать, настроить качество и несколько уровней лодов и т.д.. В общем все из коробки более/менее нормально, нам пришлось подкрутить малость под свои задачи но в остальном все работает.

#12
22:09, 9 фев. 2020

Принято. Спасибо

#13
12:32, 10 фев. 2020

мне кажется, что твоя задача ближе к HLOD
https://docs.unrealengine.com/en-US/Engine/HLOD/index.html
попробуй тоже потыкай

Unreal EngineФорумОбщее