【Unity】 Spicy Pixel Concurrency Kitを使ってみた ①

別スレッドからUnity APIが呼べるらしいアセット、Spicy Pixel Concurrency Kitを使ってみた。

とりあえず使ってみて分かったことをここに書き留めておく。

結論から言うと、やっぱり別スレッドからはUnity APIは呼べないので、
一時的にメインスレッドから呼ぶようにして擬似的にそうしているっぽい且つそれをラクにしてくれるアセット。

正直リファレンスなどを見ても、内部的にどういう仕組みで動いてるのか良く分からなかった。
スレッドプログラミングの根底の知識をきちんと理解する必要がある。

ただ自分が検証したコードがおかしいかもしれないし、正しい使い方があるかもしれないので
そこはご了承いただきたい。むしろ正しい使い方を教えてほしいw


まず、テラシュールさんのこの記事のコード、現Ver.だとコンパイルが通らないので
若干仕様が変わったのだと思われる。

現Ver.のこのアセットの使い方はこんな感じ。

①MonoBehaviourの代わりにConcurrencyBehaviourを継承する

taskFactory.StartNewメソッドを使う


これだけ。


まずサンプルソースの以下の部分がこのアセットの主な説明になっている。
(多少コメントやログを挟んで書き換えた)

    // This method demonstrates running tasks using the ConcurrentBehaviour's scheduler.
// These tasks are tied to the lifetime of the behaviour.
Task RunWithConcurrentBehaviourScheduler()
{
return taskFactory.StartNew(() =>
{
Debug.Log( "<--- main thread part --->" );

Thread.Sleep(2000); // ブロッキング
})
// Uses the concurrent behaviour's scheduler
.ContinueWith((antecedent) =>
{
Debug.Log( "<--- other thread part --->" );

//float time = Time.realtimeSinceStartup; // UnityAPIが呼べない

Thread.Sleep(2000); // ブロッキングしない
})
// Uses the default thread pool scheduler
.ContinueWith((antecedent) =>
{
Debug.Log( "<--- main thread part --->" );

Thread.Sleep(2000); // ブロッキング

}, taskScheduler);
}


どうもContinueWithの引数にtaskSchedulerを指定するとメインスレッド、
指定しないと内部で生成されている別スレッドで処理されている
模様。

なので、このConcurrencyBehaviourクラスを継承すると、自分でスレッドを作成せずに
スレッドに任せたい処理を書けるようだ。

だがUnity APIは呼べない。

なので用途としては、Unity APIが必要な処理と、そうでない計算だけの処理に分けて
上手く分散してやる必要がある。



このクラスを継承すると、基底のAwake部分でtaskFactoryメンバなどが初期化されているようなので
Awakeを書く場合はvirtualで書いてやる必要がある。

    // Awake
public virtual void Awake()
{
base.Awake(); // 基底のAwake。これをしないとtaskFactoryなどが初期化されない。

// アプリ側でAwakeで書きたい処理
}



②に続く。

[ 2013年10月20日 17:10:30 : Unity ]

カレンダー

プルダウン 降順 昇順 年別

06月 | 2020年07月 | 08月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


全記事表示リンク

全ての記事を表示する

検索フォーム

リンク