はじめに
UniTaskとUnityに既存であるTaskとの違いメモ。
詳細テーブル
Task | UniTask | |
---|---|---|
機能 | Unityでは不要な機能が多い | Unityで活用できる機能のみ実装 |
オブジェクトサイズ | 大きい | 小さい |
実行コンテキストの管理 | TaskScheduler、SynchronizationContext | UnityのPlayerLoop |
必要なC# Version | C# 5.0以上 | C# 7.0以上 |
TaskTracker | なし | UnityEditorで確認可能 |
メモリアロケーション | 常にヒープ | ゼロアロケーションで駆動する |
await時の制約 | なし | 同じUniTaskに対して2回awaitできない |
Task
- メインスレッドを動かしたまま、裏で通信を走らせたい時に使用できる。
- 複数の処理を同時に実行して、完了までの時間を短縮したい時に使用する。
- 描画には関係ない処理をメインスレッドから追い出して、動作の軽量化を図りたい時に使用する。
UniTask
- UniTaskとはUnity向けに最適化されたTask実装を提供するライブラリ郡。
- Unity向けTask実装「UniTask/UniTask」。
- UniTaskの稼働状況をモニタできる「UniTaskTracker」。
- Unity向けIAsyncEnumerable実装「UniTaskAsyncEnumerable」。
- 名前空間「Cysharp.Threading.Tasks」
TaskScheduler / SynchronizationContext
- TaskSchedulerは、タスクと実際にタスクを実行するスレッドと間の調整をします。調整とはタスクをどのスレッドに割り当てるか、あるいはタスクを実行する順番を管理すること。
- SynchronizationContextは、「指定した処理を指定したスレッドで実行するために用いるオブジェクト」。
TaskTracker
- Taskをチェックするツール。トラッキングを有効にしてスタックトレースを取得することは有用ですが、パフォーマンスに大きな影響を与えます。推奨される使い方は、タスクリークを見つけるためにトラッキングとスタックトレースの両方を有効にし、完了したら両方を無効にすることです。