Если вы используете 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);
Конечно, все они также будут иметь крошечное влияние, хотя я подозреваю, что это трудно измерить