More Related Content
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例 PDF
MagicOnion~C#でゲームサーバを開発しよう~ PDF
The Usage and Patterns of MagicOnion PDF
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう PDF
フロー効率性とリソース効率性、再入門 #devlove #devkan PPTX
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料) PDF
[GKE & Spanner 勉強会] GKE 入門 What's hot
PDF
PDF
What’s new in cloud run 2021 後期 PDF
PDF
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築 PPTX
PDF
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online PDF
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門 PDF
「自分のとこでは動くけど…」を無くす devcontainer PDF
怖くないSpring Bootのオートコンフィグレーション PDF
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 PDF
Apache Arrow - データ処理ツールの次世代プラットフォーム PDF
PDF
分散トレーシング技術について(Open tracingやjaeger) PDF
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions PDF
PDF
Google Cloud のネットワークとロードバランサ PPTX
Azure Api Management 俺的マニュアル 2020年3月版 PPTX
JAZUG12周年 俺の Azure Cosmos DB PDF
Building the Game Server both API and Realtime via c# Similar to Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現 PDF
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現 PDF
A quick tour of the Cysharp OSS PPTX
PDF
Implements OpenTelemetry Collector in DotNet PDF
PDF
PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework PDF
20140830 2014年版 C #でできること PDF
NextGen Server/Client Architecture - gRPC + Unity + C# PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用 PPTX
PPTX
PDF
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた PDF
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース! PDF
【Unite Tokyo 2019】Understanding C# Struct All Things PPTX
Using or not using magic onion PPTX
PPTX
.NET ラボ 勉強会 C# でラインプラットフォーム開発 PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例 More from Yoshifumi Kawai
PDF
A Brief History of UniRx/UniTask, IUniTaskSource in Depth PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能 PDF
Deep Dive async/await in Unity with UniTask(EN) PDF
Memory Management of C# with Unity Native Collections PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async) PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する PDF
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践 PPTX
RuntimeUnitTestToolkit for Unity(English) PPTX
RuntimeUnitTestToolkit for Unity PDF
How to make the Fastest C# Serializer, In the case of ZeroFormatter PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法 PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC PDF
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの... PDF
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ... PPTX
Clash of Oni Online - VR Multiplay Sword Action PDF
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery PDF
History & Practices for UniRx(EN) PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法 PDF
Introduction to NotifyPropertyChangedGenerator Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
- 1.
- 2.
講演者プロフィール
• 河合 宜文/ Kawai Yoshifumi / @neuecc
• Cysharp, Inc. – CEO/CTO
• 株式会社Cygamesの子会社としてC#関連の研究開発やコンサ
ルティングを行う
• メインミッションはC#大統一理論(サーバー/クライアント共にC#で
実装する)の推進
• 株式会社アプリボットの新規タイトル(タイトル未発表)におけ
るMagicOnionの導入と周辺の基盤開発を担当
- 5.
- 6.
MagicOnion
• Unified Realtime/APIEngine for .NET Core and Unity
• https://github.com/Cysharp/MagicOnion/
• Cysharp開発のC#によるOSSのネットワークエンジン
• リアルタイム系もAPI系も両方OK
• HTTP/2 gRPCの上に構築され、高性能とスタンダードを両立
• .NET CoreによるLinuxホスティングと完全なコンテナ対応
• 現在GitHub Starが1000以上と、国内外でも注目度上昇中
• パフォーマンスとC#としての使い勝手にこだわって開発
• C#のエキスパートが最初からUnity C#も前提に組み立てているた
め、C#のためのエンジンとして高い品質を誇る
- 7.
public class TestService: ITestService
{
// パブリックメソッドがそのままgRPC定義
public async UnaryResult<int> Sum(int x, int y)
{
// async/awaitにも自然に対応
// マジカル技術によりasync Task<T>じゃなくてもawait可能
await Task.Yield();
return x + y;
}
}
// 普通のgRPCの接続を作る(MagicOnion用の特別なことはない)
var channel = new Channel("127.0.0.1:12345");
// 自然な書き味で、タイプセーフにRPC通信を実現
// C#のasync/await構文により、非同期通信も自然に見える
var client = MagicOnionClient.Create<ITestService>(channel);
var result = await client.Sum(100, 200);
クライアントもサーバーも自
然に繋がっているように見え
る(デバッガもサーバー/クラ
イアント共有でステップ実行
で繋がって動いていく)
- 9.
Why not (plain)gRPC
• protoはC#ではない!!!
• 故に言語の持つ
• 全ての型(Primitive, Nullable, Dictionaryなど)が使えない
• 属性(Attribute, Annotation)付与ができない
• リクエスト毎に必ず一つの型が必要になる
• 故にIDE(Visual Studio, Rider, etc...)の持つ
• シンタックスハイライトが効かない
• コードレンズなどのコード追跡機能が効かない
• リファクタリング支援(名前一括変更など)が効かない
• サーバー/クライアント大統一ならクライアント/サーバー超えて変更
される!
- 10.
C#がIDLなら
C# as aSchema
クライアント/サーバーの実装言語を
共にC#に固定することで、
通信スキーマそのものをC#で表現する
プロジェクト参照で済むので
IDLのバージョン管理が不要というのも運用上メリット
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
案D. C# toKotlinでコード共有(採用)
• C#を正としてUnity側中心にロジックを書いてしまい、Kotlin
側はC#からのコードジェネレートで生成する
• MicroBatchFramework
• https://github.com/Cysharp/MicroBatchFramework
• C#(.NET Core)でCLIツール作るのに便利なフレームワーク
• Roslyn(Microsoft.CodeAnalysis.CSharp)
• C#によるC#コンパイラ
• C#のAbstract Syntax Treeが取れる
- 22.
class Program :BatchBase
{
static async Task Main(string[] args)
{
await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync<Program>(args);
}
public void Generate(
[Option("i", "入力するフォルダ")]string inputDirectory,
[Option("o", "出力するフォルダ")]string outputDirectory)
{
foreach (var inputFilePath in Directory.GetFiles(inputDirectory,
"*.cs", SearchOption.AllDirectories))
{
var tree = CSharpSyntaxTree.ParseText(File.ReadAllText(inputFilePath));
var parseInfo = Parse(tree);
foreach (var item in parseInfo)
{
var template = new KotlinTemplate
{
ClassInfo = item
};
var code = template.TransformText();
var outPath = Path.Combine(outputDirectory, item.ClassName) + ".kt";
File.WriteAllText(outPath, code, Encoding.UTF8); }
CSharpSyntaxTree.ParseTextで.cs
ファイルからSyntaxTreeを取得
テンプレートエンジン(T4)を使って
Kotlinコードを生成
MicroBatchFrameworkによる
CLI定義と実装
ASTを元にテンプレートに当ては
める情報を生成(自前実装)
- 23.
- 24.
- 25.
- 26.
vs Unity .csproj
•UnityはUnityの管理下のソースコードのみ参照可能
• サーバーのcsprojは柔軟に記述できる
• よって共有するコードの実体をUnityのほうに置いて、サー
バー側ではコードリンクで参照する
<ItemGroup>
<Compile Include="..¥Unity¥Assets¥Scripts¥Shared¥**¥*.cs" />
</ItemGroup>
シンボリックリンクとか、ビルドしてマ
ネージドDLLを配置とかやるとトラブルの
元なので、シンプルな手段が一番
シェアするディレクトリはasmdef
で切っておくとより良い
- 27.
Unity Shimsの実装
• Unity依存コードの除去
•理想的には完全除去が望ましいが、特に開発中でUnity側主導でコード
ができあがっている場合、残ってしまっていることが多い
• ダミーの型を用意して回避するのが手っ取り早くは楽
namespace UnityEngine
{
public class ScriptableObject {}
public class MonoBehaviour {}
public sealed class SerializeFieldAttribute : Attribute
{
}
// etc...
}
意外と問題なく動いたり動かなかったり。
とりあえずコンパイル通す→動かして問題出た
とこを何とかする、で工数的にそんな多くかか
らず何とかなる、ことも少なくないかな、と。
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
MagicOnion is...
• HighPerformance
• gRPC(HTTP/2) + MessagePack-CSharp
• Modern Architecture
• .NET Core, Container, OpenTelemetry
• C# Friendly
• C# as a Schema
• Unity Friendly
• Runtime/CodeGen(for IL2CPP)
- 37.