Два способа заставить металл петь как птица в Swift Playgrounds

Swift Playgrounds 4 стала огромным обновлением, которое принесло полную разработку приложений в SwiftUI для iPad, а также сделало приложение более быстрым и удобным в использовании. Хотя Playgrounds хорошо подходит для создания прототипов и работы на ходу, в нем отсутствуют некоторые расширенные функции разработки, такие как Metal.
В этой статье будут показаны два способа заставить Metal работать в Swift Playgrounds 4 как для проектов приложений, так и для игровых площадок.
Компиляция Metal-библиотеки в Xcode
Один из вариантов — просто скомпилировать исходный код Metal в Xcode и скопировать скомпилированную библиотеку в Playgrounds.
Это сохраняет завершение кода и подсветку синтаксиса при работе с исходным кодом Metal и ускоряет выполнение. Однако этот метод может быть довольно громоздким и работает только на одной платформе (одна и та же скомпилированная библиотека не будет работать как на iOS, так и на macOS).
Процедура следующая:
- Откройте новый проект iOS в Xcode
- Создайте новый файл
.metalи напишите свои шейдеры - Создайте проект для своей платформы
- Нажмите Продукт › Показать папку сборки в Finder и перейдите к
Products/Debug-[platform]. Например, сборка для Mac Catalyst дает путьProducts/Debug-maccatalyst. - Щелкните правой кнопкой мыши свое приложение и выберите
Show Package Contents, затем скопируйте файлdefault.metallib(может находиться в папке "Ресурсы"). - Затем в Swift Playgrounds. Если у вас есть приложение: вставьте файл в папку Resources вашего приложения (или перетащите файл в приложение для игровых площадок). Если у вас есть игровая площадка: вставьте файл в
Edits/UserResourcesвашей игровой площадки (или выберите файл с файловым литералом). - Напишите код для выполнения вашей металлической функции, как в обычном приложении, используя
device.makeDefaultLibrary()!

Сильные стороны
- Сохранить завершение кода и подсветку синтаксиса
- Выполняется быстрее (если вам действительно нужна оптимизация)
Ограничения
- Громоздкий
- Работает только на платформе, для которой он был скомпилирован.
Сохраните источник металла как ресурс
Другой метод — сохранить исходный код Metal в виде открытого текста в качестве ресурса и скомпилировать на устройстве.
Преимущество здесь в том, что вы можете редактировать шейдер в Playgrounds, и Playground будет работать кроссплатформенно. И если вы откроете шейдер в Xcode (или другом редакторе с установленным языком C++), вы получите подсветку синтаксиса.
Метод выглядит следующим образом:
- Создайте новый текстовый файл и напишите свои шейдеры. Обратите внимание, что вы можете закончить файл с помощью
.metal, однако это не будет работать в приложении для игровых площадок — приложение не будет компилироваться. - Если у вас есть приложение: вставьте файл в папку
Resourcesвашего приложения (или перетащите файл в приложение для игровых площадок). Если у вас есть игровая площадка: вставьте файл вEdits/UserResourcesвашей игровой площадки (или выберите файл с файловым литералом) - Напишите код для выполнения вашей функции Metal, как в обычном приложении, используя
try device.makeLibrary(source: String, options: MTLCompileOptions?)
let file = #fileLiteral(resourceName: "<Name of your metal-source>") let libraryData = try! Data(contentsOf: file) let libraryStr = String(data: libraryData, encoding: .utf8)! let library = try device.makeLibrary(source: libraryStr, options: nil)
Сильные стороны
- Источник можно редактировать в Swift Playgrounds
- Работает на любой платформе
Ограничения
- Нет подсветки синтаксиса и завершения кода
- Немного медленнее выполняется
Компиляция библиотеки в Xcode приведет к немного более быстрому выполнению. Я провел тест, чтобы сравнить время, необходимое для загрузки металлической библиотеки в Swift Playgrounds, используя два описанных выше метода. Тест проводился в Swift Playgrounds 4.0 на M1 Mac с использованием шейдера Metal, насчитывающего 11 строк кода. Результаты представлены в микросекундах (т.е. меньше миллисекунд), но показывают, что компиляция в Xcode загрузит библиотеку быстрее.

Это два способа заставить Metal работать в Swift Playgrounds. Компиляция Metal-библиотеки в Xcode, возможно, предпочтительнее, если у вас уже есть готовая металлическая библиотека, а сохранение Metal-source в качестве ресурса предпочтительнее, если вам нужно редактировать исходный код во время разработки на игровой площадке.