Mercurial > hg > Papers > 2022 > riono-master
changeset 57:309de2ffb2bd
update
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 14 Feb 2022 20:57:33 +0900 |
parents | 01087d212c1a |
children | c269b11bb810 |
files | Slide/master-slide.html Slide/master-slide.md |
diffstat | 2 files changed, 125 insertions(+), 109 deletions(-) [+] |
line wrap: on
line diff
--- a/Slide/master-slide.html Mon Feb 14 17:25:33 2022 +0900 +++ b/Slide/master-slide.html Mon Feb 14 20:57:33 2022 +0900 @@ -429,6 +429,14 @@ </li> </ul> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> + + <h3 id="書き換えの方針">書き換えの方針</h3> <ul> <li>C#で記述するChristieをChristie Sharpとする</li> @@ -442,6 +450,14 @@ </li> </ul> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> + + <h3 id="java-からの変更点">Java からの変更点</h3> <ul> <li>Java とC# は基本的に書き方は変わらない</li> @@ -754,38 +770,42 @@ <h3 id="christie--on-unityのコード例">Christie # on Unityのコード例</h3> -<pre><code class="language-cs:UnityStartHelloWorld.cs">public class StartHelloWorld : StartCodeGear { - - public StartHelloWorld(CodeGearManager cgm) : base(cgm) { } +<pre><code class="language-cs:TransformMoveTest.cs">public class TransformMoveTest : MonoBehaviour { + private CodeGearManager cgm; + public Transform otherTransform; + private Vector3 pos; - public void RunCodeGear(CodeGearManager cgm) { - cgm.Setup(new HelloWorldCodeGear()); - cgm.Setup(new FinishHelloWorld()); - cgm.GetLocalDGM().Put("helloWorld", "hello"); - cgm.GetLocalDGM().Put("helloWorld", "world"); + void Start() { + cgm = StartCodeGear.CreateCgm(10000); + cgm.Setup(new PositionAssignCodeGear()); + cgm.GetLocalDGM().Put("transform", transform); + } + + public void Update() { + pos = otherTransform.position; + Vector3 newPos = new Vector3(pos.x + 3, pos.y, pos.z + 3); + cgm.GetLocalDGM().Put("pos", newPos); + } + + private void LateUpdate() { + cgm.Setup(new PositionAssignCodeGear()); } } + </code></pre> -<pre><code class="language-cs:UnityHelloWorld.cs">public class HelloWorld : MonoBehaviour { - void Start() { - CodeGearManager cgm = StartCodeGear.CreateCgm(10000); - var helloWorld = new StartHelloWorld(cgm); - helloWorld.RunCodeGear(cgm); +<pre><code class="language-cs:PositionAssingCodeGear.cs">public class PositionAssignCodeGear : CodeGear { + [Take] private Vector3 pos; + [Peek] private Transform transform; + + public override void Run(CodeGearManager cgm) { + MainThreadDispatcher.Post(_ => { + transform.position = pos; + }, null); } } + </code></pre> -<ul> - <li>HelloWorldCodeGearと、FinishHelloWorld はそのまま使用</li> - <li>StartHelloWorld をUnity で使用できるように書き換え - <ul> - <li>Unity ではMonoBehaviour 継承したクラスが動作可能</li> - <li>ゲーム開始時に1度だけ呼ばれるStart 関数</li> - <li>Start 関数でCGM のインスタンスを生成</li> - <li>Main 関数を名前を変えたRunCodeGear 関数を実行</li> - </ul> - </li> -</ul> @@ -796,7 +816,7 @@ <h3 id="unityで使用されているライブラリとの比較">Unityで使用されているライブラリとの比較</h3> -<p>Unityで使用されている既存のライブラリとして、Photon Unity Networking 2(PUN2)、MLAPIと、Christie # の比較を行う。</p> +<p>Unityで使用されている既存のライブラリとして、Photon Unity Networking 2(PUN2)、Mirrorと、Christie # の比較を行う。</p> <table> <thead> @@ -804,7 +824,7 @@ <th> </th> <th>Christie #</th> <th>PUN2</th> - <th>MLAPI</th> + <th>Mirror</th> </tr> </thead> <tbody> @@ -837,38 +857,20 @@ <!-- _S9SLIDE_ --> -<!-- -### チート対策について -* オンラインゲームにおいてチート対策は必須 -* 通常のオンラインゲームでのチート対策 - * クライアントをモニタリングする - * ダメージ計算などは全てサーバで行う - * ユーザからの通報 - -* Christie では型があるDataGear をkey と合わせてDGMに格納する方式を取っている - * 他のノードとの通信にはDGM のporxy に書き込むことで可能 - * DGM の構成にはTopology Manager が自動的に構成する -* Topology Manager を使用することでクライアントは接続先を直接知る必要がない - * IP address などチートに使用される情報をプログラムに含めることなく通信可能 - -<center><img src="https://i.imgur.com/L8GVFdL.png" alt="message" width="450" height="260"></center> -<center>label を使用したデータ通信</center> - ---> - -<h3 id="実装の現状">実装の現状</h3> +<h3 id="christie-sharpの利点">Christie Sharpの利点</h3> <ul> - <li>Local DGMを使用してUnity 上でデータ通信を行うことができている</li> - <li>Scketo とMessagePack を用いた通信に関しては、書き換え途中 + <li>単体でも並列処理が可能 <ul> - <li>独自クラスをMessagePack でserialize できない</li> + <li>CodeGear/DataGearを利用した待ち合わせ処理</li> + <li>CodeGearの処理はTaskによってThreadPoolで行われる</li> + <li>外部のライブラリを使用しなくてもUnityで強力な並列処理が可能</li> </ul> </li> - <li>今後の予定 + <li>通信が切断した際にゲームロジックが停止しない <ul> - <li>Christie で実装されている例題</li> - <li>Alice からChristie に書き換えた際に取り除かれた機能の洗い出しを行う</li> - <li>Unity でChristie #の検証として100人規模のFPS の作成</li> + <li>通信先の参照データをPeekで取得する</li> + <li>DGMでproxyとしてデータはやりとりされているため、データは更新されないが参照は可能</li> + <li>TopologyManagerにCookieの機能があるため、改良すれば切断から復帰可能であると考える</li> </ul> </li> </ul> @@ -884,10 +886,19 @@ <h3 id="まとめ">まとめ</h3> <ul> <li>Christie をUnity で使用するためにC# に書き換えを行った</li> - <li>書き換え方針としては、attribute やMessagePack などC# 独自の機能に対応しつつ元のソースコードと同一になるようにした</li> - <li>実装としては、localDataGearManager を用いた同一プロセスで複数インスタンス立ち上げによる通信が可能</li> - <li>Remote DataGearManager を使用した複数台の通信については書き換え途中であり、引き続き行っていく</li> - <li>Christie の検証のためUnity で100人規模のFPS を作成する</li> + <li>書き換え方針としては、attribute やMessagePack などC# 独自の機能に対応しつつ元のソースコードと同じ機能になるようにした</li> + <li>Unityで動作検証を行い、正しく動作することを確認した</li> + <li>Unity既存のライブラリとの比較を行った</li> +</ul> + +<h3 id="今後の課題">今後の課題</h3> +<ul> + <li>TopologyManagerの完成 + <ul> + <li>2nd keyを用いたTreeMapの通信</li> + </ul> + </li> + <li>Christie の性能検証を行う</li> </ul>
--- a/Slide/master-slide.md Mon Feb 14 17:25:33 2022 +0900 +++ b/Slide/master-slide.md Mon Feb 14 20:57:33 2022 +0900 @@ -203,6 +203,8 @@ * C\#とJavaは記述方法が非常に似ており、APIもほとんど同様な機能が実装されている * リポジトリをネスト化して対応 +--- + ### 書き換えの方針 * C\#で記述するChristieをChristie Sharpとする @@ -212,6 +214,9 @@ * MessagePackのバージョンアップ * ThreadPoolからTaskへ変更 + +--- + ### Java からの変更点 * Java とC# は基本的に書き方は変わらない @@ -254,6 +259,7 @@ } ``` + ```cs:CountUpper.cs public class CountUpper : CodeGear { [Take] public CountObject count; @@ -272,6 +278,7 @@ } ``` + ```cs:CountObject.cs [MessagePackObject] public class CountObject { @@ -451,43 +458,52 @@ --- ### Christie \# on Unityのコード例 -```cs:UnityStartHelloWorld.cs -public class StartHelloWorld : StartCodeGear { - - public StartHelloWorld(CodeGearManager cgm) : base(cgm) { } +```cs:TransformMoveTest.cs +public class TransformMoveTest : MonoBehaviour { + private CodeGearManager cgm; + public Transform otherTransform; + private Vector3 pos; - public void RunCodeGear(CodeGearManager cgm) { - cgm.Setup(new HelloWorldCodeGear()); - cgm.Setup(new FinishHelloWorld()); - cgm.GetLocalDGM().Put("helloWorld", "hello"); - cgm.GetLocalDGM().Put("helloWorld", "world"); + void Start() { + cgm = StartCodeGear.CreateCgm(10000); + cgm.Setup(new PositionAssignCodeGear()); + cgm.GetLocalDGM().Put("transform", transform); + } + + public void Update() { + pos = otherTransform.position; + Vector3 newPos = new Vector3(pos.x + 3, pos.y, pos.z + 3); + cgm.GetLocalDGM().Put("pos", newPos); + } + + private void LateUpdate() { + cgm.Setup(new PositionAssignCodeGear()); } } + ``` -```cs:UnityHelloWorld.cs -public class HelloWorld : MonoBehaviour { - void Start() { - CodeGearManager cgm = StartCodeGear.CreateCgm(10000); - var helloWorld = new StartHelloWorld(cgm); - helloWorld.RunCodeGear(cgm); +```cs:PositionAssingCodeGear.cs +public class PositionAssignCodeGear : CodeGear { + [Take] private Vector3 pos; + [Peek] private Transform transform; + + public override void Run(CodeGearManager cgm) { + MainThreadDispatcher.Post(_ => { + transform.position = pos; + }, null); } } + ``` -* HelloWorldCodeGearと、FinishHelloWorld はそのまま使用 -* StartHelloWorld をUnity で使用できるように書き換え - * Unity ではMonoBehaviour 継承したクラスが動作可能 - * ゲーム開始時に1度だけ呼ばれるStart 関数 - * Start 関数でCGM のインスタンスを生成 - * Main 関数を名前を変えたRunCodeGear 関数を実行 --- ### Unityで使用されているライブラリとの比較 -Unityで使用されている既存のライブラリとして、Photon Unity Networking 2(PUN2)、MLAPIと、Christie # の比較を行う。 +Unityで使用されている既存のライブラリとして、Photon Unity Networking 2(PUN2)、Mirrorと、Christie # の比較を行う。 -| | Christie # | PUN2 | MLAPI | +| | Christie # | PUN2 | Mirror | |--- |--- | --- |---| |通信方式 |p2p |クライアントサーバ方式 | クライアントサーバ方式| |プロトコル | TCP | TCP | TCP | @@ -495,42 +511,31 @@ --- -<!-- -### チート対策について -* オンラインゲームにおいてチート対策は必須 -* 通常のオンラインゲームでのチート対策 - * クライアントをモニタリングする - * ダメージ計算などは全てサーバで行う - * ユーザからの通報 - -* Christie では型があるDataGear をkey と合わせてDGMに格納する方式を取っている - * 他のノードとの通信にはDGM のporxy に書き込むことで可能 - * DGM の構成にはTopology Manager が自動的に構成する -* Topology Manager を使用することでクライアントは接続先を直接知る必要がない - * IP address などチートに使用される情報をプログラムに含めることなく通信可能 +### Christie Sharpの利点 +* 単体でも並列処理が可能 + * CodeGear/DataGearを利用した待ち合わせ処理 + * CodeGearの処理はTaskによってThreadPoolで行われる + * 外部のライブラリを使用しなくてもUnityで強力な並列処理が可能 +* 通信が切断した際にゲームロジックが停止しない + * 通信先の参照データをPeekで取得する + * DGMでproxyとしてデータはやりとりされているため、データは更新されないが参照は可能 + * TopologyManagerにCookieの機能があるため、改良すれば切断から復帰可能であると考える -<center><img src="https://i.imgur.com/L8GVFdL.png" alt="message" width="450" height="260"></center> -<center>label を使用したデータ通信</center> ---> - -### 実装の現状 -* Local DGMを使用してUnity 上でデータ通信を行うことができている -* Scketo とMessagePack を用いた通信に関しては、書き換え途中 - * 独自クラスをMessagePack でserialize できない -* 今後の予定 - * Christie で実装されている例題 - * Alice からChristie に書き換えた際に取り除かれた機能の洗い出しを行う - * Unity でChristie #の検証として100人規模のFPS の作成 --- + ### まとめ * Christie をUnity で使用するためにC# に書き換えを行った -* 書き換え方針としては、attribute やMessagePack などC# 独自の機能に対応しつつ元のソースコードと同一になるようにした -* 実装としては、localDataGearManager を用いた同一プロセスで複数インスタンス立ち上げによる通信が可能 -* Remote DataGearManager を使用した複数台の通信については書き換え途中であり、引き続き行っていく -* Christie の検証のためUnity で100人規模のFPS を作成する +* 書き換え方針としては、attribute やMessagePack などC# 独自の機能に対応しつつ元のソースコードと同じ機能になるようにした +* Unityで動作検証を行い、正しく動作することを確認した +* Unity既存のライブラリとの比較を行った + +### 今後の課題 +* TopologyManagerの完成 + * 2nd keyを用いたTreeMapの通信 +* Christie の性能検証を行う