Skip to main content
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
EN
Upload
Download free for 30 days
Sign in
Uploaded by
torisoup
PDF, PPTX
3,385 views
コールバックと戦う話
Unity夏LT大会2017 http://peatix.com/event/288912/ の発表資料です
Technology
◦
Read more
3
Save
Share
Embed
Save to Drive
Download now
Download as PDF, PPTX
1
/ 59
2
/ 59
3
/ 59
4
/ 59
5
/ 59
6
/ 59
7
/ 59
8
/ 59
9
/ 59
10
/ 59
11
/ 59
12
/ 59
13
/ 59
14
/ 59
15
/ 59
16
/ 59
17
/ 59
Most read
18
/ 59
19
/ 59
20
/ 59
More Related Content
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
145 slides
163.8K views
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
145 slides
46.9K views
PDF
Observableで非同期処理
by
torisoup
191 slides
11.1K views
PDF
インタフェース完全に理解した
by
torisoup
39 slides
6.9K views
PDF
Riderはいいぞ!
by
UnityTechnologiesJapan002
145 slides
16.5K views
PDF
UniRx完全に理解した
by
torisoup
36 slides
10.3K views
PDF
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
87 slides
86.6K views
PDF
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
139 slides
133.6K views
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
145 slides
163.8K views
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
145 slides
46.9K views
Observableで非同期処理
by
torisoup
191 slides
11.1K views
インタフェース完全に理解した
by
torisoup
39 slides
6.9K views
Riderはいいぞ!
by
UnityTechnologiesJapan002
145 slides
16.5K views
UniRx完全に理解した
by
torisoup
36 slides
10.3K views
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
87 slides
86.6K views
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
139 slides
133.6K views
What's hot
PDF
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
176 slides
30.7K views
PPTX
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
50 slides
10.4K views
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
26 slides
18.9K views
PPTX
UniRxでMV(R)Pパターンをやってみた
by
torisoup
21 slides
30.1K views
PDF
ObserverパターンからはじめるUniRx
by
torisoup
45 slides
9.8K views
PDF
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
by
Unity Technologies Japan K.K.
118 slides
50.2K views
PPTX
はじめてのUniRx
by
torisoup
94 slides
91.3K views
PDF
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
by
com044
116 slides
29K views
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
68 slides
65.4K views
PDF
UniTask入門
by
torisoup
95 slides
15.5K views
PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
54 slides
9.9K views
PPTX
UnityでUI開発を高速化した件
by
Grenge, Inc.
38 slides
10.4K views
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
33 slides
129.9K views
PDF
オンラインゲームの仕組みと工夫
by
Yuta Imai
56 slides
889.1K views
PDF
Unityアニメーションシステムの 今と未来の話
by
Unity Technologies Japan K.K.
84 slides
52.3K views
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
82 slides
73.8K views
PDF
【Unity】 Behavior TreeでAIを作る
by
torisoup
49 slides
24K views
PDF
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
by
Unity Technologies Japan K.K.
60 slides
43.6K views
PDF
Doozy UI 使おうぜ! #unity_lt
by
torisoup
72 slides
27.6K views
PPTX
UE4のためのより良いゲーム設計を理解しよう!
by
Masahiko Nakamura
77 slides
30.9K views
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
176 slides
30.7K views
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
50 slides
10.4K views
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
26 slides
18.9K views
UniRxでMV(R)Pパターンをやってみた
by
torisoup
21 slides
30.1K views
ObserverパターンからはじめるUniRx
by
torisoup
45 slides
9.8K views
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
by
Unity Technologies Japan K.K.
118 slides
50.2K views
はじめてのUniRx
by
torisoup
94 slides
91.3K views
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
by
com044
116 slides
29K views
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
68 slides
65.4K views
UniTask入門
by
torisoup
95 slides
15.5K views
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
54 slides
9.9K views
UnityでUI開発を高速化した件
by
Grenge, Inc.
38 slides
10.4K views
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
33 slides
129.9K views
オンラインゲームの仕組みと工夫
by
Yuta Imai
56 slides
889.1K views
Unityアニメーションシステムの 今と未来の話
by
Unity Technologies Japan K.K.
84 slides
52.3K views
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
82 slides
73.8K views
【Unity】 Behavior TreeでAIを作る
by
torisoup
49 slides
24K views
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
by
Unity Technologies Japan K.K.
60 slides
43.6K views
Doozy UI 使おうぜ! #unity_lt
by
torisoup
72 slides
27.6K views
UE4のためのより良いゲーム設計を理解しよう!
by
Masahiko Nakamura
77 slides
30.9K views
More from torisoup
PDF
MagicOnion入門
by
torisoup
37 slides
11.5K views
PDF
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
43 slides
4.4K views
PDF
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
100 slides
3.5K views
PDF
Unityでオニオンアーキテクチャ
by
torisoup
44 slides
12.5K views
PDF
Photon Cloud ことはじめ
by
torisoup
40 slides
2K views
PDF
アバター生放送支援アプリ「アバれぽ」
by
torisoup
36 slides
844 views
PDF
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
29 slides
2.7K views
PDF
Task vs Observable
by
torisoup
38 slides
554 views
PDF
Unityでオンラインゲーム作った話
by
torisoup
47 slides
10.9K views
PDF
UniRxでPUNを使いやすくする
by
torisoup
20 slides
4.5K views
PPTX
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
114 slides
9.2K views
PDF
Unity講習会(初級)
by
torisoup
118 slides
22.3K views
MagicOnion入門
by
torisoup
37 slides
11.5K views
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
43 slides
4.4K views
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
100 slides
3.5K views
Unityでオニオンアーキテクチャ
by
torisoup
44 slides
12.5K views
Photon Cloud ことはじめ
by
torisoup
40 slides
2K views
アバター生放送支援アプリ「アバれぽ」
by
torisoup
36 slides
844 views
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
29 slides
2.7K views
Task vs Observable
by
torisoup
38 slides
554 views
Unityでオンラインゲーム作った話
by
torisoup
47 slides
10.9K views
UniRxでPUNを使いやすくする
by
torisoup
20 slides
4.5K views
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
114 slides
9.2K views
Unity講習会(初級)
by
torisoup
118 slides
22.3K views
コールバックと戦う話
1.
コールバックと戦う話 2017/09/03 @toRisouP
2.
自己紹介 • 名前 とりすーぷ(@toRisouP) •
同人ゲームとか作ってます • 最近は割と忙しい – しごと – 同人ゲーム開発 – どんかつ
3.
今回の内容 ネトゲを作ってたら通信ラグや非同期処理だらけに なって死にそうな思いをしたので、 どうやってそこら辺の問題を解決したかを話す
4.
今回の内容 ネトゲを作ってたら通信ラグや非同期処理だらけに なって死にそうな思いをしたので、 どうやってそこら辺の問題を解決したかを話す 時間が足りないので話題をめっちゃしぼって 「コールバックとの戦い方」の話をします
5.
ハクレイフリーマーケット • 2016年1月からずっと作ってる東方二次創作ゲーム – 2017年10月リリース予定
6.
どんなゲーム? • アイテムを持って運んで、陣地に集めるゲーム • 試合終了時の合計点数が大きい方が勝ち
7.
使ってるフレームワークとか • Photon Cloud –
ネットワークゲーム用のクラウドサーバとAPI群を 提供してくれるサービス • Photon Unity Networking(PUN) – 上記 Photon CloundのUniyt向けSDK • ニフティクラウド mobile backend (NCMB) – ユーザやデータのDB管理やオブジェクトストレージを提供してくれ るサービス(mBaaS)
8.
非同期処理とコールバック
9.
ネトゲ開発は非同期通信だらけ • 通信があるせいでほとんど非同期処理だらけになる – 「ログインしてユーザ情報を取得する」のも非同期処理 –
「オブジェクトをインスタンス化する」だけでも非同期処理 – 「アイテムが今拾える状態か確認する」のも非同期処理 – 「全員の準備が完了するまで待つ」のも非同期処理
10.
非同期処理とコールバック • 非同期処理の面倒くさい部分ライブラリがなんとかしてくれる – スレッドの管理とか同期コンテキストとかは意識しなくてもいい •
一方で、これらライブラリはコールバック処理を多用している – 非同期処理の結果を受け取るにコールバック処理を使っている
11.
コールバック? • 非同期処理の実行後その結果を通知するために 関数を実行する手法 – 非同期処理の制御で一番シンプルで単純な実装 –
自分で任意の関数を登録するパターンや、決められた関数が実行される パターンがある • PUN、NCMBともにコールバックが大量に出て来る – ライブラリの実装が悪いとかいうわけではなく、 シンプルに作ればそうなるよね – ただしPUNテメーはだめだ
12.
NCMBのコールバック • NCMB – コールバック関数を自分で登録する コールバックの例:NCMBのログイン処理
13.
PUNのコールバック • PUN – イベントが発生すると既定の名前の関数が実行される –
例: • 誰かがゲームに参加した:OnPhotonPlayerConnected() • 部屋のリストが更新された:OnReceivedRoomListUpdate() – ちなみにPUNはコールバックの実装にSendMessageを使ってる • 旧Unity.Networkの実装に似せたのが原因 • このせいでめちゃくちゃ使い勝手が悪くなっている
14.
vs コールバック
15.
NCMBのコールバックを 使っていて発生する問題
16.
コールバックがネストしまくる • NCMBで ログイン
→ ステータス取得 → 更新して保存
17.
コールバックがネストしまくる • NCMBで ログイン
→ ステータス取得 → 更新して保存 ログインのコールバックブロック 詳細情報取得のコールバックブロック データ保存のコールバックブロック
18.
コールバックがネストすると… • エラーハンドリングが困難になる • 処理のスコープが曖昧になってしまう •
単純にインデントしまくって読みにくい • 人類の手に負えない
19.
一方のPUNで起きる問題
20.
PUNのコールバックの例 ←関数がバラバラに書いてあるだけで、 つながりが全く読めないコードみたいだけ どこれでちゃんと動きます
21.
PUNのコールバックの例
22.
PUNのコールバックの例 PUNを使って以下のフローを実装した例 ゲームサーバに繋ぐ ↓ ランダムな部屋に参加する ↓ 部屋に参加できたらシーン遷移 失敗したら新しく部屋を作る ↓ 部屋が作れたらシーン遷移 作るのに失敗したら終了
23.
PUNのコールバックの例 サーバに接続する処理を実行
24.
PUNのコールバックの例 成功 or 失敗でどっちかの処理に飛ぶ 成功時:OnJoinedLobby() 失敗時:OnFailedToConnetoToPhoton()
25.
PUNのコールバックの例 「ランダムな部屋に参加」 成功時:OnJoinedRoom() 失敗時:OnPhotonRandomJoinFailed()
26.
PUNのコールバックの例 参加できなかったので「新しく部屋を作る」 成功時:OnJoinedRoom() 失敗時:OnPhotonJoinRoomFailed()
27.
PUNのコールバックの例 同じメソッドが別の文脈で実行されうる ・ランダムな部屋に参加して成功したパターン ・新しく部屋を作ってその部屋に参加したパターン
28.
この形式のやばいところ • コードを見ても処理のつながりが全く把握できない – PUNのドキュメントを片手にコードを読まないとマジでわからない •
処理の文脈が途切れてしまう – 別の処理でも実行されるコールバックが同じだったりする場合、 このコールバックが何の処理に対するものなのかがわからない – そのためにわざわざフィールドに状態変数作るのめっちゃ馬鹿らしい
29.
コールバックのやばいところ • 自分で関数登録するスタイルコールバック(NCMB) – 処理を直列に連結したり、複数並列実行しようとすると ネスト地獄になって管理できなくなる •
既定の関数が呼び出されるコールバック(PUN) – 何を実行したらどの処理が次に実行されるのか?が把握しにくい – コード上から処理の文脈が失われて保守性が最悪になる
30.
コールバックは総じてヤバイ 素手で立ち向かうともれなく死ぬ
31.
コールバックと戦うための道具
32.
コールバックと戦うための道具 • Task – .NET
Framework 4 から搭載された並列処理の機構の1つ • 一連の処理を「Task」というかたまりにまとめて管理する • async/await と組み合わせると強くなる – JavaScriptでいうPromise / JavaでいうFutureに似てる • Observable – Reactive Extensionsで提案された概念 – Taskをめっちゃ高機能化したイメージ(ざっくりとした説明) • 複数のイベントメッセージに対応 • Schedulerでスレッドやタイミング管理ができる • Operatorでメッセージの連結、合成、加工ができる
33.
Taskを使う? Observableを使う? • 簡単な非同期処理であればTask
(async/await) で十分 • そこからさらに複雑な処理が必要になるならObservable(Rx)
34.
Taskを使う? Observableを使う? • 単純な非同期処理であればTaskで十分 •
そこからさらに複雑な処理が必要ならObservable(Rx) と、言われているがこれはあくまで Unityを使わないピュアなC#開発の話
35.
Unityだとどうなの? • Task – Unity
2017.1以降であれば MonoRuntimeを.NET 4.6にすれば使える • けど制約はある • それ以前のバージョンでもゴニョゴニョすれば使える – Unityでは導入に制約がある or 導入が面倒くさいのが難点 – 言語機能だけあって、async /await がめっちゃ強い • Observable – Unityなら「UniRx」を導入すれば使える – 表現力が高すぎてTaskと比べると学習コストが高い – Operatorとゲーム開発の親和性が高い
36.
とりあえずは慣れてる方を 使えばいいんじゃない? (自分はUniRxを多用するのでそのまま自然とObservable使うことになった)
37.
コールバックを Observableにしてしまおう
38.
コールバックをObservableにする例 • Observable.Createで コールバックごと処理を ラップしちゃう – 成功したらOnNextに結果を流す –
失敗したらOnErrorに例外を流す
39.
コールバックをObservableにする例 • Observable.Createで コールバックごと処理を ラップしちゃう – 成功したらOnNextに結果を流す –
失敗したらOnErrorに例外を流す コールバック関数の内部で Observerに値を渡す
40.
Observableに変換すれば • さっきのこのネストしまくってたやつが… ログインのコールバックブロック 詳細情報取得のコールバックブロック データ保存のコールバックブロック
41.
こうなる
42.
こうなる ネストがなくて処理がフラットになってる! データのフローもわかりやすい!(上から流れるように読める)
43.
Observableにするのが 面倒くさい?
44.
ライブラリ化しました • NcmbAsObservable – NCMBのUniRxラッパー –
https://github.com/TORISOUP/NcmbAsObservable • PhotonRx – PUNのUniRxラッパー – https://github.com/TORISOUP/PhotonRx • 両方ともgithubに公開しています – プルリクエストお待ちしております
45.
さらに応用として
46.
Taskのawaitを再現する
47.
コルーチンとObservable • コルーチンを使えばawaitを再現できる – Observableはコルーチン上でyield
returnで待機できる – 記述量はTask+awaitより増えちゃうけどね – コルーチンのデメリットを引き継ぐデメリットはある
48.
例:コルーチン上でObservableを待つ • OnCollisionEnter()をコルーチン上で待ってみる 衝突検知ストリーム(3秒でタイムアウト) 結果が出るまでコルーチン上で待つ 結果をif文で判定して処理の継続
49.
さっきのPUNのやつを書き換える
50.
1.サーバ接続のコルーチンを作る
51.
1.サーバ接続のコルーチンを作る サーバへの接続結果を待つObservable 結果のBooleanを返すyield return 通信待機のyield return
52.
1.サーバ接続のコルーチンを作る ←ここがawaitに相当する
53.
2.部屋に参加するコルーチンを作る
54.
2.部屋に参加するコルーチンを作る 部屋に繋ぐ方法は抽象化しておく
55.
3.これらを順番に呼び出すコルーチンを作る
56.
3.これらを順番に呼び出すコルーチンを作る Observable.FromCoroutineValue<T>を使うと コルーチンが yield return
した値を取得できる ↓ コルーチンをObservableに変換し、 それをawaitすることで同期的に処理を書ける
57.
3.これらを順番に呼び出すコルーチンを作る サーバに繋ぐコルーチン 失敗したら終了 成功したら次へ ランダムな部屋に参加するコルーチン 成功したらシーン遷移 失敗したら次へ 成功したらシーン遷移 失敗したら終了 部屋を作るコルーチン
58.
←これと比べたら記述量は増えてるけど、 処理のフローは見やすくなった(はず)
59.
まとめ • コールバックはそのまま扱うともれなく死を迎える – 仕組みが単純すぎて複雑なフローを表現できない –
TaskとかObservableとかのイケてる仕組みに載せるのが吉 • TaskとObservableのどっちを使うかは考えよう – ピュアなC#開発とUnity開発は事情が違うので注意が必要 – 以前はUniRxが強かったが、 Unity 2017.1の登場で事情が変わってくるかも