четверг, 30 августа 2018 г.

FrameGraph. часть 2

  Итак, первый этап разработки фреймграфа завершен, тесты написаны, картинка рисуется. Но похожих проектов уже несколько на гитхабе и намного больше в приватных репозиториях и в коммерческих проектах. Так как доказать, что мое решение лучше? А если не лучше, то как сделать его таковым?
  Нужны тесты на производительность. Но писать их долго, тем более нужно с чем-то сравнивать и желательно с чистым вызовами vulkan api, да еще с наилучшей оптимизацией. Это конечно весело, но хочется побыстрее получить результат, поэтому я стал искать другие варианты и нашел - слой vktrace позволяет записывать все вызовы vulkan api и потом проигрывать их заново. Остается только конвертировать сохраненный трейс в C++ код с вызовом чистого vulkan api и с вызовом FrameGraph api, таким образом можно за короткое время получить множество тестов на производительность и корректность рендеринга (сравнивая кадры), да еще и не на простых демках, а на реальных играх и приложениях.
  Подробнее о конвертере будет написано позже, сейчас идет только начальная стадия написания. В планах также добавить различные проходы оптимизации, что позволит увидеть потенциальный максимум производительности и сравнить его с текущим результатом, это будет полезно всем. Также хочу сравнить мой фреймграф с другими фреймворками и врапперами над вулканом, возможно сделаю opengl версию с максимальной оптимизацией, будет забавно сравнить фреймворки на вулкане с чистым opengl, особенно по нагрузке на cpu.

  Кроме тестов на производительность, которые только будут, уже готовы юнит тесты, в том числе на правильную расстановку барьеров (которую на данный момент не осилили в VEZ). Написан встроенный дебагер и сериализатор кадра, которые используются для тестирования расстановки барьеров в сложной сцене, тестирования сортировки графа, тестирования оптимизации рендер пассов и тд. При сериализации кадра происходит сортировка ресурсов по имени, а не по хэшу указателя, как они обычно хранятся в мапе, что делает описание кадра независимым от запуска программы (когда меняется seed для хэша например).
  Дополнительно дебагер обнаруживает возможные проблемы в при растановке барьеров, например ставятся подряд два барьера только на запись, это значит, что первый результат записи теряется, что скорее всего ошибка.

FrameGraph. часть 1

  Здесь будет рассказано о функциях фреймграфа: управление памятью, управление ресурсами, оптимизация кадра и тд.

FrameGraph. часть 0

  Начитался я презентаций от Dice, а также советов по оптимизации vulkan-рендерера, и захотел когда-нибудь написать свой фреймграф, и так уж получилось, что время на это нашлось...
  Для начала, что в моем представлении делает фреймграф - создает слой абстракции от низкоуровневого api (Vulkan, DX12), в отличие от различных graphics framework, фреймграф использует конкретный способ представления кадра - как набор узлов (задач), которые формируют граф. Такое представление кадра позволяет распараллелить некоторые задачи (раньше это не позволяло ни api, ни железо), оптимизировать память временных ресурсов, так как определены моменты начала и конца использования, наилучшим образом выставлять барьеры и тд.
  Первоначально я написал фреймграф на своем движке, реализация оказалось немного неудачной и, (так уж получилось) нашлось время на полное переделывание фреймграфа, на этот раз это будет отдельная либа с минимумом зависимостей и только на vulkan api, но абстракция позволяет добавить любое другое api. 

  Визуализация графа в программе GraphViz, это была не финальная реализация и тут отсутствуют некоторые связи между ресурсами. Зато хорошо видно как раставлены барьеры (маленькие узлы графа), разные типы узлов (красные - рисование, фиолетовые - копирование), видно как задачи отсортированы и некоторые из них могут выполняться параллельно.

пятница, 13 июля 2018 г.

Интересные блоги

Чтоб не потерялось решил и тут сохранить интересные блоги и прочее.

Блоги
Real world technologies
The ryg blog
The Danger Zone
AMD GPU Open
Demo fox
KOSMONAUT'S BLOG
Adam Sawicki Blog
Krzysztof Narkowicz blog
nlguillemot blog
Outerra
Tom's Computer Graphics Research
Humus
Intel GameDevTech


Статьи по рендеру
SDF shadows2
Shadow of War: performance & memory optimization - особенно интересно про sparse memory
FrameGraph in Frostbite
GPU-based clay simulation and ray-tracing tech in Claybook
Thinking Parallel23 - BVH raytracing
casual effects research - статьи по новых техникам
Destiny renderer
How (not) to test graphics algorithms

PBR
Precomputed global illumination in Frostbite
Physically Based Rendering - online книга
Arbitrarily Layered Micro-Facet Surfaces
Moving Frostbite to PBR

Статьи по GPU
Breaking down barriers - как работают синхронизации на GPU
OpenGL pipeline - начальный уровень
Подробный разбор графического конвеера - более продвинутый уровень
Про особенности GTX 1080 и GTX 2080