Depository of News

Эволюция рендеринга в Zenith Engine: многопоточная загрузка GPU-ресурсов

newsdepo.com · world

В данной статье будем рассматривать технические детали графических API Metal и API Vulkan и многопоточное программирование, от читателя требуется знание перечисленных технологий. Всем привет! Я Андрей, разработчик 3D-графики в 2ГИС. Если вы пишете рендер на C++ и у вас есть отдельный RenderThread, то, скорее всего, вы уже сталкивались с подобным: данные грузятся в фоне, а вот создание GPU‑ресурсов всё равно происходит в потоке отрисовки через прямое обращение к графическим API Vulkan, Metal, Direct3D 12. И пока RenderThread в длинном цикле создает буферы и текстуры, он не рисует — он стоит, пока не обработает список загруженных ресурсов. У нас это выглядело так на типичной средней сцене: до появления первого кадра на поток отрисовки приходило 532 текстуры и 2713 буферов, которые удерживали 45 МБ и 20 МБ временной памяти в RAM соответственно. Всё это нужно было доставить до GPU создать наборы буферов и текстур далее все освободить — и только потом начинать собирать батчи и рисовать. В статье разберём, как мы вынесли создание буферов и текстур на потоки загрузки, что для этого дает Metal, почему в Vulkan всё сложнее, и какие ограничения по особенностям работы графических API пришлось учитывать. Читать далее

Read full article →