Mercurial > hg > Document > Growi
changeset 64:bc17d71e22eb
backup 2021-05-23
author | autobackup |
---|---|
date | Sun, 23 May 2021 00:10:03 +0900 |
parents | f440c8f6f66f |
children | 937323467f4d |
files | user/riono210/sigos2021.md |
diffstat | 1 files changed, 203 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/user/riono210/sigos2021.md Sat May 22 00:10:03 2021 +0900 +++ b/user/riono210/sigos2021.md Sun May 23 00:10:03 2021 +0900 @@ -1,23 +1,220 @@ ## 継続を使用する並列分散フレームワークのUnity実装 +--- ### オンラインゲームにおけるデータ通信 +* オンラインゲームは複数のプレイヤーが関与する分散プログラムである + * 分散プログラムを正しく書くことは難しい + * 攻撃の標的になる場合が多い +* クライアントの負荷軽減やチート対策のため、クライアントサーバ方式が主流である + * データの同期にはサーバを経由するため低速である -* クライアントサーバ方式が主流である -* +--- + +### オンラインゲームにおけるデータ通信 +* 当研究室では並列分散通信フレームワークChristie を開発中である + * 型のあるDataGear をKey を持つストリーム、DataGearManager として格納している + * 他のノードはDGM のproxyを持っており、proxy に書き込むことで通信を実現している + * DGM はトポロジーマネージャーによって自動的に構築される + * プログラム自体はDGM の名前を知っていれば良い + * 他のノードのIP addressなどを知る必要はない + +* ネットワークが切断されてもゲームは継続可能 +* ノードが接続している対象を直接知ることはできない + * チートに対する耐性がある -### Christie +* 本研究ではJava で書かれたChristieとC# で書かれたもの説明し、その機能と実装の差について考察を行う + +--- + +### Christie の基礎概念 * Christie は当研究室で開発をしている並列分散通信フレームワークである -* + * 同じく当研究室で開発しているGearsOS に導入予定のため次のような概念を持っている + +* CodeGear (クラスやスレッド) +* DataGear (変数データ) +* CodeGearManager (CG,DG,DGMを管理) +* DataGearManager (DGを管理,localとremoteの2種類がある, put操作によりDGを格納) + +--- + +### Christie の基礎概念 +<center><img src="https://i.imgur.com/D2MqSHi.png" alt="message" width="450" height="300"></center> +<center> +Christie を同一プロセスで複数インスタンス立ち上げた際の接続の構造図 +</center> + +* 全てのCGM はThreadPool と他のCGM をList として共有している +* ThreadPool はCPU に合わせた並列度でqueue に入ったThread を逐次実行していく + * 1つのThreadPool で処理を行うことでCPU のコア数に適したThread を管理でき、並列度を下げ流ことを防ぐ +* ThreadPoolを共有することメタレベルで全てのCG/DG にアクセス可能 + +--- + +### Christie の基礎概念 annotationについて +DG を取り出すためにCG内に宣言した変数データにannotation をつける。annotationには以下の4つがある。 + +* Take + * 先頭のDG を読み込み、そのDG を削除する + * DG が複数ある場合Take を使用する +* Peek + * 先頭のDG を読み込むがDG を削除しない + * 操作をしない場合は同じデータを参照し続ける +* TakeFrom + * Take と同じ動作だが、remote 先のDGMを指定できる +* PeekFrom + * Peek と同じ動作だが、remote 先のDGMを指定できる + +--- + +### Topology Manager +* Christie 場でNetwork Topology を形成する + * 参加を表明したノードに名前を与える + * 必要があればノード同士の配線を自動で行う + +* 静的Topology と動的Topology 2種類がある + +--- + +### 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"); + } +} +``` -### Christie \#のコード例 +```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(); + } +} +``` + +--- + +### Christie \# のコード例 +```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"); + } +} +``` + +```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); + } +} +``` + +```cs:FinishHelloWorld.cs +public class FinishHelloWorld : CodeGear { + [Take] private string hello; + [Take] private string world; + + public override void Run(CodeGearManager cgm) { + cgm.GetLocalDGM().Finish(); + } +} +``` ### 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) { } -### annotationの実装例 + 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); + } +} +``` + +--- + +### Take annotationの実装 +* Christie ではDGを取得するためにannotation を使用している + * C# ではannotation と同様の機能にattribute がある + * Take annotationの実装と比較を行う + +```java:Take.java +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Take { } +``` + +```cs:Take.cs +[AttributeUsage(AttributeTargets.Field)] +public class Take : Attribute { } +``` ### MessagePackの相違点