UniRx勉強会 reactive extensions inside(公開用)

24
Reactive Extensions Inside? UniRx 勉強会 wilfrem

Transcript of UniRx勉強会 reactive extensions inside(公開用)

Page 1: UniRx勉強会   reactive extensions inside(公開用)

Reactive Extensions Inside?

UniRx勉強会

wilfrem

Page 2: UniRx勉強会   reactive extensions inside(公開用)

自己紹介

ハンドル名: wilfrem

普段はPHPerでサーバサイドやってます。

趣味プロはずっとC++/C#

ここ数年はMono系をちょこちょこと。

Page 3: UniRx勉強会   reactive extensions inside(公開用)

What’s Rx

わからん!

The Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators. Using Rx, developers represent asynchronous data streams with Observables, query asynchronous data streams using LINQ operators, and parameterize the concurrency in the asynchronous data streams using Schedulers. Simply put, Rx = Observables + LINQ + Schedulers.

Rx公式のBrief Introより

Page 4: UniRx勉強会   reactive extensions inside(公開用)

というわけで

Unity(C#3.0)むけに分かりやすくするよ!

Page 5: UniRx勉強会   reactive extensions inside(公開用)

C#3.0(Unity)ユーザのためのReactive Extensions Inside

UniRx勉強会

wilfrem

Page 6: UniRx勉強会   reactive extensions inside(公開用)

Rxは何のライブラリなのか?

Reactive Extension(以下Rx)は

• イベントを使ったプログラミング

• 非同期プログラミング

• メッセージパッシングプログラミング

を扱いやすくするための便利ライブラリです

Rx.NET以外にも、UniRx/RxJava/rx.js/RxCpp/RxCocoa/RxPy/RxPHP等の実装あり

Page 7: UniRx勉強会   reactive extensions inside(公開用)

UnityでRx使う主な利点

Unity(ゲーム制作)でRxを使うと

• Eventより高機能なRxを使える

• イベントの複雑な処理を綺麗に書ける

• 重たい処理で”ザ・ワールド”を防げる

• 通信周りを書きやすくなる

• 短いコードでバグを減らせる

などなど

Page 8: UniRx勉強会   reactive extensions inside(公開用)

つまり

Rx is神

Page 9: UniRx勉強会   reactive extensions inside(公開用)

Rxの考え方入門

Page 10: UniRx勉強会   reactive extensions inside(公開用)

Rxを使いこなすために

Rxは素晴らしい便利なライブラリ

しかし、使いこなすためには

背景にある共通した考え方の習得が必要

Page 11: UniRx勉強会   reactive extensions inside(公開用)

C#におけるevent

C#のイベントとは

• イベントが発生したタイミングで

• EventArgsと一緒にpushされる

timeEventArgs

push

EventArgs

push

EventArgs

push

EventArgs

push

Page 12: UniRx勉強会   reactive extensions inside(公開用)

メッセージパッシング

メッセージパッシングとは

• メッセージを送信すると

• 購読側にメッセージがpushされる

timemessage

push

message

push

message

push

message

push

Page 13: UniRx勉強会   reactive extensions inside(公開用)

非同期処理

非同期処理とは

• 処理を別スレッドに投げる

• 処理が終わったら結果がcallbackされる

time結果

callback

処理投げ

Page 14: UniRx勉強会   reactive extensions inside(公開用)

UnityのUpdate

ゲームにおけるフレームのUpdateとは

• 各フレームが開始したタイミングで

• Update関数が呼び出される

time

call call call call

Page 15: UniRx勉強会   reactive extensions inside(公開用)

つまり

すべてが「時間」というシーケンス上の「要素」となる

timeEvent

Args

push

Event

Args

push

Event

Args

push

Event

Args

push

time結果

callback

処理

投げ

time

call call call call

Event/メッセージ

非同期

Update

Page 16: UniRx勉強会   reactive extensions inside(公開用)

シーケンス化の利点?

我々Unity使いは、すでに知っている。

C#には

「LINQ」があることを

(注1) ハイラルの勇者ではありません

(注2) アイドルグループでもありません

Page 17: UniRx勉強会   reactive extensions inside(公開用)

LINQとは

端的に言えば

イテレータ(IEnumerable<T>)=シーケンスを

• フィルタ

• 合成

• 射影

などなど、イテレータをこねこねできる機能

Rxはこれを時間軸シーケンスに拡張する!

Page 18: UniRx勉強会   reactive extensions inside(公開用)

つまりRxとは

端的に言えば

時間軸シーケンス(IObservable<T>)を

• フィルタ

• 合成

• 射影

などなど、時間軸をこねこねできる機能

+便利な機能が付いたライブラリである

Page 19: UniRx勉強会   reactive extensions inside(公開用)

Rxの便利機能一覧

• IObservableのの合成・フィルタ・射影• スケジューラー機能• Subject<T>• 時間系機能• 遅延やバッファ• Cold/Hot• Event→IObservable<T>変換• (Unity向け)コルーチン→IObservable<T>変換• (Unity向け)EveryUpdate()などなど

https://github.com/neuecc/UniRxhttp://www.slideshare.net/okazuki0130/reactive-extensionsv01

Page 20: UniRx勉強会   reactive extensions inside(公開用)

機能比較

Page 21: UniRx勉強会   reactive extensions inside(公開用)

Rx VS event

• Rxが後発

• Rxもeventも、コールバック登録は同じ

• 送付終了&エラーはeventには無い

• eventにはフィルタや射影の機能は無い

• Rxはdelegate定義要らない

Eventの上位互換なので置き換えましょう。

Page 22: UniRx勉強会   reactive extensions inside(公開用)

Rx VS async/await(Future)

• RxはFutureパターンもできる。

– Task<T>=1個だけ値を返すIO<T>

• Task<T>の利点

– ランタイム&コンパイラのサポート

–ワーカスレッドの自動割り当て

• Task<T>の欠点

– Unityではどう頑張っても使えない。

Page 23: UniRx勉強会   reactive extensions inside(公開用)

具体的に何を使うのか?

実際にどう使うのか?

今日の勉強会で実際にやってみましょう。

Page 24: UniRx勉強会   reactive extensions inside(公開用)

ご清聴ありがとうございました