Металлические контакты и методы
В этой главе рассматриваются подсказки и методы, которые могут улучшить производительность приложения или производительность разработчика.
Создание библиотек во время процесса сборки приложения
Компиляция исходных файлов языка программы построения теней и создание библиотеки (.metallib
файл) во время приложения процесс сборки достигает лучшей производительности приложения, чем компиляция исходного кода шейдера во время выполнения. Можно создать библиотеку в XCode или при помощи утилит командной строки.
Используя XCode для создания библиотеки
Любые исходные файлы программы построения теней, которые находятся в Вашем проекте, автоматически используются для генерации библиотеки по умолчанию, к которой можно получить доступ от Металлического кода платформы с newDefaultLibrary
метод MTLDevice
.
Используя утилиты командной строки для создания библиотеки
Рисунок 8-1 показывает утилиты командной строки, формирующие набор инструментальных средств компилятора для Металлического исходного кода шейдера. Когда Вы включаете .metal
файлы в Вашем проекте, XCode вызывает эти инструменты для создания файла библиотеки, к которому можно получить доступ в приложении во время выполнения.
Скомпилировать источник программы построения теней в библиотеку, не используя XCode:
Использовать
metal
скомпилировать каждого.metal
файл в сингл.air
файл, хранящий промежуточное представление кода языка программы построения теней.Использовать
metal-ar
заархивировать несколько.air
файлы вместе в сингл.metalar
файл.metal-ar
подобно утилите Unixar
.Использовать
metallib
создавать Металл.metallib
файл библиотеки от архива.metalar
файл.
Для доступа к получающейся библиотеке в коде платформы вызовите newLibraryWithFile:error:
метод MTLDevice
.
Металлические наборы функций
Металлический набор функций описывает возможности и ограничения Металлической реализации. supportsFeatureSet:
метод MTLDevice
возвращает булево значение, указывающее, применяются ли возможности и ограничения определенного набора функций к этой реализации.
Существует два набора функций: MTLFeatureSet_iOS_GPUFamily1_v1
и MTLFeatureSet_iOS_GPUFamily2_v1
. В iOS_GPUFamilyN
, суффикс _vN
указывает различную версию в той же семье функции. Обратите внимание на то, что MTLFeatureSet_iOS_GPUFamily1_v1
и MTLFeatureSet_iOS_GPUFamily2_v1
находятся в различных семьях функции.
Таблица 8-1 суммирует известные возможности и ограничения каждого набора функций.
Функция | Значение семьи 1 v1 GPU | Значение семьи 2 v1 GPU |
---|---|---|
Максимальное количество цветных присоединений на | 4 | 8 |
Максимальный цветной вывод данных на выборку (через все цветные присоединения) на рендеринг передачи | 16 байтов | 32 байта |
Поддержки форматы пикселя ASTC | Нет | Да |
Минимальный присоединяемый размер (цвет или глубина/шаблон), ширина или высота | 32 пикселя | 32 пикселя |
Инкремент размера выделения памяти Threadgroup | 16 байтов | 16 байтов |
Максимальное общее количество threadgroup выделение памяти | 16 384 байта | 16 384 байта |
Максимум | 4096 | 4096 |
Максимум | 2048 | 2048 |
Максимальное количество записей в таблицах параметра для рендеринга и вычисляет кодеры команды | 31 (буфер) 31 (текстура) 16 (состояние сэмплера) | 31 (буфер) 31 (текстура) 16 (состояние сэмплера) |
Следующие примечания применяются к обоим наборам функций:
Максимальный цветной вывод данных, перечисленный в Таблице 8-1, ограничивает общие цветные данные, которые каждая передача рендеринга может хранить для каждого выходного пикселя через все его цветные присоединения. (Глубина и присоединения шаблона не говорят против этого предела.), Если Вы создаете a
MTLRenderPassDescriptor
и сумма требований хранения для всех цветных присоединений больше, чем позволенный максимум, фатальная ошибка происходит.Все форматы пикселя используют минимум
4
байты на выборку в присоединении, даже если форматы пикселя используют меньше, чем4
байты на пиксель в памяти. Например,MTLPixelFormatR8Unorm
,MTLPixelFormatR8Uint
, иMTLPixelFormatR8Sint
форматы пикселя используют 1 байт на пиксель в памяти, но используют4
байты на выборку в присоединении.MTLPixelFormatRGB10A2Unorm
,MTLPixelFormatRG11B10Float
, иMTLPixelFormatRGB9E5Float
использование форматов пикселя4
байты на пиксель в памяти, но используют8
байты на выборку в присоединении. Все другие форматы пикселя берут ту же сумму пространства в памяти как в присоединяемом хранении.Минимальный присоединяемый размер, перечисленный в Таблице 8-1, не является пределом; однако, присоединениям, меньшим или в ширине или в глубине, чем это значение, стоили увеличенной производительности. Это особенно верно для присоединений глубины/шаблона.
Настройки схемы XCode и производительность
Когда Металлическое приложение работает от XCode, настройки схемы по умолчанию сокращают производительность. XCode обнаруживает, ли Металл, API используется в исходном коде и автоматически включает настройки GPU Frame Capture и Metal API Validation, как замечено на рисунке 8-2. Когда Получение Кадра GPU включено, уровень отладки активируется. Когда Металл, который Проверка API включена, каждый вызов, проверен, который влияет на производительность далее. Для обеих настроек производительность ЦП более затронута, чем производительность GPU. Если Вы не отключаете эти настройки, производительность приложения может заметно улучшиться, когда приложение выполняется за пределами XCode.
Отладка
Используйте подсказки в следующих разделах для получения более полезной диагностической информации при отладке и профилировании Металлического приложения.
Расширение файла для металлических исходных файлов языка штриховки
Для Металлических имен файла исходного кода языка штриховки необходимо использовать .metal
расширение файла, чтобы гарантировать, чтобы средства разработки (XCode и отладчик кадра GPU) распознали исходные файлы при отладке или профилировании.
Выполнение получения кадра с XCode
Для выполнения получения кадра в XCode включите отладку и вызовите insertDebugCaptureBoundary
метод MTLCommandQueue
сообщать XCode. presentDrawable:
и presentDrawable:atTime:
методы MTLCommandBuffer
так же сообщите XCode о получении кадра, так вызов insertDebugCaptureBoundary
только если не присутствуют те методы.
Свойство метки
Много Металлических объектов платформы — таких как буферы команд, конвейерные состояния и ресурсы — поддерживают a label
свойство. Можно использовать это свойство для присвоения имени для каждого объекта, который значим в контексте проекта приложения. Эти метки появляются в интерфейсе отладки Получения Кадра XCode, позволяя Вам более легко идентифицировать объекты.