未分類

UnityC#非同期勉強会の資料覚書

UnityC#非同期勉強会の資料が大変素晴らしかったので覚書をおこなって行こうかと思います。

https://connpass.com/event/95696/presentation/

上記まとめページ

async/awaitの仕組み

awaitとは?

Unityのコルーチンに似ている

(awaitと比較して戻り値がある場合使いづらい、例外処理が書きづらい)

また、重たい処理をメインスレッド以外で実行するのに使えたりもする

await Task.Run(“重たい処理”);

実際の書き方

var result = await Task.Run(()=>{

return 戻り値;

});

非同期の続きがかける(メソッドチェーン的な?)

await Task.Run(“重たい処理”).ContinuWith(t=>{

});

IO待ちとは

CPU以外との外とのやりとり(メモリ、ドライブへのアクセス処理など)

パターン化

非同期メソッドビルダーパターン

awaitableパターン -> Task以外を戻り値にできる。

neueccさんのasync/await in Unityスライド・・神!

async/await

非同期を同期的に扱える仕組み(Unityのコルーチン見たく平坦に書ける)

Rxとの使い分け

async/awaitは非同期、Rxはイベントのハンドリング向け

非同期はマルチスレッドではない

Taskはマルチスレッドでもある・・・が=ではない。

uniTaskはメインスレッドで動く

UnitaskTracker

こちらでuniTaskの動きをキャプチャできる。

uniTaskのメモリリーク対策

OnDestroyにフックすれば絶対にリークはしない。

働くスレッド

マルチスレッドにおける処理を別スレッドごとに実行した時に

スレッドセーフになるように実行するための知識と挙動についての解説

オブジェクトを共有して複数スレッドでAddを行うと、

タイミングによってはAdd();の処理が重なってしまい、

期待した値が返らなくなるのでスレッドセーフではないとのことでした。

ObjectをlockすることでAddのタイミングが被るのを防ぐことができるとのこと。

UnmanagedThreadノススメ

ManagedThreadとは?

Mono(.Net)が管理しているスレッド。

安全なスレッド

GCの影響を受ける。

UnmanagedThreadとは?

Mono(.Net)が管理していないスレッド。

GCの影響を受けない

mono_thread_attach()を呼び外部スレッドを管理スレッドにする。

管理スレッドになったのでC#のデリゲートを呼べる。

mono_thread_detach()を呼んで再び管理外スレッドにしてGCの影響を受けなくする。

Observableで非同期処理

https://niconare.nicovideo.jp/watch/kn3434?nicorepotwitter_upload_knowledge

大先生のObservableの各種オペレター解説・・・・!

圧倒的ボリューム!!

UniRxをイベント処理以外にも非同期処理としてオペレーターを駆使して実装していく内容

イベント処理 <- -> 非同期処理

イベント:メッセージ数は不定

非同期:メッセージは1個(成功,失敗を返す)

Observable.FromCoroutinでCoroutinをObservableに変換する。

コールバックによる非同期処理ではネストが深くなりがちな件

CoroutinWithオペレーターを使うとネストが深くならずにフラットに書けるぞ!

Observableで平行処理(非同期を平行して走らせる)

非同期処理時のエラーハンドリングについて

・Cahchでerrorを検知時に差し替える

Catch(Exception e){

return GetHttpAsync(url2);

}

のような感じで別のObservableに差し替える

・CatchIgnoreでObservable.Emptyに差し替える

GetHttpAsync(url2).CatchIgnore((Exception e)=>{

DebugLogError(“エラー発生したので終わり”);

}).Subscribe(log=>{});

AsyncSubject

非同期向けのSubject

メッセージを1個だけキャッシュする。

非同期時はAsyncSubjectを使う

イベントハンドリングは Subjectでおk?

Cold Hotな状態とは?

ObservableはSubscribeされた状態で初めてインスタンス化されて動く => Hotな状態

逆に言うとSubscribeされる前は動かない。 => Coldな状態。

Observable.Start()

Task.Run()とほぼ同じ機能・・・らしい。

Observable.Create()

任意の手続き処理から任意のObservableが作れる。

↓いろんな処理機能をObservable化できる・・・!

既存の非同期処理をObservableに変換したりなんかができる・・・すごい。

CoroutineをObservableに変換して値を返す

async/awaitがあるので一旦。ここの手法は割愛・・・

async/awaitがない状態(古いUnityなど)だとこちらを使うことで色々

コルーチンの使い方を改善できそう。

実践! ライブコーディングで覚えるasync/await

https://github.com/OrangeCube/AsyncSample201809

現地でライブコーディングをおこなった模様・・・!