Mercurial > hg > Papers > 2022 > riono-master
changeset 56:01087d212c1a
slide update
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 14 Feb 2022 17:25:33 +0900 |
parents | eb6cedaa62cc |
children | 309de2ffb2bd |
files | Slide/master-slide.html Slide/master-slide.md |
diffstat | 2 files changed, 452 insertions(+), 319 deletions(-) [+] |
line wrap: on
line diff
--- a/Slide/master-slide.html Sun Feb 13 21:02:47 2022 +0900 +++ b/Slide/master-slide.html Mon Feb 14 17:25:33 2022 +0900 @@ -123,9 +123,9 @@ <li>データの共有はサーバを経由するため低速</li> </ul> </li> - <li>当研究室で開発を行っているChristie の分散計算を使用することで、高速かつ安全に通信できると考えた</li> + <li>当研究室で開発を行っているChristie の分散計算を使用することで、高速に通信できると考えた</li> <li>Christie をUnity で使用するためにC# で書き換えを行った</li> - <li>実装としては、localDataGearManager を用いた同一プロセスで複数インスタンス立ち上げによる通信が可能</li> + <li>Christie SharpとUnity既存の通信フレームワークとの機能的な比較を行った</li> </ul> @@ -143,7 +143,7 @@ <li>分散プログラムを正しく書くことは難しい <ul> <li>ネットワークの変化、故障、性能の多様性を吸収する</li> - <li>スケーラビリティー リソースの追加のみでサービスの質の直感的に維持できる性能基準</li> + <li>スケーラビリティー リソースの追加のみでサービスの質の直感的に維持できる性能基準を備える</li> </ul> </li> <li>Debugも困難な場合が多い</li> @@ -168,7 +168,7 @@ <ul> <li>当研究室では並列分散通信フレームワークChristie を開発中である <ul> - <li>型のあるDataGear とKey を持つストリーム、DataGearManager として格納している</li> + <li>型のあるDataGear とKey を持つタプル空間、DataGearManager として格納している</li> <li>他のノードはDGM のproxyを持っており、proxy に書き込むことで通信を実現している</li> <li>DGM はトポロジーマネージャーによって自動的に構築される <ul> @@ -179,10 +179,8 @@ </ul> </li> <li>ネットワークが切断されてもゲームは継続可能</li> - <li> - <p>ノードが接続している対象を直接知ることはできない</p> - </li> - <li>本研究ではJava で書かれたChristieとC# で書き換えを行ったChristie #を説明し、その機能と実装の差について考察を行う</li> + <li>本研究ではChristieをC#で再実装を行い、Unityの通信ライブラリとして使用可能にする</li> + <li>既存のUnityの通信ライブラリとの機能面での比較を行い、Christie Sharpのオンラインゲーム向けの通信ライブラリとしての考察を行う</li> </ul> @@ -206,6 +204,11 @@ <li>DataGearManager (DGを管理,localとremoteの2種類がある, put操作によりDGを格納)</li> </ul> +<center><img src="../Paper/images/GearsRelationships.pdf" alt="message" width="550" height="350" /></center> +<center> +各Gearの関係性 +</center> + </div> @@ -215,11 +218,6 @@ <h3 id="christie-の基礎概念-1">Christie の基礎概念</h3> -<center><img src="https://i.imgur.com/ZvpoXGd.png" alt="message" width="450" height="300" /></center> -<center> -Christie を同一プロセスで複数インスタンス立ち上げた際の接続の構造図 -</center> - <ul> <li>全てのCGM はThreadPool と他のCGM をList として共有している</li> <li>ThreadPool はCPU に合わせた並列度でqueue に入ったThread を逐次実行していく @@ -229,6 +227,10 @@ </li> <li>ThreadPoolを共有することメタレベルで全てのCG/DG にアクセス可能</li> </ul> +<center><img src="../Paper/images/ChristieClass.pdf" alt="message" width="600" height="450" /></center> +<center> +Christie を同一プロセスで複数インスタンス立ち上げた際の接続の構造図 +</center> @@ -293,12 +295,13 @@ <!-- _S9SLIDE_ --> -<h3 id="topology-manager-1">Topology Manager</h3> +<h3 id="topology-manager静的topology">Topology Manager 静的Topology</h3> <ul> <li>静的Topology は以下のようなdot ファイルを与えることでNode の関係を構築できる</li> <li>それぞれのNode への通信にはIP address などは使用せずright というlabel を使用することで接続できる</li> </ul> +<center>dot 形式による node 間接続の記述</center> <pre><code class="language-ring.dot">digraph test { node0 -> node1 [label="right"] node1 -> node2 [label="right"] @@ -306,58 +309,27 @@ } </code></pre> -<center><img src="https://i.imgur.com/pCCHo2W.png" alt="message" width="200" height="300" /></center> -<center></center> - -<!--- - ---- - -### Christie のコード例 - -``` java:StartHelloWorld.java -public class StartHelloWorld extends StartCodeGear { +<center><img src="../Paper/images/ring.pdf" alt="message" width="480" height="300" /></center> +<center> +ring状の接続 +</center> - public StartHelloWorld(CodeGearManager cgm) { - super(cgm); - } + - public static void main(String[] args){ - CodeGearManager cgm = createCGM(10000); - cgm.setup(new HelloWorldCodeGear()); - cgm.setup(new FinishHelloWorld()); - cgm.getLocalDGM().put("helloWorld","hello"); - cgm.getLocalDGM().put("helloWorld","world"); - } -} -``` +</div> -```java:HelloWorldCodeGear.java -public class HelloWorldCodeGear extends CodeGear { +<div class='slide'> + <!-- _S9SLIDE_ --> - @Take String helloWorld; - @Override - protected void run(CodeGearManager cgm) { - System.out.print(helloWorld + " "); - cgm.setup(new HelloWorldCodeGear()); - cgm.getLocalDGM().put(helloWorld,helloWorld); - } -} -``` +<h3 id="topology-manager静的topology-1">Topology Manager 静的Topology</h3> +<ul> + <li>動的Topologyは以下の図のように自動的に接続される</li> + <li>現在はTree型の接続のみに対応している</li> +</ul> -```java:FinishHelloWorld.java -public class FinishHelloWorld extends CodeGear { - @Take String hello; - @Take String world; - - @Override - protected void run(CodeGearManager cgm) { - cgm.getLocalDGM().finish(); - } -} -``` ----> +<center><img src="../Paper/images/DynamicTopology.pdf" alt="message" width="1000" height="450" /></center> +<center>動的Topologyの接続手順</center> @@ -367,26 +339,53 @@ <!-- _S9SLIDE_ --> -<h3 id="java-からの変更点">Java からの変更点</h3> +<h3 id="christie-のコード例">Christie のコード例</h3> <ul> - <li>Java とC# は基本的に書き方は変わらない</li> + <li>コンストラクタで与えた数字をインクリメントし、10回printする例題 + <pre><code class="language-java:StartCountup.java">public class StartCountup extends StartCodeGear { + public StartCountup(CodeGearManager cgm) { super(cgm); } + + public static void main(String args[]) { + StartCountup start = StartCountup(createCGM(10001)); + } + + @Override + protected void run(CodeGearManager cgm) { + cgm.setup(new CountUpper()); + CountObject count = new CountObject(1); + put("count", count); + } +} +</code></pre> + <p>```java:CountUpper.java +public class CountUpper extends CodeGear { + @Take + public CountObject count;</p> + + <p>@Override + protected void run(CodeGearManager cgm) { + System.out.println(count);</p> + + <pre><code> if (count < 10) { + cgm.setup(new CountUpper()); + count.number += 1; + put("count", count); + } else { + cgm.getLocalDGM().finish(); + } } } +</code></pre> + </li> </ul> -<pre><code class="language-java:ex.java">Java -public class StartHelloWorld extends StartCodeGear { } - -@Override -protected void run(CodeGearManager cgm) { } +<pre><code>```java:CountObject.java +@Message +public class CountObject { + public int number; -@Take String helloWorld; -</code></pre> - -<pre><code class="language-cs:ex.cs">C# -public class StartHelloWorld : StartCodeGear { } - -public override void Run(CodeGearManager cgm) { } - -[Take] string helloWorld; + public CountObject(int number) { + this.number = number; + } +} </code></pre> @@ -397,67 +396,9 @@ <!-- _S9SLIDE_ --> -<h3 id="christie--のコード例">Christie # のコード例</h3> -<pre><code class="language-cs:StartHelloWorld.cs">public class StartHelloWorld : StartCodeGear { - - public StartHelloWorld(CodeGearManager cgm) : base(cgm) { } - - public static void Main(string[] args) { - CodeGearManager cgm = CreateCgm(10000); - cgm.Setup(new HelloWorldCodeGear()); - cgm.Setup(new FinishHelloWorld()); - cgm.GetLocalDGM().Put("helloWorld", "hello"); - cgm.GetLocalDGM().Put("helloWorld", "world"); - } -} -</code></pre> - -<pre><code class="language-cs:HelloWorldCodeGear.cs">public class HelloWorldCodeGear : CodeGear { - [Take] string helloWorld; - - public override void Run(CodeGearManager cgm) { - Console.Write(helloWorld + " "); - cgm.Setup(new HelloWorldCodeGear()); - cgm.GetLocalDGM().Put(helloWorld, helloWorld); - } -} -</code></pre> - -<pre><code class="language-cs:FinishHelloWorld.cs">public class FinishHelloWorld : CodeGear { - [Take] private string hello; - [Take] private string world; +<h3 id="christie-のコード例-1">Christie のコード例</h3> - public override void Run(CodeGearManager cgm) { - cgm.GetLocalDGM().Finish(); - } -} -</code></pre> - -<ol> - <li>Main関数でCGM のインスタンス生成</li> - <li>2つのCG をsetupして待ち状態にする</li> - <li>key:hellowWorld data:”hello” がTake される</li> - <li>変数が揃ったためStartHelloWorld のRun が実行される</li> - <li>“hello” がprintされ、再び待ち状態になる。 key:hellow data:”hello”がput される</li> - <li>key:hellowWorld data:”world” がTake され、4,5と同様に処理される</li> - <li>変数hello とworld がput され揃ったため、FinishHelloWorld のRun が実行され、プログラムは終了する</li> -</ol> - -<h3 id="unity">Unity</h3> -<ul> - <li>UnityはUnity Technologies が開発を行っているゲームエンジンである - <ul> - <li>世界で最も使用されているゲームエンジン</li> - <li>非常に軽く、スペックが低いノートPCでもゲーム開発が可能</li> - </ul> - </li> - <li>プログラミング言語にはC# が採用されている - <ul> - <li>C# のAPI やUnity 向けに拡張されたAPIも使用可能</li> - <li>開発した機能をUnity に組み込むことも可能</li> - </ul> - </li> -</ul> +<p>シーケンス図を使った説明</p> @@ -467,39 +408,122 @@ <!-- _S9SLIDE_ --> -<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) { } +<h3 id="cへの書き換えの意義">C#への書き換えの意義</h3> +<ul> + <li>ChristieはJavaで実装されている + <ul> + <li>C#に書き換えを行うべきか</li> + </ul> + </li> + <li>Unityはandroidの開発向けにjarファイルからJavaのメソッドをC#上で呼び出せる機能がある + <ul> + <li>stringを使用してリソースディレクトリから検索し、使用</li> + <li>高速化が求められる並列分散プログラミングには不適</li> + </ul> + </li> + <li>JavaとC#の2つの管理が必要になる + <ul> + <li>C#とJavaは記述方法が非常に似ており、APIもほとんど同様な機能が実装されている</li> + <li>リポジトリをネスト化して対応</li> + </ul> + </li> +</ul> + +<h3 id="書き換えの方針">書き換えの方針</h3> +<ul> + <li>C#で記述するChristieをChristie Sharpとする</li> + <li>Christie設計時の意図や、互換性を保つためChristieと同じ動作をさせる</li> + <li>ChristieはJava9から開発されており、非推奨なコードやが含まれている</li> + <li>C#に対応しつつ、処理動作の向上や最適化を行うために以下の変更を行った + <ul> + <li>MessagePackのバージョンアップ</li> + <li>ThreadPoolからTaskへ変更</li> + </ul> + </li> +</ul> - public void RunCodeGear(CodeGearManager cgm) { - cgm.Setup(new HelloWorldCodeGear()); - cgm.Setup(new FinishHelloWorld()); - cgm.GetLocalDGM().Put("helloWorld", "hello"); - cgm.GetLocalDGM().Put("helloWorld", "world"); +<h3 id="java-からの変更点">Java からの変更点</h3> +<ul> + <li>Java とC# は基本的に書き方は変わらない</li> +</ul> + +<pre><code class="language-java:ex.java">Java +public class StartCountup extends StartCodeGear { } + +@Override +protected void run(CodeGearManager cgm) { } + +@Take String countObject; +</code></pre> + +<pre><code class="language-cs:ex.cs">C# +public class StartCountup : StartCodeGear { } + +public override void Run(CodeGearManager cgm) { } + +[Take] string countObject; +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> + + +<h3 id="christie-sharp-のコード例">Christie Sharp のコード例</h3> +<pre><code class="language-cs:StartCountUp.cs">public class StartCountUp : StartCodeGear { + public StartCountUp(CodeGearManager cgm) : base(cgm) { } + + public static void Main(string[] args) { + StartCountUp start = StartCountUp(createCGM(10001)); + } + + public override void Run(CodeGearManager cgm) { + cgm.Setup(new CountUpper()); + CountObject count = new CountObject(1); + put("count", count); } } </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:CountUpper.cs">public class CountUpper : CodeGear { + [Take] public CountObject count; + + public override void Run(CodeGearManager cgm) { + Console.WriteLine(count.number); + + if (count.number < 10) { + cgm.Setup(new CountUpper()); + count.number += 1; + put("count", count); + } else { + cgm.GetLocalDGM().Finish(); + } } } </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> + +<pre><code class="language-cs:CountObject.cs">[MessagePackObject] +public class CountObject { + public int number; + + public CountObject(int number) { + this.number = number; + } +} +</code></pre> +<!-- +1. Main関数でCGM のインスタンス生成 +2. 2つのCG をsetupして待ち状態にする +3. key:hellowWorld data:"hello" がTake される +4. 変数が揃ったためStartHelloWorld のRun が実行される +5. "hello" がprintされ、再び待ち状態になる。 key:hellow data:"hello"がput される +6. key:hellowWorld data:"world" がTake され、4,5と同様に処理される +7. 変数hello とworld がput され揃ったため、FinishHelloWorld のRun が実行され、プログラムは終了する + +--> @@ -647,9 +671,7 @@ <li>Christie # ではThreadPoolより高機能なTask を用いて書き換えを行った</li> </ul> </li> - <li> - <p>Task は複雑な非同期処理を通常のコーディングと同じ感覚で直感的に記述できる</p> - </li> + <li>Task は複雑な非同期処理を通常のコーディングと同じ感覚で直感的に記述できる</li> <li>裏でThreadPool が動くようになっている <ul> <li>大きく動作は変わらない</li> @@ -707,6 +729,72 @@ <!-- _S9SLIDE_ --> +<h3 id="unity">Unity</h3> +<ul> + <li>UnityはUnity Technologies が開発を行っているゲームエンジンである + <ul> + <li>世界中で使用されているゲームエンジン</li> + <li>非常に軽く、スペックが低いノートPCでもゲーム開発が可能</li> + </ul> + </li> + <li>プログラミング言語にはC# が採用されている + <ul> + <li>C# のAPI やUnity 向けに拡張されたAPIも使用可能</li> + <li>開発した機能をUnity に組み込むことも可能</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> + + +<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) { } + + public void RunCodeGear(CodeGearManager cgm) { + cgm.Setup(new HelloWorldCodeGear()); + cgm.Setup(new FinishHelloWorld()); + cgm.GetLocalDGM().Put("helloWorld", "hello"); + cgm.GetLocalDGM().Put("helloWorld", "world"); + } +} +</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); + } +} +</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> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> + + <h3 id="unityで使用されているライブラリとの比較">Unityで使用されているライブラリとの比較</h3> <p>Unityで使用されている既存のライブラリとして、Photon Unity Networking 2(PUN2)、MLAPIと、Christie # の比較を行う。</p> @@ -749,32 +837,25 @@ <!-- _S9SLIDE_ --> -<h3 id="チート対策について">チート対策について</h3> -<ul> - <li>オンラインゲームにおいてチート対策は必須</li> - <li>通常のオンラインゲームでのチート対策 - <ul> - <li>クライアントをモニタリングする</li> - <li>ダメージ計算などは全てサーバで行う</li> - <li>ユーザからの通報</li> - </ul> - </li> - <li>Christie では型があるDataGear をkey と合わせてDGMに格納する方式を取っている - <ul> - <li>他のノードとの通信にはDGM のporxy に書き込むことで可能</li> - <li>DGM の構成にはTopology Manager が自動的に構成する</li> - </ul> - </li> - <li>Topology Manager を使用することでクライアントは接続先を直接知る必要がない - <ul> - <li>IP address などチートに使用される情報をプログラムに含めることなく通信可能</li> - </ul> - </li> -</ul> +<!-- +### チート対策について +* オンラインゲームにおいてチート対策は必須 +* 通常のオンラインゲームでのチート対策 + * クライアントをモニタリングする + * ダメージ計算などは全てサーバで行う + * ユーザからの通報 -<center><img src="https://i.imgur.com/L8GVFdL.png" alt="message" width="450" height="260" /></center> +* 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> <ul> <li>Local DGMを使用してUnity 上でデータ通信を行うことができている</li>
--- a/Slide/master-slide.md Sun Feb 13 21:02:47 2022 +0900 +++ b/Slide/master-slide.md Mon Feb 14 17:25:33 2022 +0900 @@ -18,9 +18,9 @@ ### 概要 * オンラインゲームにおける通信にはクライアントサーバ方式が主流 * データの共有はサーバを経由するため低速 -* 当研究室で開発を行っているChristie の分散計算を使用することで、高速かつ安全に通信できると考えた +* 当研究室で開発を行っているChristie の分散計算を使用することで、高速に通信できると考えた * Christie をUnity で使用するためにC# で書き換えを行った -* 実装としては、localDataGearManager を用いた同一プロセスで複数インスタンス立ち上げによる通信が可能 +* Christie SharpとUnity既存の通信フレームワークとの機能的な比較を行った --- @@ -42,38 +42,40 @@ * DGM はトポロジーマネージャーによって自動的に構築される * プログラム自体はDGM の名前を知っていれば良い * 他のノードのIP addressなどを知る必要はない - -* ネットワークが切断されてもゲームは継続可能 -* ノードが接続している対象を直接知ることはできない - - -* 本研究ではJava で書かれたChristieとC# で書き換えを行ったChristie Sharpを説明し、 +* ネットワークが切断されてもゲームは継続可能 +* 本研究ではChristieをC#で再実装を行い、Unityの通信ライブラリとして使用可能にする +* 既存のUnityの通信ライブラリとの機能面での比較を行い、Christie Sharpのオンラインゲーム向けの通信ライブラリとしての考察を行う --- ### Christie の基礎概念 * Christie は当研究室で開発をしている並列分散通信フレームワークである * 同じく当研究室で開発しているGearsOS に導入予定のため次のような概念を持っている + * CodeGear (クラスやスレッド) * DataGear (変数データ) * CodeGearManager (CG,DG,DGMを管理) * DataGearManager (DGを管理,localとremoteの2種類がある, put操作によりDGを格納) +<center><img src="../Paper/images/GearsRelationships.pdf" alt="message" width="550" height="350" /></center> +<center> +各Gearの関係性 +</center> + --- ### Christie の基礎概念 -<center><img src="https://i.imgur.com/ZvpoXGd.png" alt="message" width="450" height="300"></center> +* 全てのCGM はThreadPool と他のCGM をList として共有している +* ThreadPool はCPU に合わせた並列度でqueue に入ったThread を逐次実行していく + * 1つのThreadPool で処理を行うことでCPU のコア数に適したThread を管理でき、並列度を下げ流ことを防ぐ +* ThreadPoolを共有することメタレベルで全てのCG/DG にアクセス可能 +<center><img src="../Paper/images/ChristieClass.pdf" alt="message" width="600" height="450"></center> <center> Christie を同一プロセスで複数インスタンス立ち上げた際の接続の構造図 </center> -* 全てのCGM はThreadPool と他のCGM をList として共有している -* ThreadPool はCPU に合わせた並列度でqueue に入ったThread を逐次実行していく - * 1つのThreadPool で処理を行うことでCPU のコア数に適したThread を管理でき、並列度を下げ流ことを防ぐ -* ThreadPoolを共有することメタレベルで全てのCG/DG にアクセス可能 - --- ### Christie の基礎概念 annotationについて @@ -101,10 +103,11 @@ --- -### Topology Manager +### Topology Manager 静的Topology * 静的Topology は以下のようなdot ファイルを与えることでNode の関係を構築できる * それぞれのNode への通信にはIP address などは使用せずright というlabel を使用することで接続できる +<center>dot 形式による node 間接続の記述</center> ```ring.dot digraph test { node0 -> node1 [label="right"] @@ -113,126 +116,173 @@ } ``` -<center><img src="https://i.imgur.com/pCCHo2W.png" alt="message" width="200" height="300"></center> -<center></center> +<center><img src="../Paper/images/ring.pdf" alt="message" width="480" height="300"></center> +<center> +ring状の接続 +</center> + + +--- + +### Topology Manager 静的Topology +* 動的Topologyは以下の図のように自動的に接続される +* 現在はTree型の接続のみに対応している + +<center><img src="../Paper/images/DynamicTopology.pdf" alt="message" width="1000" height="450" /></center> +<center>動的Topologyの接続手順</center> -<!--- +--- + +### Christie のコード例 +* コンストラクタで与えた数字をインクリメントし、10回printする例題 +``` java:StartCountup.java +public class StartCountup extends StartCodeGear { + public StartCountup(CodeGearManager cgm) { super(cgm); } + + public static void main(String args[]) { + StartCountup start = StartCountup(createCGM(10001)); + } + + @Override + protected void run(CodeGearManager cgm) { + cgm.setup(new CountUpper()); + CountObject count = new CountObject(1); + put("count", count); + } +} +``` +```java:CountUpper.java +public class CountUpper extends CodeGear { + @Take + public CountObject count; + + @Override + protected void run(CodeGearManager cgm) { + System.out.println(count); + + if (count < 10) { + cgm.setup(new CountUpper()); + count.number += 1; + put("count", count); + } else { + cgm.getLocalDGM().finish(); + } + } +} + +``` +```java:CountObject.java +@Message +public class CountObject { + public int number; + + public CountObject(int number) { + this.number = number; + } +} +``` --- ### Christie のコード例 -``` java:StartHelloWorld.java -public class StartHelloWorld extends StartCodeGear { - - public StartHelloWorld(CodeGearManager cgm) { - super(cgm); - } - - public static void main(String[] args){ - CodeGearManager cgm = createCGM(10000); - cgm.setup(new HelloWorldCodeGear()); - cgm.setup(new FinishHelloWorld()); - cgm.getLocalDGM().put("helloWorld","hello"); - cgm.getLocalDGM().put("helloWorld","world"); - } -} -``` - -```java:HelloWorldCodeGear.java -public class HelloWorldCodeGear extends CodeGear { - - @Take String helloWorld; +シーケンス図を使った説明 - @Override - protected void run(CodeGearManager cgm) { - System.out.print(helloWorld + " "); - cgm.setup(new HelloWorldCodeGear()); - cgm.getLocalDGM().put(helloWorld,helloWorld); - } -} -``` - -```java:FinishHelloWorld.java -public class FinishHelloWorld extends CodeGear { - @Take String hello; - @Take String world; - - @Override - protected void run(CodeGearManager cgm) { - cgm.getLocalDGM().finish(); - } -} -``` ----> --- +### C\#への書き換えの意義 +* ChristieはJavaで実装されている + * C\#に書き換えを行うべきか + +* Unityはandroidの開発向けにjarファイルからJavaのメソッドをC\#上で呼び出せる機能がある + * stringを使用してリソースディレクトリから検索し、使用 + * 高速化が求められる並列分散プログラミングには不適 +* JavaとC\#の2つの管理が必要になる + * C\#とJavaは記述方法が非常に似ており、APIもほとんど同様な機能が実装されている + * リポジトリをネスト化して対応 + + +### 書き換えの方針 +* C\#で記述するChristieをChristie Sharpとする +* Christie設計時の意図や、互換性を保つためChristieと同じ動作をさせる +* ChristieはJava9から開発されており、非推奨なコードやが含まれている +* C\#に対応しつつ、処理動作の向上や最適化を行うために以下の変更を行った + * MessagePackのバージョンアップ + * ThreadPoolからTaskへ変更 + ### Java からの変更点 * Java とC# は基本的に書き方は変わらない ```java:ex.java Java -public class StartHelloWorld extends StartCodeGear { } +public class StartCountup extends StartCodeGear { } @Override protected void run(CodeGearManager cgm) { } -@Take String helloWorld; +@Take String countObject; ``` ```cs:ex.cs C# -public class StartHelloWorld : StartCodeGear { } +public class StartCountup : StartCodeGear { } public override void Run(CodeGearManager cgm) { } -[Take] string helloWorld; +[Take] string countObject; ``` --- -### Christie \# のコード例 -```cs:StartHelloWorld.cs -public class StartHelloWorld : StartCodeGear { - - public StartHelloWorld(CodeGearManager cgm) : base(cgm) { } +### Christie Sharp のコード例 +```cs:StartCountUp.cs +public class StartCountUp : StartCodeGear { + public StartCountUp(CodeGearManager cgm) : base(cgm) { } public static void Main(string[] args) { - CodeGearManager cgm = CreateCgm(10000); - cgm.Setup(new HelloWorldCodeGear()); - cgm.Setup(new FinishHelloWorld()); - cgm.GetLocalDGM().Put("helloWorld", "hello"); - cgm.GetLocalDGM().Put("helloWorld", "world"); + StartCountUp start = StartCountUp(createCGM(10001)); + } + + public override void Run(CodeGearManager cgm) { + cgm.Setup(new CountUpper()); + CountObject count = new CountObject(1); + put("count", count); } } ``` -```cs:HelloWorldCodeGear.cs -public class HelloWorldCodeGear : CodeGear { - [Take] string helloWorld; - +```cs:CountUpper.cs +public class CountUpper : CodeGear { + [Take] public CountObject count; + public override void Run(CodeGearManager cgm) { - Console.Write(helloWorld + " "); - cgm.Setup(new HelloWorldCodeGear()); - cgm.GetLocalDGM().Put(helloWorld, helloWorld); + Console.WriteLine(count.number); + + if (count.number < 10) { + cgm.Setup(new CountUpper()); + count.number += 1; + put("count", count); + } else { + cgm.GetLocalDGM().Finish(); + } } } ``` -```cs:FinishHelloWorld.cs -public class FinishHelloWorld : CodeGear { - [Take] private string hello; - [Take] private string world; +```cs:CountObject.cs +[MessagePackObject] +public class CountObject { + public int number; - public override void Run(CodeGearManager cgm) { - cgm.GetLocalDGM().Finish(); + public CountObject(int number) { + this.number = number; } } ``` - +<!-- 1. Main関数でCGM のインスタンス生成 2. 2つのCG をsetupして待ち状態にする 3. key:hellowWorld data:"hello" がTake される @@ -241,49 +291,7 @@ 6. key:hellowWorld data:"world" がTake され、4,5と同様に処理される 7. 変数hello とworld がput され揃ったため、FinishHelloWorld のRun が実行され、プログラムは終了する - - - -### Unity -* UnityはUnity Technologies が開発を行っているゲームエンジンである - * 世界中で使用されているゲームエンジン - * 非常に軽く、スペックが低いノートPCでもゲーム開発が可能 -* プログラミング言語にはC# が採用されている - * C# のAPI やUnity 向けに拡張されたAPIも使用可能 - * 開発した機能をUnity に組み込むことも可能 - ---- - -### Christie \# on Unityのコード例 -```cs:UnityStartHelloWorld.cs -public class StartHelloWorld : StartCodeGear { - - public StartHelloWorld(CodeGearManager cgm) : base(cgm) { } - - public void RunCodeGear(CodeGearManager cgm) { - cgm.Setup(new HelloWorldCodeGear()); - cgm.Setup(new FinishHelloWorld()); - cgm.GetLocalDGM().Put("helloWorld", "hello"); - cgm.GetLocalDGM().Put("helloWorld", "world"); - } -} -``` - -```cs:UnityHelloWorld.cs -public class HelloWorld : MonoBehaviour { - void Start() { - CodeGearManager cgm = StartCodeGear.CreateCgm(10000); - var helloWorld = new StartHelloWorld(cgm); - helloWorld.RunCodeGear(cgm); - } -} -``` -* HelloWorldCodeGearと、FinishHelloWorld はそのまま使用 -* StartHelloWorld をUnity で使用できるように書き換え - * Unity ではMonoBehaviour 継承したクラスが動作可能 - * ゲーム開始時に1度だけ呼ばれるStart 関数 - * Start 関数でCGM のインスタンスを生成 - * Main 関数を名前を変えたRunCodeGear 関数を実行 +--> --- @@ -386,7 +394,6 @@ * Christie # ではThreadPoolより高機能なTask を用いて書き換えを行った * Task は複雑な非同期処理を通常のコーディングと同じ感覚で直感的に記述できる - * 裏でThreadPool が動くようになっている * 大きく動作は変わらない @@ -432,6 +439,51 @@ --- + +### Unity +* UnityはUnity Technologies が開発を行っているゲームエンジンである + * 世界中で使用されているゲームエンジン + * 非常に軽く、スペックが低いノートPCでもゲーム開発が可能 +* プログラミング言語にはC# が採用されている + * C# のAPI やUnity 向けに拡張されたAPIも使用可能 + * 開発した機能をUnity に組み込むことも可能 + +--- + +### Christie \# on Unityのコード例 +```cs:UnityStartHelloWorld.cs +public class StartHelloWorld : StartCodeGear { + + public StartHelloWorld(CodeGearManager cgm) : base(cgm) { } + + public void RunCodeGear(CodeGearManager cgm) { + cgm.Setup(new HelloWorldCodeGear()); + cgm.Setup(new FinishHelloWorld()); + cgm.GetLocalDGM().Put("helloWorld", "hello"); + cgm.GetLocalDGM().Put("helloWorld", "world"); + } +} +``` + +```cs:UnityHelloWorld.cs +public class HelloWorld : MonoBehaviour { + void Start() { + CodeGearManager cgm = StartCodeGear.CreateCgm(10000); + var helloWorld = new StartHelloWorld(cgm); + helloWorld.RunCodeGear(cgm); + } +} +``` +* HelloWorldCodeGearと、FinishHelloWorld はそのまま使用 +* StartHelloWorld をUnity で使用できるように書き換え + * Unity ではMonoBehaviour 継承したクラスが動作可能 + * ゲーム開始時に1度だけ呼ばれるStart 関数 + * Start 関数でCGM のインスタンスを生成 + * Main 関数を名前を変えたRunCodeGear 関数を実行 + +--- + + ### Unityで使用されているライブラリとの比較 Unityで使用されている既存のライブラリとして、Photon Unity Networking 2(PUN2)、MLAPIと、Christie # の比較を行う。