Команда разработки 2ГИС оптимизировала работу графического движка Zenith Engine, чтобы устранить задержки при отрисовке кадров. Ранее поток отрисовки выполнял создание ресурсов GPU напрямую через API Vulkan, Metal и Direct3D 12, из-за чего процесс рендеринга приостанавливался до завершения загрузки данных.

Для типичной сцены движку требовалось обработать 532 текстуры и 2713 буферов. На эти задачи расходовалось 45 МБ и 20 МБ оперативной памяти соответственно. Пока поток отрисовки создавал эти объекты, он не мог приступать к формированию батчей и выводу изображения на экран.

Разработчики перенесли создание буферов и текстур на отдельные потоки загрузки. В материале подробно описаны технические особенности реализации этого решения, а также ограничения, с которыми пришлось столкнуться при работе с графическими API Metal и Vulkan в рамках многопоточной архитектуры.