8.2. Анализ производительности Разработанный по всем правилам шейдер может быть или не быть эффективным по времени выполнения. Рассмотрим некоторые приемы улучшения производительности хорошо сделанного шейдера.

8.2.1. Частота вычислений Вычисления могут выполняться в трех местах: на основном процессоре, на вершинном процессоре и на фрагментном процессоре. Привлекательным было бы выполнять большинство вычислений во фрагментном тендере, поскольку он работает с каждым нарисованным пикселом, и поэтому картинка получается самого лучшего качества. Но если важна производительность, можно выполнять те же вычисления не во фрагментном, а в вершинном шейдере и получить приемлемое качество изображения, В результате фрагментный шейдер становится более быстрым. В некоторых случаях нет ощутимых различий между выполнением вычислений в вершинном шейдере или тех же вычислений во фрагментном шейдере, например, при вычислении эффекта дымки.

Один из способов улучшить производительность - реализовывать эффекты с. быстро меняющимися характеристиками во фрагментном шейдере, а эффекты с плавно меняющимися характеристиками - в вершинном. Например, рассеянное освещение меняется плавно, так что можно вычислить его с приемлемым качеством в вершинном шейдере. Отражение, наоборот, надо рассчитывать во фрагментном шейдере, чтобы добиться хорошего качества. Общее правило таково: при плавном изменении характеристик можно использовать и значения, интерполированные между вершинами, в этом случае качество особо не пострадает. Фрагментный шейдер обычно выполняется большее количество раз, чем вершинный, за ис8,2. Анализ производительности хлючением случаев, когда выполняется рендеринг очень маленьких треугольников; так что будет разумным часть вычислений перенести в вершинный шейдер.

Есть вычисления, которые можно выполнить один раз на обычном процессоре, - их результаты остаются постоянными для множества запусков и вершинного, и фрагментного шейдеров. За счет этого можно сэкономить память для хранения команд шейдера или улучшить производительность (или и то и другое), вычисляя некоторые значения заранее с помощью приложения и передавая их в шейдер через uniform-переменные. Зачастую такие вычисления можно распознать, анализируя код шейдера. Допустим, 1 ength передается как uniform-переменная, и шейдер всегда вычисляет sqrt ( 1 ength ), так что выгоднее вычислить это значение заранее и передать в шейдер. Если шейдеру нужны и length и sqrt (1 ength), эти значения можно передавать как два отдельных параметра.


⇐ Предыдущая| |Следующая ⇒