Design: 在不复制的情况下将 C++ 数组传递给 WebGL

创建于 2019-12-18  ·  3评论  ·  资料来源: WebAssembly/design

如果我们可以在不复制数组的情况下将 C++ 数组传递给 WebGL API,那么使用 WebAssembly 和 WebGL 开发 3D 游戏是可以实现的。

我们需要将数组数据传递给 WebGLRenderingContext.bufferData() ,但它只接受 JavaScript ArrayBuffer 或 ArrayBufferView 。 如果它接受 C++ 数组,或者如果我们可以创建 ArrayBufferView 而不复制数组数据,那么它就解决了。

最有用的评论

这已经在今天有效。 WebGL 函数接受 ArrayBufferView,并且可以在 WebAssembly 内存上创建这样的视图。 基本上,您在内存的 ArrayBuffer 上创建一个类型化的数组视图,然后执行.subarray例如,emscripten GL 绑定执行此操作)。

如果数据在内存中是平坦的,则此方法有效。 对于 C 数组或 C++ std::vector就是这种情况。 因此,在大多数情况下,将 C++ 数组发送到 WebGL 已经是当今的工作方式。

这确实取决于通过 JS atm,就像之前的那个链接一样。 但是那里没有创建副本! (跳过 JS 也很好,作为一个单独的问题,是的,新规范将允许这样做,就像@Macil提到的接口类型一样。)

所有3条评论

我认为主机绑定、参考和/或 GC 提案将允许 WebAssembly 实例直接创建 ArrayBufferViews(然后可以传递给 WebGL)。

这已经在今天有效。 WebGL 函数接受 ArrayBufferView,并且可以在 WebAssembly 内存上创建这样的视图。 基本上,您在内存的 ArrayBuffer 上创建一个类型化的数组视图,然后执行.subarray例如,emscripten GL 绑定执行此操作)。

如果数据在内存中是平坦的,则此方法有效。 对于 C 数组或 C++ std::vector就是这种情况。 因此,在大多数情况下,将 C++ 数组发送到 WebGL 已经是当今的工作方式。

这确实取决于通过 JS atm,就像之前的那个链接一样。 但是那里没有创建副本! (跳过 JS 也很好,作为一个单独的问题,是的,新规范将允许这样做,就像@Macil提到的接口类型一样。)

似乎这个问题得到了回答,所以关闭了。 否则请重新打开。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mfateev picture mfateev  ·  5评论

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6评论

spidoche picture spidoche  ·  4评论

chicoxyzzy picture chicoxyzzy  ·  5评论

bobOnGitHub picture bobOnGitHub  ·  6评论