Skip to main content

В этом и прошлом году на WWDC Apple представила несколько новых улучшений Metal: Metal 3 работает на компьютерах Apple Silicon Mac, а также на устройствах iOS и tvOS.

Metal 3 представляет собой значительные усовершенствования движка Metal и фреймворков для написания 3D-игр для платформ Apple.

Мы рассмотрим эти улучшения ниже.

У Metal есть собственный язык шейдинга на основе C++14, Metal Shading Language, который полностью описан в Спецификации языка шейдинга Metal (MSL).

На WWDC ’23 Apple представила версию 1.3 спецификации языка затенения металлов. Спецификация MSL охватывает все аспекты написания кода шейдера для Metal на C++.

Новую спецификацию MSL можно загрузить в формате PDF с веб-сайта разработчиков Apple.

Metal 3 теперь включает в себя дополнительный небольшой дисплей Heads-Up Display, видимый в правом верхнем углу визуализированных сцен во время игры:

Проекционный дисплей Metal Performance.

Performance HUD может отображать несколько полезных сведений для проверки производительности вашей игры в режиме реального времени:

Отображать и регистрировать ключевую статистику производительности ЦП и разрешение Частота обновления устройства Масштабирование Прямой или композитный рендеринг Средняя стоимость кадра в секунду для графического процессора ЕщеНекоторая статистика Metal Heads-up.

Некоторая статистика Metal Heads-up.

На WWDC ’23 Apple также представила инструмент Metal Shader Converter. Шейдеры — это небольшие программы, которые управляют светом, цветом и материалами трехмерных объектов в сцене.

Metal Shader Converter помогает конвертировать шейдеры, написанные на других языках и платформах или с других платформ, в Metal 3, а именно из формата Microsoft Windows DirectX 12 DXIL.

Metal Shader Converter предоставляет на выбор две модели привязки: Automatic Layout и Explicit Layout. Эти модели помогают конвертировать шейдеры с других платформ.

Таблицы MTLBuffer используются в инструменте Metal Shader Converter.

Bindless Rendering, буферы аргументов и трассировка лучей

Новая возможность рендеринга без привязки в Metal 3 позволяет использовать трассировку лучей для повышения производительности и качества 3D-рендеринга сцен.

Один из аспектов рендеринга без привязки — буферы аргументов — позволяют объединять ресурсы в буферы, которые ускоряют рендеринг.

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

3D-сетки связаны друг с другом в памяти, а не используются одна за другой в конвейерах рендеринга. Это ускоряет доступ ко всем объектам, необходимым шейдерам трассировки лучей для более быстрого и детального рендеринга поверхностей с высоким разрешением.

Бесконечный рендеринг.

Бесконечный рендеринг.

Меши, материалы и текстуры могут быть связаны в памяти.

Четыре новых усовершенствования в Metal 3 помогают рендерингу без привязки:

Буферы аргументов — связывают ресурсы вместе для прямого доступа, как описано выше.

Неограниченные массивы — позволяет одновременно определять несколько структур Mesh в массиве. Шейдеры могут без ограничений обращаться к массивам любого размера.

Доступ к объектам структуры сетки в неограниченных массивах теперь можно получить непосредственно из кода и потоков C/C++, хотя при доступе к ним следует соблюдать осторожность из-за проблем с синхронизацией потоков.

Вы можете использовать флаг прекомпилятора __METAL_VERSION__ для условной компиляции объявлений C, C++ и Mesh в Metal 3 для использования неограниченных массивов, если они доступны на целевой платформе.

Вы можете использовать объект MTLDevice во время выполнения, чтобы узнать, поддерживает ли какое-либо данное устройство новые функции. Для использования новых функций необходимо иметь устройство со следующими характеристиками:

iOS — чип A13 Bionic или новее.

macOS — Mac 2016 года выпуска или лучше.

В разделе «Буферы» документации Apple для разработчиков Metal есть новый раздел, посвященный буферам аргументов.

