テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unityでスレッドを使う

以前「Unityはスレッドを使えない」といった話を聞いたので、念のため確認してみた。

■Unityの非同期処理

Unityは基本的に非同期の処理をコルーチンで処理している。ただし、コルーチンは基本的に同期処理なので(例えばI/O処理等)すごく時間がかかる処理に使う場合は注意が必要になる。

[Unity3D]Unity非同期処理デザインについて
http://terasur.blog.fc2.com/blog-entry-290.html



■Unityでスレッドを使う

さて、Unityのスレッドだが、単純な計算に用いるなら.NET 2.0以前の機能のため普通に使える。もちろんiOSや(多分)Androidでも同様に使用出来ると思う。

using UnityEngine;
using System.Collections;
using System.Threading;

public class ThreadTest : MonoBehaviour {
Thread thread;
int count = 0;

public int Count{
get{
lock( sync ){
return count;
}
}
}

Object sync = new Object();

void Start () {
thread = new Thread(ThreadWork);
thread.Start();
}

void OnApplicationQuit() {
if( thread != null)
thread.Abort();
}

void OnGUI(){
GUILayout.Label(Count.ToString());
}

void ThreadWork(){
while(true){
Thread.Sleep(0);
lock(sync){
count += 1;
}
}
}
}

勿論、使う場合はデッドロックやら何やらに注意する必要がある。また(特に物理演算系の処理は)Unityが実行中のパラメータを勝手に書き換えてしまうので注意が必要だと思う。

■Unityの提供しているAPIは使用できない

なんだ楽勝じゃん(ヒャッホウ!)と思いたいが、そうは問屋が卸さない。
どうもResourcesやTextureLoad等の特定のAPIは別スレッドから呼べない仕組みになっているらしい。(Async系の処理がPro版で軒並み追加されるので、そのせいかも)

もしくは、Unityの「難しいところを隠蔽して簡単に見せる」思想的に、スレッドは隠蔽されるべきと判断されたのかもしれない。非同期処理を事故った時の手間は同期処理の比じゃないし。



とは言え、マルチコア環境だとスレッドを利用したほうが効率的に処理できるとの噂もあるので、AIとか情報整理とかの処理にスレッドを使ってみようと思ってたり。
その前に実際に速度の差がでるかどうかテストか。