勉強会のレポート(メモ)です。
参加したのはこちら、「【Unity / .NET Core】 MagicOnion勉強会」
会場はドワンゴさんです。
動画はこちらから。
- #1. MagicOnionライブコーディング+α
- #2. The Patterns of MagicOnion
- #3. 明日から使えるMagicOnion
- #4. MagicOnionでの共通処理の挟み方
- LT1. MagicOnionをContainer化してkubernetesで動かしてNew Relicで監視する
- LT2. MagicOnionを使う場合と使わない場合
- LT3. リアルタイムなゲームの開発でコンテナを使ってみたら簡単便利で激安だったのでオススメしたい!
- タイムライン
今回は実演が多い箇所があるので別途スライドと動画を見てください。
#1. MagicOnionライブコーディング+α
ライブコーディングだったので内容はほぼNothingですが一応あげておきますm(__)mhttps://t.co/fBYaIF70lO#MagicOnion
— ミッチィデス (@mitchydeath) June 4, 2019
先ほど書いたライブコーディングで伝えられなかったですがChannelのDispose例です!
— ミッチィデス (@mitchydeath) June 4, 2019
これをやらないと実行停止を繰り返したときに死にます。https://t.co/zsNH5sS4ER#MagicOnion
#2. The Patterns of MagicOnion
本日発表した資料「The Usage and Patterns of MagicOnion」です! #MagicOnion https://t.co/hmPHins7Fv
— neuecc (@neuecc) June 4, 2019
MagicOnionとは
gRPCベースでなんでもできるネットワークエンジン
できるのはサーバーを通したRPC
RPCとははネットワークごしにメソッドをよぶこと
MagicOnionは究極の土管
どこまでも応用がきいてなんでもできる。
重要なのはサーバープログラムを透明にしないこと
どっちも大事です。クライアントだけで完結などはナンセンス。
クラウドサーバー間のRPCをどれだけ書きやすくできるかということをMagicOnionは追求しています。
P2Pじゃない
P2Pは結構複雑
サーバーを通して通信すると考えるだけで結構シンプルになります。
実装パターン
サーバーとクライアントをどうシェアするかがはまりどころ
コピペで済ませていいんです
ホスティング
ホスティング用のパッケージが専用に用意されています
これを使えば全部やってくれます
ASP.Net Coreなど標準のしくみに乗っかっています
コンテナカット
コピペでOKです
デプロイ
CIを使えばおおむねOK(CircleCIをオススメ、いい感じに処理してくれます)
ここも意味わかんなくてもコピペすればOK
リアルタイムサーバー
ストリーミングハブを使いましょう
マッチングサービスは自分で作る必要があります(Open Matchがおすすめ)
ただ現状微妙、自前で作った方がいいでしょう。
MagicOnionは外部のミドルウェアやサービスに全乗りできるのがいいところ。
他のシステムに乗っかって、組み合わせて作ることができます。
これからのロードマップ
Pure C#
コードジェネレートの改善
サーバーサイドのゲームループ
テレメトリ改善
サーバーレス対応
まとめ
オレオレフレームワークにしないようにしています
UniRxのようにほかのところでも使える知識を得られるようにしたい
#3. 明日から使えるMagicOnion
Office Onlineユーザで申し訳ないのですが、資料あげておきます https://t.co/KuUafxXuUg #MagicOnion
— きみか (@kimika127) June 4, 2019
MagicOnionはHTTP/2を使っています(前は1を使っていた)
2はコネクションを張りっぱなし
指定のアドレスを聞きに行くのではなくgRPCなどのライブラリを使います
gRPCは見慣れない部分が多いがMagicOnionならC#の構文で書くことができます
MagicOnionの使用目的
Unity以外でも使えます、デスクトップアプリでも
MagicOnionはPhotonWireをベースに洗練されたものです
それぞれの特徴を生かして使っていきましょう
MagicOnionの強み
・定義がC#で完結します
・VisualStudioのサポートを受けることで実装速度が向上します
・.NET Core対応
・Unity対応
・作っている人が日本にいます
MagicOnionの弱み
・実績がまだない
・会社で導入するには実績がないとつらい
・C#がきらいな人にとってはつらい
・ノウハウの情報が少ない
MagicOnionの勘違い
・通信は遅いということはない
モバイル用だとどうやってもかかる
・サーバーサイドC#は遅いということはない
・全部C#なら実装速度早いのでは
MagicOnionで得られるのはサーバー・クライアントの透明性
両方C#なのでクライアントエンジニアがサーバーを読みやすい
C#は実装の速度は速くなるがリリースの速度が速くなるというわけではない
UniRxとMagicOnion
・一部コンポーネントが被る
・MVRPを使うならHub/ReceiverはModelが持つべき
Hub/Receiverはクライアント視点でどこで使うのかを見てわけるとよい
チームの話
サーバーとクライアントが同じ言語ならチームメンバーが両方やるべきか?
サーバーはサーバーで専用の知識が必要だったりする、ただチーム構成は広がります
Unityエディタ拡張
gRPCがよくUnityを殺します
gRPCがゾンビ化するので寿命管理はしっかりやりましょう
リアルタイム通信
多少の遅れが認められるもの
毎フレーム状態が変わるものはオンメモリでやったほうが楽
mocとmpc
メッセージパックのresolverの作成
本来はリフレクションを使うところだが、IL2CPP向けにこういうのがあります
まとめ
こういうプロジェクトを作りました
さっき言ってたリポジトリこれです https://t.co/1afohIPnrx #MagicOnion
— きみか (@kimika127) June 4, 2019
#4. MagicOnionでの共通処理の挟み方
本日の資料です https://t.co/0Yin4wfzX0 #MagicOnion
— ぱすた (@p_a_sta) June 4, 2019
サーバーサイド
2つやりかたがあります
・MagicOnionFilter
・gRPCInterceptor
どっちもgRPCの前後に処理を挟むものです
どっちを使えばいいのかというと、それぞれできることが違います。
クライアントサイド
gRPCでやるしかないです
戻り値がasyncじゃないので作る必要があります
エラーハンドリング
gRPCではAggregateExceptionが発生します
ただしInterceptorを複数重ねるとその数だけラップされ取り出しづらくなってしまう
そのため1クラスにまとめて書いた方がいいです
リトライ処理
リトライをする方法がなさそうなので拡張メソッドをつくる必要があります
まとめ
サーバーは要件に合うほうを使いましょう
クライアントはgRPCのみ
できないことは頑張って実装しましょう
LT1. MagicOnionをContainer化してkubernetesで動かしてNew Relicで監視する
今夜の #MagicOnion 勉強会のLT資料を事前に公開します。資料更新するとURL変わるのでとりあえず。
— たなか 🍣🍖🐡🐳 (@tanaka_733) June 4, 2019
LTではデモ中心にしたいと思います。https://t.co/Qb0TWRYjMI
LT2. MagicOnionを使う場合と使わない場合
スライド盛大に壊れていたので再UPしました(すみません)https://t.co/IHXQSjT9IE
— gsino (@gsino_) June 4, 2019
MagicOnionとgPRCはうまく使い分けようというお話
LT3. リアルタイムなゲームの開発でコンテナを使ってみたら簡単便利で激安だったのでオススメしたい!
遅くなりましたが、昨日のMagicOnion勉強会のLT資料をアップしましたー!
— 南@エンジニア兼ティーアドバイザー (@_y_minami) June 5, 2019
リアルタイムなゲームの開発でコンテナを使ってみたら簡単便利で激安だったのでオススメしたいhttps://t.co/X7mhCKa8gs
リアルタイムなゲームはサーバーでコンテナで動かしましょう
最初はローカルでやっていくとあとからつらくなる
コンテナの敷居は高くない
コンテナ化は簡単
Qittaに記事にしました。
コンテナの起動めんどそう
実際めんどいです
apiで操作しましょう
私はazureを使っています
個人開発だしサーバーにお金かけたくない
コンテナを動かす構成は非常に安い
私の場合だと91円
コンテナは安くて便利で手軽
ぜひ使ってみてください
タイムライン
配信URIはこちらです!
— とりすーぷ (@toRisouP) June 4, 2019
MagicOnion勉強会 https://t.co/CK1hGw6bv4 @YouTubeさんから#MagicOnion
APIはInterfaceの形で定義する。
— 鉄 (@tetsujp84) June 4, 2019
ライブコーディングでクライアントとサーバーのコードを切り替えることなく記述している。#MagicOnion
MagicOnionはサーバー、クライアントでinterface定義を共有する必要がある
— 獏星(ばくすたー) / Megumi Baxter (@baku_dreameater) June 4, 2019
→最悪コピペでもOKだがプロジェクト間でコードをリンクするとgood#MagicOnion
・MagicOnionは遅い?→MagicOnion自体は遅くない。無線自体の混線で遅くなる事はある
— 獏星(ばくすたー) / Megumi Baxter (@baku_dreameater) June 4, 2019
・サーバサイドC# って遅い?→遅くない
・ぜんぶC# なら速い?→半分正解、チームや構成による#MagicOnion
@kimika127 さんの
— 目玉P (@medamap) June 4, 2019
明日から使える MagicOnion
コネクション貼りっぱなしで TCP や UDP でごにょごにょしてたのが楽になった。
定義を C# でかける
シリアライズは MessagePack#MagicOnion
当初はClient用はgRPCのInterceptorでいいじゃん、と思って作らなかったのですが、実際Interceptorかなりイケてないので、Client用のFilterも用意したほうがいいかも……。 #MagicOnion
— neuecc (@neuecc) June 4, 2019
なわとびの話これで印象のこってたんだwhttps://t.co/1JtDMERZqN
— えむにわ (@m2wasabi) June 4, 2019
#MagicOnion
帰宅した。
— Simplestar (@lpcwstr) June 4, 2019
Unity による VRM オンラインチャットは 4 人同時プレイしてきたけど、まったく問題なかった。#MagicOnion 使ってます。
プレイヤー同士で何か相互作用あったらもっと面白いのに…と言われた
あと、開発者もだけどけっこう3D酔いしたので、カメラの動き気をつけないとな
本日の #MagicOnion 勉強会、実務に活かせる知見が得られたし、生すーぷさんの生KAWAIIムーブが見れたしホントよかった。
— 幕田ツマコ← (@makutatsumako) June 4, 2019
東京では Grani の同窓会 () が開かれていたと聞いて#MagicOnion
— じんぐる (@xin9le) June 4, 2019
間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。