Desenvolver jogos 3D usando WebAssembly com WebGL é possível, se pudermos passar o array C++ para a API WebGL sem copiar o array.
Precisamos passar os dados do array para WebGLRenderingContext.bufferData() , mas ele só aceita JavaScript ArrayBuffer ou ArrayBufferView . Se aceitar array C++, ou se pudermos criar ArrayBufferView sem copiar os dados do array, então está resolvido.
Acho que as associações de host, referência e/ou propostas de GC permitirão que instâncias do WebAssembly criem ArrayBufferViews diretamente (que poderiam ser passados para o WebGL).
Isso já funciona hoje. As funções WebGL aceitam um ArrayBufferView, e é possível criar tal visualização em uma memória WebAssembly. Basicamente você cria uma visão de array tipada no ArrayBuffer da Memória, e então faz um .subarray
(as ligações emscripten GL fazem isso, por exemplo ).
Isso funciona se os dados estiverem vazios na memória. Para uma matriz C ou um C++ std::vector
esse é o caso. Portanto, enviar arrays C++ para WebGL já é como as coisas funcionam hoje, na maioria dos casos.
Isso depende de passar pelo JS atm, como naquele link anterior. Mas nenhuma cópia é criada lá! (Pular o JS também seria bom, como um assunto separado, e sim, novas especificações permitirão isso, como Tipos de Interface, como @Macil mencionou.)
Parece que a preocupação foi respondida, então fechando. Por favor, reabra caso contrário.
Comentários muito úteis
Isso já funciona hoje. As funções WebGL aceitam um ArrayBufferView, e é possível criar tal visualização em uma memória WebAssembly. Basicamente você cria uma visão de array tipada no ArrayBuffer da Memória, e então faz um
.subarray
(as ligações emscripten GL fazem isso, por exemplo ).Isso funciona se os dados estiverem vazios na memória. Para uma matriz C ou um C++
std::vector
esse é o caso. Portanto, enviar arrays C++ para WebGL já é como as coisas funcionam hoje, na maioria dos casos.Isso depende de passar pelo JS atm, como naquele link anterior. Mas nenhuma cópia é criada lá! (Pular o JS também seria bom, como um assunto separado, e sim, novas especificações permitirão isso, como Tipos de Interface, como @Macil mencionou.)