dasukoの技術ブログ

現役エンジニアのブログです。

【Unity】ThreadPoolを使ってみた

Unity(C#)でC#標準ライブラリのThreadPoolを使ってみました。

UnityのAPIのほとんどはメインスレッドから実行する必要があるので、注意が必要ですが、

重たい処理を実行するときは、できればスレッドを使いたいです。

そんな時にTaskを使うのもいいですが、ThreadPoolを使いましょう。

ThreadPoolはスレッドをより効率的に使うことができるにした機能です。

多くのアプリケーションでは、スリープ状態に非常に多くの時間を費やし、イベントが発生するのを待機しているスレッドを作成します。 その他のスレッドは、定期的にスリープ状態にならないようにして、変更または更新状態情報をポーリングすることができます。 スレッドプールを使用すると、システムによって管理されるワーカースレッドのプールをアプリケーションに提供することで、スレッドをより効率的に使用できます。

下記より引用 ThreadPool クラス (System.Threading) | Microsoft Docs

実装

では実装して実行してみます。

using UnityEngine;
using System.Threading;

public class ThreadPoolSample : MonoBehaviour
{
    void Start()
    {
        ThreadPool.QueueUserWorkItem(DoSomething);
    }

    static void DoSomething(object state)
    {
        Debug.Log("This method runs in background thread.");
    }
}

このスクリプトをGameObjectにアタッチして実行すると、"This method runs in background thread."がログに出力されます。

(最新のUnityだとDebug.Logはメインスレッドから実行しなくても大丈夫なようです)

DoSomethingメソッドに引数があります。

ThreadPoolのQueueUserWorkItemメソッドには第二引数にobjectを渡すことができ、

これをDoSomethingメソッドの引数に渡すことができます。

  

ちなみにスレッド内でメインスレッドで実行したい処理があった場合は、

ラムダをQueueに積んで、Updateメソッド内から取り出すことによりメインスレッドから実行できます。

参考

ThreadPool クラス (System.Threading) | Microsoft Docs