MTLHeap-распределенные структуры ускорения

Кучи — это предварительно выделенные области памяти, в которые ресурсы и структуры загружаются перед рендерингом. Резидентность кучи означает, что ресурсы предварительно загружены и готовы к немедленному использованию, когда это необходимо во время рендеринга.

Структуры ускорения трассировки лучей могут быть выделены непосредственно из объектов MTLHeap вместе с буферами и текстурами. Это позволяет выполнять агрегацию с другими типами ресурсов. Использование структур ускорения MTLHeap экономит процессорное время в потоках.

Усовершенствования проверки шейдеров

Как правило, перед рендерингом ресурсы должны быть резидентными в куче, чтобы обеспечить производительность рендеринга и точное отображение. Если заранее не выделить ресурсы в куче, это может привести к сбоям в производительности и даже к неправильному отображению объектов во время рисования.

Чтобы обеспечить резидентность ресурсов в куче, Metal 3 предоставляет новую функцию для обнаружения отсутствия резидентности во время выполнения общего командного буфера. Чтобы обеспечить резидентность кучи, useResource: теперь отправляется каждому элементу сцены до того, как объекты сцены будут отправлены в кодировщик трассировки лучей.

Эта форма обеспечения резидентности ресурсов до запуска шейдеров трассировки лучей называется проверкой шейдеров в Metal 3.

Эти четыре функции упрощают работу без привязки в Metal 3.

Кроме того, обязательно ознакомьтесь с сессиями WWDC ’23 «Ваше руководство по трассировке лучей Metal» и «Go bindless with Metal 3».

Новое средство просмотра зависимостей Metal Debugger отображает зависимости между ресурсами рабочей нагрузки рендеринга.

Чтобы отобразить средство просмотра зависимостей, откройте Metal Debugger и щелкните строку Dependencies в навигаторе слева:

Открытие отладчика зависимостей Metal.

Открытие отладчика зависимостей Metal.

Появится график зависимостей, который показывает зависимости в каждой команде рендеринга. Щелкнув любой элемент в графе зависимостей, вы увидите подробные сведения об этом элементе на новой боковой панели справа от средства просмотра зависимостей.

В средстве просмотра зависимостей Metal Debugger отображаются два типа зависимостей: поток данных и синхронизация. Сплошные линии в средстве просмотра зависимостей показывают поток данных, а пунктирные линии показывают зависимости, показывающие синхронизацию между проходами.

График отладчика зависимостей Metal.

График отладчика зависимостей Metal.

Отладчик шейдеров

Существует также отладчик шейдеров, встроенный в Xcode 14 и более поздние версии, который позволяет выполнять отладку кода шейдера на уровне пикселей. Вы можете выбрать любой визуализированный пиксель, отображаемый в любой сцене, нажать кнопку «Отладчик шейдера» в правом нижнем углу окна отладчика, и он переместится точно в то место в коде вашего шейдера, которое использовалось для рисования объекта.

Разные улучшения

У команды Metal теперь есть четыре дополнительных рекомендации по оптимизации конвейеров рендеринга Metal:

Переместите копии перед рендерингом. Групповые команды одного типа. Избегайте пустых энкодеров. Оптимизируйте с помощью MTLLoadAction и MTLStoreAction

Последняя рекомендация — MTLLoadAction и MTLStoreAction — используются для вложений, действий, которые необходимо выполнить перед проходом рендеринга.

Эти рекомендации также более подробно описаны в сеансе WWDC ’23 «Без привязки с Metal 3». См. приложение Apple Developer для доступа ко всем видео сеанса WWDC ’23 Metal.

Также обязательно ознакомьтесь с апскейлингом MetalFX, о котором мы рассказывали в другой статье на прошлой неделе.

Эти улучшения в Metal 3 означают, что Metal лучше, чем когда-либо, как платформа для ваших 3D-игр и приложений на устройствах Apple.