creator cover Meshgun
Meshgun

Meshgun 

Рендер-гик, застрявший в Neovim

6subscribers

7posts

Стриминг большой локации

Прошлый прототип дал понять, что боевая симуляция получается тяжёлой и нужно ограничить её пределы. Собирать мир из маленьких арен мне не хотелось, ведь так не будет элемента исследования, а я это дело обожаю. Поэтому пришлось немного поломать голову 🤔
Я разбил игровой мир на чанки, внутри которых сущности хранятся в компакнтом виде. А симуляция происходит только в небольшой зоне около игрока.
В начале кадра я смотрю, какие чанки задевает зона и забираю из них всё содержимое, распаковывая сущности в удобный для симуляции формат. В конце кадра пакую результат обратно в чанки.
Получается такая стриминговая система, благодаря которой размер локации не влияет на производительность боёвки.
P.S. Сундук самый обыкновенный, не обращайте на него внимание.

Основы рендера воды 🌊

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

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


Идея простая, но есть нюансы.


Текстуру перед использованием нужно перевести в правильный лейаут (shader_optimal, attachment_optimal, ..). Но среди них нет такого, который позволил бы одновременно и сэмплировать текстуру, и использовать её в качестве аттачмента (даже Read-only). Это значит, что передать посчитанный буфер глубины в шейдер воды напрямую не получится, ведь он будет приаттачен к пассу.
Лэйаут attachment_optimal означает, что текстура загружается маленькими кусочками в кэш тайла, так как область записи этого тайла жёстко ограничена и известна заранее. Это позволяет тайлам не зависеть друг от друга и не гонять до основной памяти, пока не закончится пасс.

Профайлить полезно всегда и со старта ☝️

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

Существует два фундаментально разных вида профайлеров: сэмплирующие и инструментальные.

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

Мне понравилось пользоваться samply. Посмотреть результат его захвата можно через firefox profiler. Ещё есть cargo-flamegraph: он хорош тем, что захват пишется в обычный svg. Но мне важны данные во времени, а не только график выгорания.
Subscription levels0
No subscription levels
Go up