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 扩展规范

浏览器兼容性

另见