DOTS Инстансирование шейдеров в URP
Для эффективного отображения большого количества экземпляров, BRG использует новый режим инстанционирования шейдера, называемый DOTS Instancing. Каждый шейдер, который использует BRG, должен поддерживать DOTS Instancing. В традиционных инстанционных шейдерах, шейдеру передается массив для каждого инстанционированного свойства в постоянном или унифицированном буфере, так что каждый элемент в каждом массиве содержит значение свойства для одного экземпляра в рисунке. В DOTS Инстанционных шейдерах, Unity передает 32-битное целое число шейдеру для каждого DOTS Инстанционного свойства. Это 32-битное целое число называется значением метаданных. Это целое число может представлять любое значение, но обычно оно представляет смещение в буфере, из которого шейдер загружает данные свойств для экземпляра, который он отображает.
DOTS Создание экземпляров имеет много преимуществ по сравнению с традиционным созданием экземпляров, включая следующие:
- Данные экземпляра хранятся в GraphicsBuffer и остаются постоянными на GPU, что означает, что Unity не нужно устанавливать их снова каждый раз, когда он рендирует экземпляр. Настройка данных только при фактическом изменении экземпляра может значительно повысить производительность в случаях, когда данные экземпляра изменяются редко или вообще не изменяются. Это намного эффективнее, чем традиционное инстансирование, которое требует от движка устанавливать все данные для каждого экземпляра каждый кадр.
- Настройка данных экземпляров отделена от настройки вызова отрисовки. Благодаря этому настройка вызова отрисовки остаётся лёгкой и эффективной. BRG добивается этого с помощью специального быстрого пути SRP Batcher, который выполняет для каждого вызова отрисовки лишь минимум работы. Ответственность за эту работу переходит к вам и даёт больше контроля над тем, что отрисовывается в каждом вызове.
- Размер вызова отрисовки больше не ограничен объёмом данных экземпляров, помещающимся в константный или uniform-буфер. Это позволяет BRG отрисовывать больше экземпляров одним вызовом отрисовки.
Примечание: количество индексов экземпляров по-прежнему ограничивает размер вызова отрисовки, поскольку каждому индексу нужны какие-то данные. Однако индекс занимает гораздо меньше памяти, чем полный набор инстансированных свойств, а значит, в константный или uniform-буфер помещается намного больше экземпляров. Например, каждому индексу нужно 16 байт, поэтому если предел памяти буфера на конкретной платформе составляет 64 КБ, в буфер поместится 4096 индексов. - Если каждый экземпляр использует одно и то же значение для данного свойства, то можно запустить все экземпляры с загрузкой значения из одного и того же места в памяти. Это экономит память и количество циклов GPU, потраченных на дублирование значения для каждого экземпляра.