Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
torisoup
11,110 views
Observableで非同期処理
Unity非同期完全に理解した勉強会での発表資料です https://connpass.com/event/95696/
Technology
◦
Read more
5
Save
Share
Embed
Embed presentation
Download
Downloaded 32 times
1
/ 191
2
/ 191
3
/ 191
4
/ 191
5
/ 191
6
/ 191
7
/ 191
8
/ 191
9
/ 191
10
/ 191
11
/ 191
12
/ 191
13
/ 191
14
/ 191
15
/ 191
16
/ 191
Most read
17
/ 191
18
/ 191
19
/ 191
20
/ 191
21
/ 191
22
/ 191
23
/ 191
24
/ 191
Most read
25
/ 191
26
/ 191
27
/ 191
28
/ 191
29
/ 191
30
/ 191
31
/ 191
32
/ 191
33
/ 191
34
/ 191
35
/ 191
36
/ 191
Most read
37
/ 191
38
/ 191
39
/ 191
40
/ 191
41
/ 191
42
/ 191
43
/ 191
44
/ 191
45
/ 191
46
/ 191
47
/ 191
48
/ 191
49
/ 191
50
/ 191
51
/ 191
52
/ 191
53
/ 191
54
/ 191
55
/ 191
56
/ 191
57
/ 191
58
/ 191
59
/ 191
60
/ 191
61
/ 191
62
/ 191
63
/ 191
64
/ 191
65
/ 191
66
/ 191
67
/ 191
68
/ 191
69
/ 191
70
/ 191
71
/ 191
72
/ 191
73
/ 191
74
/ 191
75
/ 191
76
/ 191
77
/ 191
78
/ 191
79
/ 191
80
/ 191
81
/ 191
82
/ 191
83
/ 191
84
/ 191
85
/ 191
86
/ 191
87
/ 191
88
/ 191
89
/ 191
90
/ 191
91
/ 191
92
/ 191
93
/ 191
94
/ 191
95
/ 191
96
/ 191
97
/ 191
98
/ 191
99
/ 191
100
/ 191
101
/ 191
102
/ 191
103
/ 191
104
/ 191
105
/ 191
106
/ 191
107
/ 191
108
/ 191
109
/ 191
110
/ 191
111
/ 191
112
/ 191
113
/ 191
114
/ 191
115
/ 191
116
/ 191
117
/ 191
118
/ 191
119
/ 191
120
/ 191
121
/ 191
122
/ 191
123
/ 191
124
/ 191
125
/ 191
126
/ 191
127
/ 191
128
/ 191
129
/ 191
130
/ 191
131
/ 191
132
/ 191
133
/ 191
134
/ 191
135
/ 191
136
/ 191
137
/ 191
138
/ 191
139
/ 191
140
/ 191
141
/ 191
142
/ 191
143
/ 191
144
/ 191
145
/ 191
146
/ 191
147
/ 191
148
/ 191
149
/ 191
150
/ 191
151
/ 191
152
/ 191
153
/ 191
154
/ 191
155
/ 191
156
/ 191
157
/ 191
158
/ 191
159
/ 191
160
/ 191
161
/ 191
162
/ 191
163
/ 191
164
/ 191
165
/ 191
166
/ 191
167
/ 191
168
/ 191
169
/ 191
170
/ 191
171
/ 191
172
/ 191
173
/ 191
174
/ 191
175
/ 191
176
/ 191
177
/ 191
178
/ 191
179
/ 191
180
/ 191
181
/ 191
182
/ 191
183
/ 191
184
/ 191
185
/ 191
186
/ 191
187
/ 191
188
/ 191
189
/ 191
190
/ 191
191
/ 191
More Related Content
PDF
UniRx完全に理解した
by
torisoup
PDF
UniTask入門
by
torisoup
PDF
インタフェース完全に理解した
by
torisoup
PDF
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
PDF
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
UniRx完全に理解した
by
torisoup
UniTask入門
by
torisoup
インタフェース完全に理解した
by
torisoup
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
What's hot
PDF
コールバックと戦う話
by
torisoup
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
PPTX
UniRxでMV(R)Pパターンをやってみた
by
torisoup
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
by
UnityTechnologiesJapan002
PDF
【Unity】 Behavior TreeでAIを作る
by
torisoup
PDF
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
PPTX
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
by
Unity Technologies Japan K.K.
PPTX
はじめてのUniRx
by
torisoup
PDF
オンラインゲームの仕組みと工夫
by
Yuta Imai
PDF
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
by
SEGADevTech
PDF
Unityでオニオンアーキテクチャ
by
torisoup
PDF
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
by
Mikito Yoshiya
PDF
今日からできる!簡単 .NET 高速化 Tips
by
Takaaki Suzuki
PPTX
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
PPTX
UE4のレイトレで出来ること/出来ないこと
by
Satoshi Kodaira
PDF
[UE4]自動テストでもっと楽したい!
by
com044
PDF
【UE4.25 新機能】新しいシリアライゼーション機能「Unversioned Property Serialization」について
by
エピック・ゲームズ・ジャパン Epic Games Japan
PDF
すごい constexpr たのしくレイトレ!
by
Genya Murakami
PDF
猫でも分かるUE4のポストプロセスを使った演出・絵作り
by
エピック・ゲームズ・ジャパン Epic Games Japan
PDF
カスタムメモリマネージャと高速なメモリアロケータについて
by
alwei
コールバックと戦う話
by
torisoup
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
UniRxでMV(R)Pパターンをやってみた
by
torisoup
【Unite Tokyo 2019】Understanding C# Struct All Things
by
UnityTechnologiesJapan002
【Unity】 Behavior TreeでAIを作る
by
torisoup
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
by
Unity Technologies Japan K.K.
はじめてのUniRx
by
torisoup
オンラインゲームの仕組みと工夫
by
Yuta Imai
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
by
SEGADevTech
Unityでオニオンアーキテクチャ
by
torisoup
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
by
Mikito Yoshiya
今日からできる!簡単 .NET 高速化 Tips
by
Takaaki Suzuki
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
UE4のレイトレで出来ること/出来ないこと
by
Satoshi Kodaira
[UE4]自動テストでもっと楽したい!
by
com044
【UE4.25 新機能】新しいシリアライゼーション機能「Unversioned Property Serialization」について
by
エピック・ゲームズ・ジャパン Epic Games Japan
すごい constexpr たのしくレイトレ!
by
Genya Murakami
猫でも分かるUE4のポストプロセスを使った演出・絵作り
by
エピック・ゲームズ・ジャパン Epic Games Japan
カスタムメモリマネージャと高速なメモリアロケータについて
by
alwei
Similar to Observableで非同期処理
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
by
Yoshifumi Kawai
PPTX
async/await のしくみ
by
信之 岩永
PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async)
by
Yoshifumi Kawai
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
by
Yoshifumi Kawai
PDF
脱UniRx&Croutineから始めるUniTask
by
Euglenaching
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
by
Yoshifumi Kawai
PDF
パターンでわかる! .NET Coreの非同期処理
by
Kouji Matsui
PDF
いまさら恥ずかしくてAsyncをawaitした
by
Kouji Matsui
PDF
これからの「async/await」の話をしよう
by
Kouji Matsui
PPTX
モダン JavaScript における非同期処理 - Promise, async/await -
by
Kazunori Hashikuchi
PDF
UniRx - Reactive Extensions for Unity
by
Yoshifumi Kawai
PDF
Weeyble async 181009_tukky
by
shotaueda3
PDF
Android meets RxJava - 渋谷Java#6
by
yo_waka
PDF
非同期の時代がやってくる!
by
Takaaki Suzuki
PPTX
歌舞伎座Tech Rx会
by
Kaora Shibacaki
PPTX
UniRx勉強会 reactive extensions inside(公開用)
by
wilfrem
PDF
Async Enhancement
by
kamiyam .
PPTX
Reactive
by
Akihiro Ikezoe
PDF
Async design with Unity3D
by
Kouji Hosoda
PPTX
Reactive Programming
by
maruyama097
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
by
Yoshifumi Kawai
async/await のしくみ
by
信之 岩永
Deep Dive async/await in Unity with UniTask(UniRx.Async)
by
Yoshifumi Kawai
C#次世代非同期処理概観 - Task vs Reactive Extensions
by
Yoshifumi Kawai
脱UniRx&Croutineから始めるUniTask
by
Euglenaching
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
by
Yoshifumi Kawai
パターンでわかる! .NET Coreの非同期処理
by
Kouji Matsui
いまさら恥ずかしくてAsyncをawaitした
by
Kouji Matsui
これからの「async/await」の話をしよう
by
Kouji Matsui
モダン JavaScript における非同期処理 - Promise, async/await -
by
Kazunori Hashikuchi
UniRx - Reactive Extensions for Unity
by
Yoshifumi Kawai
Weeyble async 181009_tukky
by
shotaueda3
Android meets RxJava - 渋谷Java#6
by
yo_waka
非同期の時代がやってくる!
by
Takaaki Suzuki
歌舞伎座Tech Rx会
by
Kaora Shibacaki
UniRx勉強会 reactive extensions inside(公開用)
by
wilfrem
Async Enhancement
by
kamiyam .
Reactive
by
Akihiro Ikezoe
Async design with Unity3D
by
Kouji Hosoda
Reactive Programming
by
maruyama097
More from torisoup
PDF
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
PDF
Unityでオンラインゲーム作った話
by
torisoup
PDF
ObserverパターンからはじめるUniRx
by
torisoup
PDF
Doozy UI 使おうぜ! #unity_lt
by
torisoup
PDF
MagicOnion入門
by
torisoup
PDF
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
PDF
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
PDF
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
PDF
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
PDF
アバター生放送支援アプリ「アバれぽ」
by
torisoup
PDF
UniRxでPUNを使いやすくする
by
torisoup
PPTX
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
PDF
Photon Cloud ことはじめ
by
torisoup
PDF
Task vs Observable
by
torisoup
PDF
Unity講習会(初級)
by
torisoup
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
Unityでオンラインゲーム作った話
by
torisoup
ObserverパターンからはじめるUniRx
by
torisoup
Doozy UI 使おうぜ! #unity_lt
by
torisoup
MagicOnion入門
by
torisoup
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
アバター生放送支援アプリ「アバれぽ」
by
torisoup
UniRxでPUNを使いやすくする
by
torisoup
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
Photon Cloud ことはじめ
by
torisoup
Task vs Observable
by
torisoup
Unity講習会(初級)
by
torisoup
Observableで非同期処理
1.
Observableで非同期処理 2018/09/15 とりすーぷ
2.
自己紹介 • とりすーぷ(@toRisouP) • 株式会社バーチャルキャスト •
Unityクライアント開発 • 人類を美少女にする仕事をしてます
3.
非同期について
4.
非同期処理って何?
5.
非同期処理って何? • 関数呼び出し時に、結果を待たずに次に進む処理のこと • 処理内容を別のタイミングで実行する処理のこと
6.
非同期処理≠マルチスレッド処理 • 非同期だからといってマルチスレッド処理とは限らない • シングルスレッドでも非同期処理はできる •
マルチスレッドでも同期処理で書くことはできる • 一緒くたにされることがよくあるが、厳密にいうと違う概念
7.
非同期処理の難しさ
8.
非同期処理は難しい? • 非同期処理は一般的に「難しい」と言われる • 何が難しいの?
9.
非同期処理の難しいところ • 実行結果の取り扱い • 直列/並行処理 •
エラーハンドリング • 実行キャンセル • 実行コンテキストの制御(マルチスレッド時の制御)
10.
非同期処理 vs 人類 •
非同期処理へ無防備に立ち向かうと人は死ぬ • 非同期処理は愚直に書くとすぐ手に負えなくなる • いろいろな対策手法が考案されてきた
11.
非同期処理の手法
12.
Unityで今の所使えるもの • Unityコルーチン • async/await
+ Task • UniRx ( Observable ) • UniRx ( UniRx.Async ) • 独自実装
13.
Unityコルーチン • Unityメインスレッド上で処理を待ち受ける機構 • 結果を返すことを考慮していない •
GameObjectと処理がひもづく
14.
async/await + Task •
C#の言語機能として用意されている機構 • Unityの場合は.NET 4.xモードにしたら使える • サクッと非同期処理が書けて非常に使いやすい
15.
UniRx ( Observable
) • UniRxのメイン機能 • Taskの拡張版みたいなもの • 同梱されているOperatorやSchedulerが便利
16.
UniRx ( UniRx.Async
) • ascyn/awaitとTaskをUnity向けに最適化したもの • 詳しくはneueccさんの講演で
17.
独自実装 • 非同期処理の機構を自前で作ってしまう方法 • 単純なものならわりとすぐ作れる •
実行コンテキスト制御や、キャンセル周りを考えるとツライ
18.
結局どれを使えば? • まず第一にasync/awaitを使おう • async/awaitで表現できないものはObservableでやる
19.
以前、話しました • Task vs
Observable • https://niconare.nicovideo.jp/watch/kn3081
20.
ここまでが前置き
21.
本題
22.
今回話したい内容 • UniRx(Observable)の非同期処理への活用方法 • UniRxは「イベント処理のライブラリ」として浸透しちゃった •
UniRxは非同期処理にも使えるよ、という話がしたい
23.
Observable
24.
Observable • Reactive Extensionsに登場するメッセージ処理のオブジェクト •
「ストリーム」とか呼んでたりするアレの正式名称 • Message Source + Operator + Scheduler で構成される
25.
Unity開発で多用される • ゲームはイベントが飛び交う • イベント処理に強いObservableはとても便利に使える
26.
イベント処理と非同期処理
27.
イベント処理 • 何かの条件を満たしたときにメッセージを発行する • メッセージを受け取った側が、何かの処理を実行する •
発行されるメッセージ数は不定 (0個だったり、有限個だったり、無限だったり)
28.
非同期処理 • 処理が終わったときに、メッセージを発行する • メッセージを受け取った側が、何かの処理を実行する •
発行されるメッセージ数は必ず1個 (成功 or 失敗 で必ずどちらかの結果を1つ返す)
29.
Observableから見ると • イベント処理 • OnNextを複数個発行する(0~N個、無限もあり) •
非同期処理 • OnNext必ず1つ発行する(成功時) • 失敗時はOnErrorを返す
30.
どっちもObservableの表現範囲内 • 非同期処理もイベント処理も等価に扱える • メッセージの発行のパターンが異なるだけ •
「イベント処理」のメッセージ長を1に固定したら「非同期処理」
31.
Observableのメリット
32.
コルーチンと比較してみよう
33.
コルーチンと比較 • コルーチンは結構プリミティブに近い作り • 非同期処理の機構だけど、それほど機能は多くない •
実行結果を返せない、エラーハンドリングしてくれない、等 • Observableで書くと非同期処理がどれくらいキレイになるのか
34.
例:HTTP GET • WWWでGETする処理を比較 •
コルーチンで書いた版 • コルーチンをObservableに変換した版
35.
コルーチン版 • HTTP GETする •
結果をログに出すだけ
36.
Observable版 • Observable.FromCoroutine • コルーチンをObservableに変換
37.
Observable化 • 中身はコルーチンだけど、ガワはObservableになった • 「Observableで包んだ」というのが大事 •
これだけで十分使えるようになる
38.
比較 • 実行結果の取り扱い方 • 直列/並行処理
39.
比較 • 実行結果の取り扱い方 • 直列/並行処理
40.
コルーチン • コルーチンに結果を返す機能はない • デリゲートを使ったコールバックで無理やり返すしかない •
結果をキャッシュしておいて後で使う、がやりにくい
41.
コルーチンで実行結果をむりやり返す
42.
Observableの場合 • 結果を「IObservable<T>」で扱うことができる • 変数に代入して取り回せる •
結果をキャッシュしておいて後で取り出せる( 要PublishLast)
43.
Observableで結果を扱う
44.
比較 • 実行結果の取り扱い方 • 直列/並行処理
45.
直列・並行処理 • 直列:前の処理の終了待って、次の処理を実行する • 並行:複数の非同期処理を同時に実行して終わるまで待つ
46.
直列処理 • コールバック手法と相性がよくない • ネスト地獄になる •
途中で処理分岐が入るとぐちゃぐちゃになる
47.
コールバック手法で直列処理 • 比較がしたいので、コールバックで結果を返す方法で説明する
48.
コールバックを使って直列処理(2段) 1回目のGETの結果を使って、 2回目のGETを実行する
49.
直列3段 1回目のGETの結果を使って、 2回目のGETを実行し、 その結果を使って3回目のGETを実行
50.
コールバックではすぐ破綻が見える • 正常系の処理だけでもすでに読みにくい • エラーハンドリングが入るとさらに処理が分岐する •
途中で例外飛んだらどうするの?
51.
Observableで直列処理を書く • ContinueWith (またはSelectMany)で連結するだけ •
フラットな形式で書ける
52.
並行処理 • Unityコルーチンでは並行で結果を待ち受ける機能はない • 実行はできるけど、結果を待てない •
自作する必要がある • めんどい
53.
Observableで並行処理 • Observable.WhenAll • これで包むだけ
54.
直列・並行処理 • Observable化したほうが基本的には楽になる • ネスト地獄を回避できる
55.
コルーチンとの比較 まとめ • Observableを使えば楽になる部分が多い •
コルーチンと比べて結果の取り扱いが非常に楽になる • 処理の連結も楽にできる
56.
ちなみにコルーチンに限った話ではない • 非同期処理をObservableにすればこのメリットは享受できる • 例:独自機構の非同期処理をObservableにラップする
57.
覚えておきたいUniRxの機能
58.
UniRxには機能がたくさん • Rx.NETからある機能から、Unity特化の機能まで • その中でも非同期処理に使えるものを紹介
59.
紹介する機能 • ContinueWith • エラーハンドリング •
Observable.Start() • Observable.Create() • AsyncSubject • PublishLast() • Observable.FromCoroutine() • ToYieldInstruction()
60.
ContinueWith
61.
ContinueWith • Observableを直列に連結するときにつかうOperator • 引数は
Func<T, IObservable<TResult>> • SelectManyの軽量化版(OnNext 1回限定で動作)
62.
エラーハンドリング
63.
失敗したときどうするの? • 失敗時のリカバリをキレイに書ける? • ログに出して終わり •
リトライする • 別の処理にフォールバックする • 処理を諦める • 失敗を握りつぶす
64.
Operatorでエラーハンドリング • ObservableはOperatorでエラーハンドリングできる • すごいいっぱい機能がある •
async/awaitには無い、Observableの強み
65.
Catch • OnErrorを受け取って、別のObservableに差し替える • 別の処理にフォールバックさせる
66.
CatchIgnore • OnErrorを受け取って、Observable.Emptyに差し替える • 別のObservableにフォールバックさせる必要が無いときに使う
67.
例外の型でフィルタリング • デリゲートの型を明示的に指定するとフィルタリングできる
68.
Retry • OnErrorがきたら、Subscribeからやり直す • Retry()より上の層を再生成して実行しなおす •
回数指定ができる
69.
OnErrorRetry • Retryの強化版 • Catch
+ Retry • 挙動をかなり細かく制御できる
70.
Timeout • タイムアウトさせる • 指定した時間が経過、または指定時刻になったらOnErrorを発行
71.
エラーハンドリングまとめ • Operatorがかなり優秀 • 組み合わせるだけでそれなりのエラーハンドリングができる •
Retryは使用箇所を見極めよう • リトライすれば問題が改善するかもしれない場面でのみ使おう • 良:ネットワーク通信(リトライで改善するかもしれない) • 悪:ローカルファイルの読み込み(ファイルが無い場合、リトライしても無い)
72.
AsyncSubject
73.
AsyncSubject • 非同期処理向けSubject • メッセージを1個だけキャッシュする機能を持つ •
OnCompletedすることで状態が確定する
74.
普通のSubject(AsyncSubjectではないやつ) • Subject • メッセージ発行の根源になるオブジェクト •
IObservable<T>とIObserver<T>を両方とも実装している
75.
(普通の)Subjectの挙動 遅れてSubsribeした場合、それより前に 発行されたメッセージは受け取ることができない
76.
AsyncSubjectの挙動 AsyncSubjectは、OnCompleted済みであれば後から Subscribeしてもメッセージを受け取ることができる
77.
AsyncSubjectの使い方
78.
用途 • 非同期処理の結果通知にそのまま使える • JavaScriptのPromiseみたいな使い方をする •
処理の結果をキャッシュして保持させる • 1回実行した非同期処理の結果を使いませる
79.
応用例:コンポーネントの初期化順序 • コンポーネントの初期化順序が問題になる場面 • シーン開始直後などの初期化フェーズ •
Aが先に実行されてないと、Bの処理で失敗する • 苦肉の策でScript Execution Orderでゴリ押し解決するの…?
80.
例 • PlayerProvider :
Playerを生成して提供する • PlayerInitializer : 生成されたPlayerの初期設定を実行する
81.
例:PlayerProvider
82.
例:PlayerInitializer
83.
例:コンポーネントの処理順序 • この2つのコンポーネントは実行順序が重要 • PlayerProvider
-> PlayerInitializer • 順序が崩れるとエラーが出て動かない
84.
非同期処理にして解決する • 「初期化は非同期処理が連鎖する」という考え方に切り替える • 非同期的にPlayerが初期化される、と考える •
PlayerInitializerはその非同期処理を待つ
85.
例:非同期化
86.
例:非同期化 AsyncSubjectの性質により Subscribe()を先に実行しようが後から実行しようが、 OnCompletedしたときに必ずPlayerが取得できる
87.
実行順序を気にしなくてよくなった • 必ずPlayerProvider ->
PlayerInitializerの順番で実行される • AsyncSubjectを使えば非同期処理に変換できる • もしPlayerProviderの処理が後から 本当に非同期処理になっても、PlayerInitializer側は変更不要
88.
ちなみに:await • AsyncSubjectはAwaitable • async/awaitで待機できる •
IObservableのGetAwaiter()は、内部でAsyncSubjectに変換している
89.
async/awaitで待つ • PlayerInitializerの初期化をasync/await化 • 同期で書いたときと同じ記法にできる
90.
AsyncSubject まとめ • 非同期処理を扱うためのSubject •
そのまま非同期処理の結果通知に使える • コンポーネントの順序関係の整理にも使えそう • 後から本当の非同期処理が混ざってきても対応できる • async/awaitが使えるなら記法もほとんど変えずに済む
91.
PublishLast()
92.
PublishLast() • Hot変換Operator • AsyncSubjectを使ったHot変換を行う
93.
Hot変換?
94.
Observableの性質 • 基本的に、Subscribe()されるまで動かない • Subscribe()される前の状態は「仮止め」みたいな状態で放置される •
Subscribe()されると、はじめてインスタンス化されて動く • こういう状態のObservableを「Cold Observable」と呼ぶ
95.
例:Observable.Interval
96.
例:Observable.Interval 定義したタイミングでは、Observable.Intervalは起動しない
97.
例:Observable.Interval Subscribeされたタイミングで起動する
98.
例:Observable.Interval Subscribeされたタイミングで起動する 3回Subscribeされたので、 3つタイマーが起動する
99.
Cold Observable • 仮止め状態で浮いているObservableのこと •
Subscribeされて初めてインスタンス化して起動する • Subscribeされた回数分インスタンス化される
100.
Hot Observable • 既に稼働済みのObservable
101.
実はLINQも似ている • Cold Observableみたいな現象はLINQでも起きる
102.
LINQ • LINQのメソッドはforeachで呼ぶまで評価されない 定義したときにはまだ評価されない ← foreachを回したときに評価される
103.
LINQと多重foreach • こういう書き方をするとちゃんと動かない
104.
LINQと多重foreach • こういう書き方をするとちゃんと動かない ← ここ ←
ここ 1回目のforeachと、2度目のforeachとで、 別々のWebSocketClientが生成されてしまう
105.
LINQにもColdっぽい性質がある • foreachされるまで評価されない性質 • 正確に言うとMoveNext()されるまで評価されない •
じゃあ解決方法は?
106.
この問題の解決方法 • 先にLINQを一回実行し、結果をListやArrayに詰め直す
107.
この問題の解決方法 • 先にLINQを一回実行し、結果をListやArrayに詰め直す 以降の処理は、結果の方を使う
108.
省略記法 • 面倒くさいので普通はToList()とかToArray()を使う
109.
LINQとRxはよく似ている • ObservableとEnumerableが双対の関係 • 双対の概念だけあって、結構似ている •
LINQのときの対処方も、Observableへ適用できるのでは?
110.
Cold to Hot •
Cold ObservableをHotにするには?
111.
Cold to Hot •
Cold ObservableをHotにするには? • LINQでいう「foreachを事前に実行する」的なことをすればよい
112.
Cold to Hot •
Cold ObservableをHotにするには? • LINQでいう「foreachを事前に実行する」的なことをすればよい • Subescirbe()を事前に実行すればよいじゃん!
113.
Hot変換のやりかた • Subjectを使って事前にObseravbleをSubscribe()をしてしまう • LINQを1回実行してArrayに詰め直す、に似てる
114.
例:Subjectを使ってHot変換 • Subjectを使って、対象を先にSubscribe()する • 以降のObserverはSubjectの方を代わりにSubscribeする
115.
例:Subjectを使ってHot変換 • Subjectを使って、対象を先にSubscribe()する • 以降のObserverはSubjectの方を代わりにSubscribeする ←
ここのSubscribe()でObservable.Intervalが起動する
116.
例:Subjectを使ってHot変換 • Subjectを使って、対象を先にSubscribe()する • 以降のObserverはSubjectの方を代わりにSubscribeする Hot変換後にメッセージがほしいなら、 Subjectの方をSubscribe()する
117.
AsyncSubjectでもHot変換できる • Subjectの代わりにAsyncSubjectも使える • 結果をキャッシュするという性質がObservableに付与できる •
非同期処理を扱うObservableと相性がとても良い
118.
AsyncSubjectでHot変換 • 先に処理を実行しつつ、その結果をキャッシュできる
119.
AsyncSubjectでHot変換 • 先に処理を実行しつつ、その結果をキャッシュできる 関数を呼んだ時点でObservable.FromCoroutineが実行 (コルーチンが稼働しはじめる)
120.
AsyncSubjectでHot変換 • 先に処理を実行しつつ、その結果をキャッシュできる 何回Subscribeしてもキャッシュを参照する (コルーチンの多重起動を防止できる)
121.
Hot変換 まとめ • Cold
Observableという性質を覚えよう • Subjectを使えばHotに変換できる • AsyncSubjectでHot変換すると非同期処理との相性がよくなる
122.
PublishLast() の話にもどる
123.
PublishLast() • Hot変換を実行するためのOperator • 中でAsyncSubjectを作ってSubscribeしてくれる
124.
仲間たち(中のSubjectが異なる) • Publish() • Subject •
Publish(T initValue) • BehaviorSubject • PublishLast() • AsyncSubject • Replay() • ReplaySubject
125.
PublishLast()の使い方 • Observableの末尾につけて、その後にConnect()を呼ぶ • 返り値はIConnectableObservable •
中でAsyncSubjectを作って、Subscribeしてくれる • ただしIConnectableObservableのリークには注意
126.
PublishLast()を使うメリット • Observableを先走りさせることができる • 非同期処理を先に実行しておける •
結果をキャッシュできる • 結果を後から好きなタイミングで取り出せる • 同じ処理を重複して実行させなくてすむ
127.
ただし… • PublishLast()にはデメリットもある
128.
PublishLast()を使うデメリット • 「失敗」もキャッシュしてしまう • キャッシュされた結果に対して、Retryはしても無意味 •
エラーハンドリング不可能になってしまう
129.
PublishLast()とエラーハンドリング
130.
PublishLast()とエラーハンドリング ここでOnErrorが発生すると、 その状態もキャッシュしてしまう
131.
PublishLast()とエラーハンドリング ここのRetryはOnErrorが確定したAsyncSubjectに対して 実行されるため、Retryする意味がない
132.
PublishLast()の使いどころ • 失敗がありうる場所では使わない方がいいかも • PublishLast()する前にエラーハンドリングを書く •
PublishLast()を使わずにColdのままにしておく • このあたりはケース・バイ・ケース
133.
PublishLast() まとめ • PublishLast()でお手軽にHot変換ができる •
非同期処理との相性がよい • ただし、デメリットもある点に注意
134.
拡張メソッド作っておくと便利 • PublishLast().Connect()までセットで実行する • RefCount()とPublishLast()は相性が悪いので使えない
135.
Observable.Start()
136.
Observable.Start() • Task.Run()とほぼ同じ機能 • Func<TResult>を実行し、結果をOnNext()として出力する •
Schedulerの指定も可能
137.
使用例 • 同期処理をかんたん非同期化 • マルチスレッドを使った非同期処理に変換できる
138.
Observable.Start()はCold • Observable.Start()は、Subscribe()しないと起動しない • 先に処理を走らせておいて、 後から結果を取り出したいときは、PublishLast()を使おう •
Observable.ToAsync()…?知らない子ですね…。
139.
Observable.Start() まとめ • 同期処理を非同期処理化するのに便利 •
サクッとマルチスレッド処理化できてよい
140.
Observable.Create()
141.
Observable.Create() • 任意の手続き処理から、任意のObservableを作る機能 • 自由にObservableがつくれる
142.
使い方
143.
使い方 指定した型のIObserver<T>が引数で渡される
144.
使い方 IObserver<T>を使って自由にメッセージ発行
145.
使い方 終了時の後片付けに用いるDisposableを返す
146.
用途は無限にある • なんでもできる • 中でスレッド起動してマルチスレッド処理 •
既存の非同期処理を隠蔽
147.
例:既存の非同期処理のラップ • 既存の非同期処理の機構をObservableに変換できる • 例:使っているライブラリをObservableに変換して使いたい
148.
ニフクラSDKの通信API • デリゲートによるコールバック呼び出し方式
149.
ニフクラSDKをObservable化
150.
ニフクラSDKをObservable化
151.
SubscribeOn() • Subscribe()を実行するコンテキストを切り替える機能 • 指定したScheduler上でSubscribe()を実行する •
例:ThreadPool上にスイッチしてからSubscribe() • 例:Unityメインスレッドに戻ってきてからSubscribe()
152.
SubscribeOn()とObservable.Create() • Observable.Create()はSubscribe()されたコンテキストで動く • SubscribeOn()を併用すると、 実行コンテキストを切り替えできる
153.
同期的に書いたObservable.Create() • 同期的に書いてある • このまま実行するとスレッドをブロックして処理する
154.
そのまま使う • Unityメインスレッドをブロッキングして読み込む • ブロッキングしても問題ないならこれで良い
155.
SubscribeOn()と組み合わせる • SubscribeOn()でThreadPoolを指定 • 処理をThreadPoolに移動できる •
ObserveOnMainThread()で結果メインスレッドに戻す
156.
Observable.Create() + SubscribeOn() •
Observable.Createの実行コンテキストを切り替えられる • 呼び出し側でマルチスレッド処理に変更できる
157.
Observable.Create まとめ • なんでもできる •
既存の非同期処理をObservableに変換したりできる • SubscribeOnと組み合わせるとより便利 • とりあえず中身を同期で書いておいて、 実行時にマルチスレッドで非同期化できる
158.
Observable.CreateWithState • ラムダ式の内部に変数を閉じ込めるときに使う • ラムダ式に外部変数をキャプチャさせたくないときに使う
159.
Observable.FromCoroutine
160.
Observable.FromCoroutine • コルーチンからObservableを作る機能 • 種類がいくつかある
161.
種類 • Observable.FromCoroutine /
FromMicroCoroutine • コルーチンが終了するのを待てる • Observable.FromCoroutineValue • コルーチンのyield return した値を取り出せる • Observable.FromCoroutine<T> / FromMicroCoroutine<T> • コルーチンから任意のメッセージを発行できる
162.
Observable.FromCoroutine<T> • コルーチンから任意のObservableを作る機能 • Observable.Createのコルーチン版みたいなもの
163.
例:コルーチンからObservableへ
164.
例:コルーチンからObservableへ
165.
使いみち • コルーチンから結果を取り出すことができるようになる • コルーチン最大の欠点を解消できる •
手続き処理からObservableを作れる • Operatorだけでは表現しにくい処理がコルーチンを使うと 比較的かんたんに書けたりすることもある
166.
Observable.FromCoroutineはCold • 必要に応じてHot変換するとよい
167.
Observable.FromCoroutineまとめ • コルーチンからObservableへ変換できる • コルーチンから結果を取り出すのが容易になる •
手続き処理ベースでObservableを作れる
168.
ToYieldInstruction()
169.
ToYieldInstruction() • ObservableをIEnumeratorに変換する機能 • コルーチン上でObservableの完了待ちができるようになる
170.
使い方
171.
使い方 ObservableYieldInstructionが返される (IEnumerataorを実装したオブジェクト)
172.
使い方 Yield return でObservableの完了(OnCompleted)を待てる 結果をそのまま取り出せる
173.
使いみち • async/awaitっぽいことがコルーチンで実現できる • 非同期処理を同期っぽく書くことができる •
async/awaitと比べると冗長ではある
174.
合わせ技 • Observable.FromCoroutine &
ToYieldInstruction • かなりの表現力が得られる • async/awaitがないUnityバージョンでも十分戦えるだけの力はある
175.
合わせ技
176.
合わせ技
177.
合わせ技
178.
キャンセルの仕方 • ToYieldInstructionはUniRx管理のコルーチン上で動く • 元のコルーチンを止めてもToYieldInstructionの 待受はキャンセルされない
179.
止まらない例
180.
止まらない例 GameObjectを破棄すると、 こっちのコルーチンは止まる
181.
止まらない例 ToYieldInstaruction()は止まらず、 裏でずっとObservableをSubscribe()したままになる
182.
対策 • Observable.FromCoroutine経由でコルーチンを起動する • そのときにCancellationTokenをToYieldInstruction()に渡す
183.
CancellationTokenを使って止める
184.
ToYieldInstruction() まとめ • コルーチン上でObservableを待機できる •
OnCompleted()がくるまで待ち受ける • 非同期処理の待機に使える • async/awaitっぽくObservableが待てる • Observable.FromCoroutine()とあわせるとさらにつよい
185.
まとめ
186.
非同期処理 • 結果をすぐに返さない処理 • 結果を待たずに関数呼び出しが終了する処理 •
マルチスレッド処理とは別の概念
187.
非同期処理の手法 • 非同期処理はやり方がいくつかある • async/await
+ Task • Unityコルーチン • Observable • UniRx.Async
188.
結局何を使えばいいの? 1. async/awaitを最優先に使う 2. async/awaitが使えない環境の場合、 またはasync/awaitでは表現力が足りない場合、 Observable(UniRx)を使う 3.
Observableも使えない場合は独自機構を作ってがんばる
189.
Observableは非同期処理に使える • イベント処理だけでなく、非同期処理にも応用ができる • Observableには非同期処理で使うと便利な機能がたくさんある •
ただしHot/Coldの性質だけは注意
190.
本当にまとめ
191.
まとめ • 非同期処理とは何なのかを覚えよう • 結果を待たない処理 •
いろんな手法でコストを下げることができる • Observableは非同期処理に使える • UniRxはイベント処理以外にも使える • Hot/Coldの性質だけは本当に注意
Download