最近、一部のプロジェクトでWebAssemblyの使用を開始しました。WasmはjavaScriptより速いと聞いたので、これを行っています。
実際に最初のWasmプロジェクトを開始したとき、C ++でDOMを操作する方法がわからないことに気付きました。
Wasmを使用してこれを行う方法はありますか?
最近、一部のプロジェクトでWebAssemblyの使用を開始しました。WasmはjavaScriptより速いと聞いたので、これを行っています。
実際に最初のWasmプロジェクトを開始したとき、C ++でDOMを操作する方法がわからないことに気付きました。
Wasmを使用してこれを行う方法はありますか?
回答:
最近、一部のプロジェクトでWebアセンブリの使用を開始しました。wasmはjavascriptより速いと聞いたので、これを行っています。
WebAssemblyはJavaScriptよりも高速ですが、特定のユースケースに限られます。WebAssemblyを使用すると、ブラウザーはコードのダウンロードとコンパイルに必要な作業が少なくなり、起動時間が短縮されます。ただし、WebAssemblyの実行時のパフォーマンスは、通常、JavaScriptの2〜3倍しかない場合。非常に優れた実用的な比較については、次の記事を参照してください。
https://hacks.mozilla.org/2018/01/oxidizing-source-maps-with-rust-and-webassembly/
ただし、WebAssemblyには直接DOMアクセスがないため、その優れたパフォーマンスにもかかわらず、余分なI / Oオーバーヘッドのために、ユースケースでJavaScriptよりも遅い場合があります。
このため、現在、人々はアルゴリズム/計算集約型のタスクでWebAssemblyを使用して最も成功しています。
私はc ++でdomを操作する方法を知らないことに気付きました。wasmを使用してこれを行う方法はありますか?
DOMを操作するには、JavaScriptホストを介してこれを行う必要があります。WebAssemblyモジュールは、代わりにDOMを操作するように要求するメッセージをJavaScriptに送信する必要があります。
これは非常に一般的な課題であるため、問題を解決するさまざまなコミュニティプロジェクトがあります。C ++を使用しているので、これは興味深いかもしれません。
https://github.com/mbasso/asm-dom
将来的には、これがより簡単になるでしょう。インターフェースタイプなどの提案により、ホスト環境との相互運用が容易になり、WebAssemblyから直接Web APIを呼び出すことができるようになります。
残念ながら、DOMにはブラウザーのメインJavaScriptスレッド内でのみアクセスできます。Service Workers、Web Workers、およびWeb AssemblyモジュールはDOMアクセスを持ちません。WASMから取得する最も近い操作は、Preact / React などの状態ベースのUIコンポーネントを使用してメインスレッドに渡され、メインスレッドによってレンダリングされる状態オブジェクトを操作することです。
JSONシリアル化は、postMessage()
またはBroadcast Channelsで状態を渡すために最もよく使用されます。Transferrable
JSONのシリアル化/非シリアル化のオーバーヘッドを回避するよりパフォーマンスの高いメッセージのために、ビットパッキングまたはバイナリオブジェクトをArrayBuffers と共に使用できます。