Общие вопросы по ландшафту.


photo

Recommended Posts

Добрый день.

Возникло несколько вопросов, на которые я не нашёл ясного ответа. И для которых нет смысла создавать отдельные темы.

   На сайте указано, что слишком большое количество карт слоёв может снизить производительность. Хотелось бы более развёрнуто, что значит слишком? Влияет ли только количество или размер тоже (наверняка, но что и на что). Где узкое место в железе, чтобы понимать как распределять ресурсы (может что то дешевле реализовать масками, деталями). Например, как скажется на производительности 10 карт разрешением 16к*16к пикселей? Или 100 карт 100*100 пикселей.

   В классе LandscapeTextures Class метод getOpacityHeight получает R32F текстуру с данными прозрачности. Для чего эти данные используются?

По мере возникновения новых вопросов, буду добавлять их в эту тему.

С Уважением Константин.

 

Link to post

Добрый день, @Vasara!

Это довольно комплексная тема, постараюсь коснуться каждого фактора. Вся производительность основана на стриминге данных. Весь ландшафт стримится потайлово (размер тайла фиксированный - 128×128 px), для каждого компонента отдельно (Albedo, Heightmap, данные о масках) и только в тех местах, что видны камерой, формат ассетов Landscape Layer Map подразумевает фрагментированную загрузку по востребованию.

При этом, учитывается видимость слоёв: если, скажем, крупная Landscape Layer Map перекрывает данные других слоёв, только она будет участвовать в загрузке данных. Важно то, сколько слоёв определяют вид ландшафта в текущий момент времени во вьюпорте - большое число крупных слоёв с текстурами высокого разрешения заметно усложнят загрузку с диска и на видеокарту. Здесь стоит рассмотреть вариант объединения множества текстур в одну в графическом редакторе.

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

Важную роль играет поведение камеры. Статичная камера предполагает единоразовую загрузку данных (если всё помещается в видеопамять), в то время, как при движущейся, вся детерминированность может пропасть, а стриминг сильно ударит по производительности. Здесь нет чётких правил, только рекомендации: использовать Microprofile и отслеживать время загрузки, для удобства профилирования можно анимировать перемещение камеры через Tracker и запускать анимацию для тестов.

Количество статичных слоёв не сильно влияет на производительность, примером могут служить демо-проекты сэмплы с Landscape Terrain со множеством следов, сделанных при помощи Landcsape Layer Maps. Другое дело обстоит с динамическими слоями, здесь тайлы уже не только загружаются, но и перезагружаются. Если очень много изменений в слоях за один кадр, число перезагрузок может превысить пропускную способность системы и производительность упадёт в ноль. Поэтому очень важно следить на настройками стриминга и динамикой изменения слоёв и тайлов, избегать покадрового изменения крупных слоёв, вызывающих перезагрузку множества тайлов.

Узкое место может быть во всех основных компонентах системы, особенно в диске, для ландшафтов крупного размера (несколько километров в поперечнике) и с деталями большого разрешения, лучше использовать SSD, более медленные HDD сделают стриминг заметным при резком изменении положения камеры. И, конечно, необходимо следить за такими настройками, как Tiles Load Per Frame, Tiles Update Per Frame и размер виртуальной текстуры (больший размер позволит хранить больше загруженных тайлов). Многоядерные процессоры здесь имеют преимущество, т.к. позволяют распределить загрузку.

Обязательно постараемся покрыть этот вопрос максимально прозрачно в документации, спасибо.

On 10/14/2020 at 10:48 PM, Vasara said:

 В классе LandscapeTextures Class метод getOpacityHeight получает R32F текстуру с данными прозрачности. Для чего эти данные используются?

Метод getOpacityHeight возвращает текстуру непрозрачности для высот участка террейна, которая может появиться при импорте карты высот Landscape Layer Map с картой непрозрачности или при стирании высоты кистью Eraser.

Надеюсь, это поможет. Спасибо!

  • Like 2
Link to post

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

Link to post
  • 2 weeks later...

Добрый день. 
По понятным причинам хочу перенести фильтры эрозии на GPU. С шейдерами до этого момента не сталкивался.
Насколько понимаю из статей по UUSL, с буфером напрямую можно работать через  Compute Shader.
Отсюда ряд вопросов:
Как отправить в буфер нужную мне текстуру из лмапы (например только текстуру высот или только альбедо, маску и тд.).
Как шейдеры взаимодействуют с террейном. Т. е. как вызвать нужный шейдер чтобы модифицировать или отрендерить нужную текстуру террейна в GPU.
Как сохранить данные из буфера обратно в лмапу.

Поддерживается ли API DirectX12(интересует возможность задействовать несколько ядер процессора).

Чем меньше прыжков от GPU к процессору и озу тем лучше.

С Уважением Константин.

Edited by Vasara
Link to post