从 HTMLVideoElement 更新 WebAssembly 中的 WebGL 纹理
Updating WebGL Textures in WebAssembly from HTMLVideoElement
我有一个project* in which I play two videos, run a simple shader that shows edges and blends them, and display the result in a canvas. The project is based on this tutorial。我试图实现的目标是了解 运行ning 在 JS 和 WebAssembly 上是否比仅在 JS 中运行 WebGL 更快,但目前我在每一帧上都在 JS 和 WebAssembly 之间切换,这似乎非常贵。
在每一帧中,代码将每个 HTMLVideoElement 的内容复制到 JS 中的 WebGL 纹理中:
export function updateTexture(gl, texture, video) {
const level = 0;
const internalFormat = gl.RGBA;
const srcFormat = gl.RGBA;
const srcType = gl.UNSIGNED_BYTE;
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(
gl.TEXTURE_2D,
level,
internalFormat,
srcFormat,
srcType,
video
);
}
然后调用 WebAssembly 来处理纹理的内容。
现在,我看到纹理复制的时间成本相当昂贵,如果我对系统的理解正确,那么在 JS 和 WASM 之间不断切换也是有成本的。
有没有办法在WASM中复制当前的视频帧,以节省JS和WASM之间的来回?我看到的唯一方法是添加编解码器的使用,我想继续使用更高级别的接口。
*如果要运行项目,请调用'grunt exec'、'npm run copy-assets'、'npm run dev'。使用 'texture-copying' 分支。
我发现编译为 Asm.JS 而不是 WASM 可以消除上下文切换的成本,从而解决了我的问题。
这不是一个完美的解决方案,但它仍然提供了比 JS 更好的性能。
我有一个project* in which I play two videos, run a simple shader that shows edges and blends them, and display the result in a canvas. The project is based on this tutorial。我试图实现的目标是了解 运行ning 在 JS 和 WebAssembly 上是否比仅在 JS 中运行 WebGL 更快,但目前我在每一帧上都在 JS 和 WebAssembly 之间切换,这似乎非常贵。
在每一帧中,代码将每个 HTMLVideoElement 的内容复制到 JS 中的 WebGL 纹理中:
export function updateTexture(gl, texture, video) {
const level = 0;
const internalFormat = gl.RGBA;
const srcFormat = gl.RGBA;
const srcType = gl.UNSIGNED_BYTE;
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(
gl.TEXTURE_2D,
level,
internalFormat,
srcFormat,
srcType,
video
);
}
然后调用 WebAssembly 来处理纹理的内容。 现在,我看到纹理复制的时间成本相当昂贵,如果我对系统的理解正确,那么在 JS 和 WASM 之间不断切换也是有成本的。
有没有办法在WASM中复制当前的视频帧,以节省JS和WASM之间的来回?我看到的唯一方法是添加编解码器的使用,我想继续使用更高级别的接口。
*如果要运行项目,请调用'grunt exec'、'npm run copy-assets'、'npm run dev'。使用 'texture-copying' 分支。
我发现编译为 Asm.JS 而不是 WASM 可以消除上下文切换的成本,从而解决了我的问题。 这不是一个完美的解决方案,但它仍然提供了比 JS 更好的性能。