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

Swift Playgrounds 4 стала огромным обновлением, которое принесло полную разработку приложений в SwiftUI для iPad, а также сделало приложение более быстрым и удобным в использовании. Хотя Playgrounds хорошо подходит для создания прототипов и работы на ходу, в нем отсутствуют некоторые расширенные функции разработки, такие как Metal.

В этой статье будут показаны два способа заставить Metal работать в Swift Playgrounds 4 как для проектов приложений, так и для игровых площадок.

Компиляция Metal-библиотеки в Xcode

Один из вариантов — просто скомпилировать исходный код Metal в Xcode и скопировать скомпилированную библиотеку в Playgrounds.

Это сохраняет завершение кода и подсветку синтаксиса при работе с исходным кодом Metal и ускоряет выполнение. Однако этот метод может быть довольно громоздким и работает только на одной платформе (одна и та же скомпилированная библиотека не будет работать как на iOS, так и на macOS).

Процедура следующая:

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

Сильные стороны

  • Сохранить завершение кода и подсветку синтаксиса
  • Выполняется быстрее (если вам действительно нужна оптимизация)

Ограничения

  • Громоздкий
  • Работает только на платформе, для которой он был скомпилирован.

Сохраните источник металла как ресурс

Другой метод — сохранить исходный код Metal в виде открытого текста в качестве ресурса и скомпилировать на устройстве.

Преимущество здесь в том, что вы можете редактировать шейдер в Playgrounds, и Playground будет работать кроссплатформенно. И если вы откроете шейдер в Xcode (или другом редакторе с установленным языком C++), вы получите подсветку синтаксиса.

Метод выглядит следующим образом:

  1. Создайте новый текстовый файл и напишите свои шейдеры. Обратите внимание, что вы можете закончить файл с помощью .metal, однако это не будет работать в приложении для игровых площадок — приложение не будет компилироваться.
  2. Если у вас есть приложение: вставьте файл в папку Resources вашего приложения (или перетащите файл в приложение для игровых площадок). Если у вас есть игровая площадка: вставьте файл в Edits/UserResources вашей игровой площадки (или выберите файл с файловым литералом)
  3. Напишите код для выполнения вашей функции 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 в качестве ресурса предпочтительнее, если вам нужно редактировать исходный код во время разработки на игровой площадке.