概要
Unity6でWebGL周りの機能が増えてきました
その中にこんなものがあります
私たちはまた、C と C++ のマルチスレッドもミックスし、ブラウザ内でのネイティブコードのパフォーマンスをさらに向上させる可能性を広げています。
てっきり自分はC#で書いたものも、うまいことC++周りに変換されてマルチスレッドが使えると思ってたけど違った
実験
こんな感じのマルチスレッドをテストするスクリプトを作ってみた
using System.Threading;
using UnityEngine;
using TMPro;
public class ThreadTest : MonoBehaviour
{
private int _count = 0;
[SerializeField] private TMP_Text text;
Thread thread;
void Start()
{
thread = new Thread(() =>
{
while (_count < 1000)
{
Debug.Log("Thread: " + _count);
_count++;
Thread.Sleep(1000);
}
});
thread.Start();
}
void Update()
{
text.text = "Count: " + _count;
}
void OnDestory()
{
thread.Abort();
}
}
エディタやMacビルドだとちゃんとカウントアップしていく
Unity6とUnity2022.3.54でWebGLビルドしてみたがカウントアップしない
(ビルド時にPlayer SettingsのEnable Native C/C++ Multithreading
をtrueにしている)
やはりマルチスレッドは機能しないようだ
有効にすると、ネイティブ Unity C/C++ エンジン コードは WebAssembly/SharedArrayBuffer マルチスレッド (実験的) をターゲットにします。これにより、WebAssembly 言語標準のさらなる進歩が必要となるため、C# コードのマルチスレッドは有効になりません。このオプションを有効にすると、WebAssembly 2023 のサポートが含まれます。(推奨: 無効。この機能は、将来の Web 機能の評価に関心のある上級ユーザー向けに提供されています)
なるほど。
SharedArrayBufferとは、スレッド間で値を共有するための機能らしい
いつかC#のマルチスレッドが対応されることを祈ります