Установите униформу, используя форму [1234] [uif] в программе WebGL: лучше ли векторная версия [v] в любом отношении? - PullRequest
0 голосов
/ 28 июня 2018

Есть ли какое-либо существенное преимущество / недостаток при установке униформ программы WebGL с использованием uniform[1234][uif][v] с типом массива вместо простого uniform[1234][uif] + расширения аргументов, например. :

gl.uniform3f (location, v0, v1, v2);   // GLSL type: vec3
// vs
gl.uniform3fv(location, [v0, v1, v2]); // GLSL type: vec3 (or vec3[] array)

Очевидно, откладывая тот факт, что одна версия метода обрабатывает массивы.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Версия массива немного медленнее сама по себе . Цитирование идеи WebGL (стр. 19),

Например, сравнивая uniform4f до uniform4fv вместо uniform1f, мы обнаружил, что uniform4fv медленнее, чем uniform4f во всех браузеры, которые мы пробовали, несмотря на то что uniform1f делает. Это связано с тем, что uniform4fv имеет по своей природе больше работы, чем uniform4f, поскольку он может обрабатывать произвольная загрузка равномерного массива.

По сути, необходимость проверки того, является ли ввод массивом (а затем проверка его типов элементов), типизированного массива и т. Д., Теряет производительность, полученную при передаче меньшего количества параметров.

Тем не менее, это в основном означает, что вы должны использовать то, что соответствует вашим данным, поскольку распаковка существующего массива может перевесить преимущества (хотя вы можете проверить его).

0 голосов
/ 29 июня 2018

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

Допустим, вы создали такой вектор

 const v = {x: 1, y: 2, z: 3}

Теперь, когда придет время использовать его с gl.uniform, вы можете сделать любой из этих

 gl.uniform3f(loc, v.x, v.y, v.z);
 gl.uniform3fv(loc, [v.x, v.y, v.z]);

В этом случае первое лучше, потому что второе создает новый массив каждый раз, когда выполняется эта строка.

С другой стороны, если вы создадите такой вектор

 const v = [1, 2, 3];

Тогда

 gl.uniform3f(loc, v[0], v[1], v[2]);
 gl.uniform3fv(loc, v);

Ясно, что второе лучше.

С ES5 у вас есть еще одна опция, которая

 gl.uniform3f(loc, ...v);

Я не знаю, быстрее это или медленнее, чем gl.uinform3fv(loc, v). Я подозреваю, что это медленнее сегодня, но может быть такой же скоростью в будущем. Поскольку у вас есть gl.uinform3fv, на самом деле нет причин использовать этот стиль. Это может быть полезно для других функций, хотя у них нет формата, который принимает массив. Примеры

 const color = [1, 0, 0, 1];

 gl.clearColor(...color);
...