如果我们可以在不复制数组的情况下将 C++ 数组传递给 WebGL API,那么使用 WebAssembly 和 WebGL 开发 3D 游戏是可以实现的。
我们需要将数组数据传递给 WebGLRenderingContext.bufferData() ,但它只接受 JavaScript ArrayBuffer 或 ArrayBufferView 。 如果它接受 C++ 数组,或者如果我们可以创建 ArrayBufferView 而不复制数组数据,那么它就解决了。
我认为主机绑定、参考和/或 GC 提案将允许 WebAssembly 实例直接创建 ArrayBufferViews(然后可以传递给 WebGL)。
这已经在今天有效。 WebGL 函数接受 ArrayBufferView,并且可以在 WebAssembly 内存上创建这样的视图。 基本上,您在内存的 ArrayBuffer 上创建一个类型化的数组视图,然后执行.subarray
(例如,emscripten GL 绑定执行此操作)。
如果数据在内存中是平坦的,则此方法有效。 对于 C 数组或 C++ std::vector
就是这种情况。 因此,在大多数情况下,将 C++ 数组发送到 WebGL 已经是当今的工作方式。
这确实取决于通过 JS atm,就像之前的那个链接一样。 但是那里没有创建副本! (跳过 JS 也很好,作为一个单独的问题,是的,新规范将允许这样做,就像@Macil提到的接口类型一样。)
似乎这个问题得到了回答,所以关闭了。 否则请重新打开。
最有用的评论
这已经在今天有效。 WebGL 函数接受 ArrayBufferView,并且可以在 WebAssembly 内存上创建这样的视图。 基本上,您在内存的 ArrayBuffer 上创建一个类型化的数组视图,然后执行
.subarray
(例如,emscripten GL 绑定执行此操作)。如果数据在内存中是平坦的,则此方法有效。 对于 C 数组或 C++
std::vector
就是这种情况。 因此,在大多数情况下,将 C++ 数组发送到 WebGL 已经是当今的工作方式。这确实取决于通过 JS atm,就像之前的那个链接一样。 但是那里没有创建副本! (跳过 JS 也很好,作为一个单独的问题,是的,新规范将允许这样做,就像@Macil提到的接口类型一样。)