Разные платформы имеют совершенно разные возможности производительности; высокопроизводительный графический процессор ПК может обрабатывать гораздо больше с точки зрения графики и шейдеровпрограммы, работающей на графическом процессоре. Подробнее
Посмотрите в Словарь, чем недорогие мобильные графические процессоры. То же самое верно даже для одной платформы; быстрый графический процессор в десятки раз быстрее медленного встроенного графического процессора.
Производительность графического процессора на мобильных платформах и недорогих ПК, скорее всего, будет намного ниже, чем на вашем компьютере для разработки. Рекомендуется вручную оптимизировать шейдеры, чтобы сократить количество вычислений и чтения текстур, чтобы получить хорошую производительность на слабых компьютерах с графическим процессором. Например, у некоторых встроенных объектов Shader есть «мобильные» эквиваленты, которые намного быстрее, но имеют некоторые ограничения или приближения.
Эта страница содержит информацию об оптимизации шейдеров для повышения производительности во время выполнения.
Вычисляйте только то, что вам нужно
Чем больше вычислений и обработки требуется вашему коду шейдера, тем больше это повлияет на производительность вашей игры. Например, поддержка цвета для каждого материала хороша для того, чтобы сделать шейдер более гибким, но если вы всегда оставите этот цвет установленным на белый, тогда для каждой вершины или пикселя будут выполняться бесполезные вычисленияНаименьшая единица компьютерного изображения. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
См. Словарь, отображаемый на экране.
Частота вычислений также влияет на производительность игры. Обычно визуализируется намного больше пикселей (и, следовательно, выполняется больше пиксельных шейдеров), чем вершин (исполнений вершинных шейдеров), и больше вершин, чем визуализируемых объектов. По возможности переносите вычисления из кода пиксельного шейдера в вершинный шейдерпрограмму, которая выполняется в каждой вершине 3D-модели. когда модель визуализируется. Подробнее
Посмотреть в коде Словарь или полностью убрать их из шейдеров и установить значения в сценарии.
Точность вычислений
При написании шейдеров на Cg/HLSL существует три основных типа чисел: float
, half
и исправлено
(см. Типы данных и точность).
Для хорошей производительности всегда используйте самую низкую возможную точность. Это особенно важно на низкоуровневом оборудовании. Хорошие эмпирические правила:
- Для позиций в мировом пространстве и координат текстуры используйте точность
float
. - Для всего остального (векторы, цвета HDR и т. д.) начинайте с
половинной
точности. Увеличивайте только при необходимости. - Для очень простых операций с текстурными данными используйте
фиксированную
точность.
На практике, какой именно тип числа следует использовать, зависит от платформы и графического процессора. Вообще говоря:
- Все современные графические процессоры для настольных ПК всегда будут вычислять все с полной точностью
float
, поэтомуfloat/half/fixed
в конечном итоге будет точно то же самое снизу. Это может затруднить тестирование, так как трудно понять, действительно ли достаточно половинной/фиксированной точности, поэтому всегда проверяйте свои шейдеры на целевом устройстве для получения точных результатов. - Мобильные графические процессоры имеют фактическую поддержку
половинной
точности. Обычно это быстрее и требует меньше ресурсов для вычислений. -
Фиксированная
точность обычно полезна только для старых мобильных графических процессоров. Большинство современных графических процессоров (те, которые могут работать с OpenGL ES 3 или Metal) внутренне обрабатываютфиксированную
иполовинную
точность одинаково.< /li>
Дополнительную информацию см. в разделе Типы данных и точность.
Сложные математические операции
Трансцендентные математические функции (например, pow
, exp
, log
, cos
, sin
, tan
) довольно ресурсоемки, поэтому по возможности избегайте их использования на слабом оборудовании. Рассмотрите возможность использования текстур поиска в качестве альтернативы сложным математическим вычислениям, если это применимо.
Избегайте написания собственных операций (например, normalize
, dot
, inversesqrt
). Встроенные опции Unity гарантируют, что драйвер сможет генерировать гораздо более качественный код. Помните, что операция альфа-тестирования (discard
) часто замедляет работу фрагментного шейдера.
Оптимизированные шейдеры поверхности
Шейдеры поверхностиУпрощенный способ написания шейдеров для встроенного в конвейере рендеринга. Подробнее
См. в Словарь отлично подходят для написания шейдеров, взаимодействующих с освещением. Однако их параметры по умолчанию настроены так, чтобы охватывать большое количество общих случаев. Настройте их для конкретных ситуаций, чтобы шейдеры работали быстрее или, по крайней мере, были меньше:
- Директива
approview
для шейдеров, использующих направление взгляда (например, Specular), нормализует направление взгляда по вершинам, а не по пикселям. Это приблизительно, но часто достаточно. halfasview
для типов шейдеров Specular работает еще быстрее. Половектор (на полпути между направлением освещения и вектором обзора) вычисляется и нормализуется для каждой вершины, а функция освещения получает полувектор в качестве параметра вместо вида. вектор.-
noforwardadd
позволяет шейдеру полностью поддерживать однонаправленный свет в процессе Forward рендеринга отрисовки графики на экран (или в текстуру рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. только в Словарь. Остальные источники света могут по-прежнему иметь эффект как повершинные источники света или сферические гармоники. Это отлично подходит для того, чтобы сделать ваш шейдер меньше и убедиться, что он всегда отображается за один проход, даже при наличии нескольких источников света. -
noambient
отключает окружающее освещение и сферические гармоники в шейдере. Это может немного повысить производительность.
Альфа-тестирование
Фиксированная функция AlphaTest — или ее программируемый эквивалент, clip()
— имеет разные характеристики производительности на разных платформы:
- Как правило, вы получаете небольшое преимущество, используя его для удаления полностью прозрачных пикселей на большинстве платформ.
- Однако на графических процессорах PowerVR в iOSмобильной операционной системе Apple. Подробнее
См. Словарь и некоторые устройства Android, альфа-тестирование требует больших ресурсов. Не пытайтесь использовать его для оптимизации производительности на этих платформах, так как игра будет работать медленнее, чем обычно.
Цветовая маска
На некоторых платформах (в основном это мобильные графические процессоры устройств iOS и Android) использование ColorMask для пропуска некоторых каналов (например, ColorMask RGB
) может требовать значительных ресурсов, поэтому используйте его только в случае крайней необходимости.