Почему Metal замедляется, когда увеличивается число аргументов фрагментного шейдера? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть очень простой фрагментный шейдер, который принимает массив текстур массивов, определенных следующим образом:

fragment float4 shader(RasterizerData in [[ stage_in ]],
                       sampler sampler2d [[ sampler(0) ]],
                       const array<texture2d_array<half>, 5> textures [[ texture(0) ]]) {

  return float4(textures[in.textureIndex].sample(sampler2d, in.textureCoordinate, in.textureSlice));
}

Я хотел бы передать переменное количество текстур этому шейдеру.Каждая текстура является текстурой массива, а каждая текстура массива имеет свой размер.(Поэтому я не могу просто передать текстуру одного массива.)

В приведенном выше коде я произвольно определил размер массива как 5, потому что обычно у меня есть только 1 текстура.Если у меня меньше 5 текстур, индексы фрагментов не установлены в коде моего приложения.

Код моего приложения похож на этот:

for (int i = 0; i < textures.size(); ++i) {
  [renderEncoder setFragmentTexture:textures[i] atIndex:i];
}

При размере массива 5 производительность в порядке.Однако, если единственное изменение, которое я сделаю, это переопределение размера массива до 64 в шейдере, то общая производительность рендеринга резко упадет.Никаких других изменений не сделано, что означает, что большинство индексов текстур фрагментов не установлены.

Почему это изменение так сильно влияет на производительность?

Отладчик графического процессора показывает, что большую часть времени проводит в кодировщике моего рендера drawIndexedPrimitives.(24,04 мс) Когда я объявляю гораздо меньший размер массива, я могу легко достичь 60fps.

В macOS 10.14, MacBook Pro 13 "TB 2016.

...