KHR_parallel_shader_compile 扩展
KHR_parallel_shader_compile
扩展是 WebGL API 的一部分,它启用了一个非阻塞轮询操作,以便可以在不产生潜在停顿的情况下查询编译/链接状态可用性 (COMPLETION_STATUS_KHR
)。换句话说,您可以检查着色器编译的状态,而不会阻塞运行时。
可以使用 WebGLRenderingContext.getExtension()
方法获得 WebGL 扩展。有关更多信息,请参阅 使用扩展,该内容位于 WebGL 教程 中。
常量
ext.COMPLETION_STATUS_KHR
-
一个 GLenum。
示例
启用扩展
js
const ext = gl.getExtension("KHR_parallel_shader_compile");
一般来说,无论是否使用扩展,最佳实践都是
js
// Assuming lists of `shaders` and `programs`:
for (const x of shaders) gl.compileShader(x); // Never check compile status unless subsequent linking fails.
for (const x of programs) gl.linkProgram(x);
使用扩展后,应用程序将能够轮询程序是否已链接,而不会出现卡顿,但这些程序的总链接时间可能相同
js
// Generator yielding a progress ratio [0.0, 1.0].
// Without the extension, this will jank and only check one program per generation.
function* linkingProgress(programs) {
const ext = gl.getExtension("KHR_parallel_shader_compile");
let todo = programs.slice();
while (todo.length) {
if (ext) {
todo = todo.filter(
(x) => !gl.getProgramParameter(x, ext.COMPLETION_STATUS_KHR),
);
} else {
const x = todo.pop();
gl.getProgramParameter(x, gl.LINK_STATUS);
}
if (!todo.length) return;
yield 1.0 - todo.length / programs.length;
}
}
规范
规范 |
---|
WebGL KHR_parallel_shader_compile 扩展规范 |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。