Практическая стоимость обмена эффектами

16

Я использую XNA для своих проектов, и на этих форумах я иногда вижу ссылки на тот факт, что замена эффекта на сетку имеет относительно высокую стоимость, что удивляет меня, так как я думал, что обмен эффектами был просто случаем копирования программы замены шейдера в графический процессор вместе с соответствующими параметрами.

Я задавался вопросом, может ли кто-нибудь объяснить точно, что стоит об этом процессе? И поставить, если возможно, «относительно» в контекст?

Например, сказать, что я хотел бы использовать короткий шейдер, чтобы помочь с выбором, я бы:

  1. Измените эффект для каждого объекта, рассчитав уникальный цвет для его идентификации и предоставив шейдеру.
  2. Нарисуйте все объекты для цели рендеринга в памяти.
  3. Получить цвет от цели и использовать его для поиска выбранного объекта.

Какая часть общего времени, необходимого для завершения этого процесса, будет потрачена на замену шейдеров? Мои инстинкты говорили бы, что рендеринг сцены снова, независимо от того, насколько прост шейдер, будет на порядок медленнее, чем любая другая часть процесса, так почему же все заботятся о эффектах?

sebf
источник

Ответы:

21

Проблема, которую вы описываете, не является «особой» проблемой. Нет ничего особенно медленного в изменении эффектов на GPU. Проблема с изменением эффектов, параметров эффектов (включая преобразования), текстур, различных состояний рендеринга и простой отправкой нескольких команд рисования заключается в том, что для этого необходимо отправить в GPU другой пакет .

Пакеты связаны с процессором, и вы можете использовать только несколько тысяч * за кадр .

Это зависит от процессора и от того, какую работу вы выполняете, но, скажем, вы получаете около 1000 пакетов на кадр. Если вы визуализируете один объект в пакете, вы можете нарисовать около 1000 объектов на экране, прежде чем столкнетесь с проблемами.

Если вы неожиданно добавили сбор и вам пришлось визуализировать все ваши объекты дважды, то вы можете рисовать только 500 объектов.

(Так что, если у вас есть только небольшое количество объектов, не беспокойтесь об этом!)

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

Другая техника, особенно подходящая для выбора, заключается в отбраковке визуализированных объектов в программном обеспечении, чтобы вы не рендерили то, что, как вы знаете, не касалось выбранного пикселя.

Вот целая слайд-презентация от NVidia под названием «Batch, Batch, Batch: что это на самом деле означает?» (PDF), который имеет хорошие графики и вещи, объясняющие это. В нем также перечислены некоторые методы для уменьшения количества партий.

Эндрю Рассел
источник
Согласовано! Спасибо за разъяснения и предложения, то, что я читаю, теперь имеет больше смысла. Спасибо также за презентацию NVidia, сейчас я просто читаю ее, и она очень полезна.
sebf
1
Обновлена ​​ссылка на статью «Пакет, партия, партия»: ce.u-sys.org/Veranstaltungen/…
Мартон,
1
Спасибо Мартон, я отредактировал новую ссылку в сообщении :)
Эндрю Рассел