Влияет ли установка одной и той же программы с gl.useProgram дважды подряд на производительность? - PullRequest
0 голосов
/ 30 января 2020

У меня есть 2D-игра, над которой я работаю в webGL, и, за некоторыми исключениями, я использую одну программу по умолчанию для рисования спрайтов на экране. Я вызываю gl.useProgram один раз, при инициализации, и, если мне когда-либо понадобится использовать другую программу, я по окончании сбрасываю программу на значение по умолчанию.

Однако я вижу примеры, когда другие вызывают gl. Используйте ProgramPro каждый раз, когда они рисуют, и, следовательно, по крайней мере, один раз в каждом кадре или, возможно, столько раз, сколько нужно визуализировать четырехугольников, в худшем случае.

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

У меня вопрос, если вы используете gl.useProgram чтобы установить программу для программы, которая уже используется, влияет ли это на производительность, или webGL / javascript по существу "знает", что программа остается неизменной?

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Современный драйвер графического процессора применяет изменения состояния перед выполнением команды рисования, эффективно фильтруя любые промежуточные изменения, которые не имеют побочных эффектов. Поэтому установка одной и той же программы несколько раз вряд ли окажет серьезное влияние. Но установка того же состояния без необходимости приводит к появлению предупреждения об изменении состояния избыточности во многих графических c отладчиках. Это считается нежелательным поведением. После установки программы с помощью gl.UseProgram она останется активной в контексте, пока не будет заменена другой программой или контекст не будет потерян. Даже удаление программы с gl.DeleteProgram не делает недействительной текущую связанную программу.

0 голосов
/ 30 января 2020

Если вы используете gl.useProgram, чтобы установить программу для уже используемой программы, влияет ли это на производительность

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

действительно ли webGL / javascript "знает", что программа остается неизменной?

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

Но, если вас это беспокоит, просто проверьте себя

let globalLastProgram = null

function checkedUseProgram(program) {
  if (globalLastProgram !== program) {
    globalLastProgram = program;
    gl.useProgram(program);
  }
}

Теперь позвоните checkedUseProgram вместо gl.useProgram.

Или, если хотите, оберните useProgram.

WebGLRenderingContext.prototype.useProgram = function(origFn) {
  return function(program) {
    if (this.lastProgram !== program) {
      this.lastProgram = program;
      origFn.call(this, program);
    }
  };
}(WebGLRenderingContext.prototype.useProgram);

Если вам не нравится lastProgram в контексте, вы можете сделать упаковочную функцию

function addWrapper(gl) {
  gl.useProgram = function(origFn) {
    let lastProgram;

    return function(program) {
      if (lastProgram !== program) {
        lastProgram = program;
        origFn.call(this, program);
      }
    };
  }(gl.useProgram);
}

addWrapper(gl);

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

...