目次
はじめに
先日、Unity 2019.1 がリリースされ話題となりました。そこには「マルチスレッドサポート(”WebGL: Added experimental multi-threading support.”)」の1文があり気になったため動作を確認してみました。パフォーマンスの確認は行えなかったので飛ばし記事ですが皆さまの参考になればと思います。
このリリースでは、PlayerSettings.WebGL.threadsSupportを介して有効にできる、実験的なWebAssemblyマルチスレッドも導入しました。
—
In this release, we also introduce experimental WebAssembly multithreading, which can be enabled via PlayerSettings.WebGL.threadsSupport.
https://blogs.unity3d.com/jp/2019/04/16/introducing-unity-2019-1/#webgl
Unityを知らない方は、ぜひ こちらの記事 をご参照ください。
何ができるのか?
おそらく、パフォーマンスが改善すると思われます。
実証ソースコードで確認できなかったため、確認できた方がいれば教えていただければありがたいです。
マルチスレッドにより、内部のネイティブエンジンスレッドが有効になり、AI、アニメーションなどのシステムがワーカースレッドによって実行されるジョブを分散できるようになります。
https://forum.unity.com/threads/2019-1.597238/
使い方
基本的には、フォーラムでの使い方の説明に沿っていますので不明点等があればフォーラムをご確認ください。
プレイヤー設定の変更
フォーラムを読んでいると「 PlayerSettings.WebGL.threadsSupport 」の設定変更が必要なのですが、プレイヤー設定画面には設定が存在しません。
実はこの設定はスクリプトからのみ可能となります。
以下の、スクリプトを Editor/EnableThreads に作成しましょう。
※必ず、Editorフォルダ以下に作成してください。
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
class EnableThreads
{
static EnableThreads()
{
PlayerSettings.WebGL.linkerTarget = WebGLLinkerTarget.Wasm;
PlayerSettings.WebGL.threadsSupport = true;
PlayerSettings.WebGL.memorySize = 512;
}
}
上記のスクリプトを作成すると、自動的に Unity の設定が変更になります。
ブラウザの設定変更(Firefoxの場合)
Firefox の場合は、アドレスバーに「about:config」と入力し、「javascript.options.shared_memory」の値を有効にしましょう。
ブラウザの設定変更(Chromeの場合)
Chromeの場合は、アドレスバーに「chrome://flags」と入力して、「enable-webassembly-threads」と「shared-array-buffer」の設定を有効にしましょう。
動作確認
Firefox / Chrome のどちらでも同じ表示がでるかと思います、以下のデモで確認できるのでぜひ試してみてください。
- スレッド無効:http://www.fast-system.jp/wp-content/uploads/static/unity-webgl-multi-threads/0_none_setting/
- スレッド有効:http://www.fast-system.jp/wp-content/uploads/static/unity-webgl-multi-threads/1_multi_threads/
通常との違いとしては、「threads.wasm.memory.unityweb」が追加で読み込まれている。ログとして「Preallocating 1 workers for a pthread spawn pool.」の表示が追加されましたので正常に動作しているようです。