28.02.2024

Для GTK подготовлены новые движки отрисовки для OpenGL и Vulkan

Разработчики библиотеки GTK объявили о готовности двух новых движков отрисовки — «ngl» и «vulkan», использующих графические API OpenGL (GL 3.3+ и GLES 3.0+) и Vulkan. Новые движки включены в состав экспериментального выпуска GTK 4.13.6. В экспериментальной ветки GTK движок ngl теперь используется по умолчанию, но в случае выявления значительных проблем в следующей стабильной ветке 4.14 будет возвращён старый движок отрисовки «gl».

Новые движки позиционируются как унифицированные и собираемые из единой кодовой базы. Суть унификации в том, что в качестве основы используется API Vulkan, поверх которого для OpenGL создан отдельный уровень абстракции, учитывающий отличия между OpenGL и Vulkan. Подобный подход позволил задействовать в обоих движках общую инфраструктуру для обработки графа сцены (scene graph), трансформаций, кэширования текстур и глифов. Унификация также заметно упростила сопровождение кодовой базы обоих движков и их поддержание в актуальном и синхронизированном состоянии.

В отличие от старого движка «gl», в котором для каждого типа узлов рендеринга (rendernode) использовался отдельный простой шейдер и выполнялась периодическая пересортировка данных, отрисованных в буфер (offscreen), в новых движках вместо отрисовки вне экрана применяется сложный шейдер (ubershader), интерпретирующий данные из буфера. В текущем виде новая реализация пока отстаёт от старой по уровню оптимизаций, так как основное внимание на текущей стадии удаляется корректности работы и простоте сопровождения.

Новые возможности, которые отсутствуют в старом движке «gl»:

  • Сглаживание контуров — позволяет сохранить мелкие детали и добиться отрисовки более ровных контуров.
  • Формирование произвольных градиентов, в которых может использоваться любое число цветов и сглаживание (в движке «gl» поддерживались только линейные, радиальные и конические градиенты c 6 цветами остановки).
  • Дробное масштабирование (fractional scale), позволяющее выставлять нецелые значения масштаба, например, при использовании масштаба 125% для окна 1200×800 будет выделен буфер 1500×1000, а не 2400×1600 как в старом движке.
  • Поддержка технологии DMA-BUF для использования нескольких GPU и выноса отдельных операций на другой GPU.
  • Корректно обрабатываются многие узлы рендеринга, с которыми были проблемы в старой реализации.

К ограничениям новых движков отнесено отсутствие поддержки позиционирования по нецелым значениям (fractional position) и узлов glshader, которые были сильно завязаны на особенностях старого движка, и в которых пропала необходимость после добавления поддержка узлов с масками (mask) и текстур с прозрачностью. Также упоминается наличие вероятности всплытия возможных проблем с графическими драйверами, обусловленных изменением метода работы с драйверами.

В будущем на базе новой унифицированной модели не исключается создание движков отрисовки, использующих Metal в macOS и DirectX в Windows, но создание подобных движков затруднено использованием иных языков для шейдеров (в движках «ngl» и «vulkan» задействован язык GLSL, поэтому для Metal и Direct придётся либо дублировать шейдеры, либо использовать прослойку на базе инструментария SPIRV-Cross).

Из планов на будущее упоминается обеспечение поддержки HDR и средств для корректного управления цветом, поддержка пути рендеринга (Path rendering) на стороне GPU, возможность рендеринга глифов, рендеринг вне основного потока и оптимизация производительности для старых и маломощных устройств. В текущем виде производительность движка «vulkan» близка к производительности старого движка «gl». Движок «ngl» отстаёт по производительности от старого движка «gl», но имеющихся показателей достаточно для отрисовки с частотой 60 или 144 FPS. Предполагается, что ситуация изменится после проведения оптимизации.

Источник: https://www.opennet.ru/opennews/art.shtml?num=60515 Источник.