# HG changeset patch # User riono # Date 1646194550 -32400 # Node ID 74fb935dc5b5a47340549bede78b14eef340c65b # Parent 5ce28c1f79ca1a208b71133af3fd19372e114fdd update diff -r 5ce28c1f79ca -r 74fb935dc5b5 .hgignore --- a/.hgignore Fri Feb 18 04:00:52 2022 +0900 +++ b/.hgignore Wed Mar 02 13:15:50 2022 +0900 @@ -13,4 +13,8 @@ *.ilg *.gz *.fdb* -*.lol \ No newline at end of file +*.lol +*.out +styfile/* +s6/* +scripts/* \ No newline at end of file diff -r 5ce28c1f79ca -r 74fb935dc5b5 Paper/chapter/3-WorkingInUnity.tex --- a/Paper/chapter/3-WorkingInUnity.tex Fri Feb 18 04:00:52 2022 +0900 +++ b/Paper/chapter/3-WorkingInUnity.tex Wed Mar 02 13:15:50 2022 +0900 @@ -1,4 +1,6 @@ \chapter{Christie Sharpの実装の詳細} +前章まではChristieの基礎概念と設計、C\#への書き換え時における問題点を述べた。 +本章ではChristie Sharpの実装とUnity上での動作を詳細に説明する。 \section{Unity API} Unityでは、ゲーム開発を行うためのライブラリとしてUnity APIが公開されている。 diff -r 5ce28c1f79ca -r 74fb935dc5b5 Paper/chapter/appendix.tex --- a/Paper/chapter/appendix.tex Fri Feb 18 04:00:52 2022 +0900 +++ b/Paper/chapter/appendix.tex Wed Mar 02 13:15:50 2022 +0900 @@ -1,4 +1,7 @@ \appendix \chapter{研究会業績} -あああああああああああああああああああああああああ \section{研究会発表資料} +\begin{itemize} + \item Multicast Wifi VNCの実装と評価. 安田 亮, 河野 真治. 情報処理学会 システムソフトウェアとオペレーティング・システム研究会 (OS), May, 2020 + \item 継続を使用する並列分散フレームワークの Unity 実装. 安田 亮, 河野 真治. 情報処理会 システムソフトウェアとオペレーティング・システム研究会(OS), May, 2021 +\end{itemize} diff -r 5ce28c1f79ca -r 74fb935dc5b5 Paper/chapter/history.tex --- a/Paper/chapter/history.tex Fri Feb 18 04:00:52 2022 +0900 +++ b/Paper/chapter/history.tex Wed Mar 02 13:15:50 2022 +0900 @@ -1,5 +1,6 @@ -\chapter*{発表履歴} +\chapter*{研究関連論文業績} \begin{itemize} -\item 安田 亮, 河野 真治. Multicast Wifi VNCの実装と評価. 情報処理学会 システムソフトウェアとオペレーティング・システム研究会 (OS), May, 2020 -\item 安田 亮, 河野 真治. 継続を使用する並列分散フレームワークの Unity 実装. 情報処理会 システムソフトウェアとオペレーティング・システム研究会(OS), May, 2021 + \item Multicast Wifi VNCの実装と評価. 安田 亮, 河野 真治. 情報処理学会 システムソフトウェアとオペレーティング・システム研究会 (OS), May, 2020 + \item 継続を使用する並列分散フレームワークの Unity 実装. 安田 亮, 河野 真治. 情報処理会 システムソフトウェアとオペレーティング・システム研究会(OS), May, 2021 \end{itemize} + diff -r 5ce28c1f79ca -r 74fb935dc5b5 Paper/master_paper.pdf Binary file Paper/master_paper.pdf has changed diff -r 5ce28c1f79ca -r 74fb935dc5b5 Paper/master_paper.tex --- a/Paper/master_paper.tex Fri Feb 18 04:00:52 2022 +0900 +++ b/Paper/master_paper.tex Wed Mar 02 13:15:50 2022 +0900 @@ -7,7 +7,9 @@ \usepackage{comment} \usepackage{url} \usepackage[deluxe, multi]{otf} - +% 以下はハイパーリンク 要ダウンロード +\usepackage[dvipdfmx]{hyperref} +\usepackage{pxjahyper} %\input{dummy.tex} %% font @@ -65,9 +67,19 @@ \def\lstlistingname{ソースコード} \def\lstlistlistingname{ソースコード目次} +% ハイパーリンク +\hypersetup{ +setpagesize=false, + bookmarksnumbered=true,% + bookmarksopen=true,% + colorlinks=true,% + linkcolor=black, + citecolor=black, +} + %%% 索引のために以下の2行を追加 -\usepackage{makeidx,multicol} -\makeindex +%\usepackage{makeidx,multicol} +%\makeindex \begin{document} %rome \maketitle @@ -124,12 +136,12 @@ %発表履歴 %\addcontentsline{toc}{chapter}{発表履歴} -%\input{chapter/history.tex}] +%\input{chapter/history.tex} %付録 \addcontentsline{toc}{chapter}{付録} \appendix -%\input{chapter/appendix.tex} +\input{chapter/appendix.tex} \end{document} diff -r 5ce28c1f79ca -r 74fb935dc5b5 Poster/riono-slide.html --- a/Poster/riono-slide.html Fri Feb 18 04:00:52 2022 +0900 +++ b/Poster/riono-slide.html Wed Mar 02 13:15:50 2022 +0900 @@ -191,6 +191,8 @@

Unityの動作

diff -r 5ce28c1f79ca -r 74fb935dc5b5 Poster/riono-slide.md --- a/Poster/riono-slide.md Fri Feb 18 04:00:52 2022 +0900 +++ b/Poster/riono-slide.md Wed Mar 02 13:15:50 2022 +0900 @@ -48,6 +48,8 @@ ## Unityの動作 +- 水族館のデモ動画 +- 2PCを使用して魚がPC間を移動 - 平均60fpsで動作を確認 diff -r 5ce28c1f79ca -r 74fb935dc5b5 Poster/riono-slide.pdf.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Poster/riono-slide.pdf.html Wed Mar 02 13:15:50 2022 +0900 @@ -0,0 +1,255 @@ + + + + + + + + + + 継続を使用する並列分散フレームワークのUnity実装 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ +
+ + + + + + + +
+
+

継続を使用する並列分散フレームワークのUnity実装

+
+
+
+ Ryo Yasuda, Shinji Kono + 並列信頼研 +
+
+
+
+ + +
+ + +

オンラインゲームにおけるデータ通信

+
    +
  • ゲームの通信方式にはクライアントサーバ方式とp2p方式がある
  • +
  • データの安全性や通信環境などでクライアントサーバ方式が主流
  • +
  • サーバに接続して複数ユーザのデータ同期を実現させているため、低速
  • +
  • 高速に通信を行たい +
      +
    • 並列分散フレームワークChristieがある
    • +
    • ChristieはLAN上で高速に通信可能
    • +
    • TopologyManagerを使用することでLAN/WAN上で動的構築される
    • +
    +
  • +
  • ゲーム開発で主に使用されているUnityに対応するためにChristieをC#へ書き換えを行う
  • +
+ + + +
+ +
+ +

Christie

+
    +
  • Christieは当研究室で開発している並列分散ライブラリ
  • +
  • Gearという概念を持っており、DataGearによるTake/Putを使用
  • +
  • クラスに相当するCodeGearとフィールド変数に相当するDataGearがある
  • +
  • CodeGearに記述されたDataGearが全て揃う(代入される)とCodeGearの処理が実行される
  • +
+ + + +
+ +
+ +

Unityにおけるネットワーク通信

+
    +
  • Unityは世界中で使用されているゲームエンジン
  • +
  • 言語としてC#がサポートされている
  • +
  • フレーム単位の処理が行われ、シングルスレッドで動作しているため並列処理が苦手
  • +
  • Send/Recieveなどでは通信を記述しづらい
  • +
  • Christieにより画面書き換えと非同期な並列処理や通信が可能
  • +
+ + + +
+ +
+ +

C#へ書き換える利点

+
    +
  • ChristieはJavaで実装されている +
      +
    • C#に書き換えを行うべきか
    • +
    +
  • +
  • JavaをC#上で呼び出す方式 +
      +
    • annotationが使用できない
    • +
    +
  • +
  • Unityはandroidの開発向けにjarファイルからJavaのメソッドをC#上で呼び出せる機能がある +
      +
    • stringを使用してリソースディレクトリから検索し、使用
    • +
    • 高速化が求められる並列分散プログラミングには不適
    • +
    +
  • +
  • 記述方法が似ているため移植が行いやすい
  • +
  • ThreadPoolをC#で統一できる
  • +
+ + + +
+ +
+ +

C#へ書き換えの方針

+
    +
  • C#で記述するChristieをChristie Sharpとする
  • +
  • Christie設計時の意図や、互換性を保つためChristieと同じ動作をさせる
  • +
  • ChristieはJava9から開発されており、非推奨なコードやが含まれている
  • +
  • C#に対応しつつ、処理動作の向上や最適化を行うために以下の変更を行った +
      +
    • MessagePackのバージョンアップ
    • +
    • ThreadPoolからTaskへ変更
    • +
    +
  • +
+ + + +
+ +
+ +

Unityの動作

+ +
    +
  • 水族館のデモ動画
  • +
  • 2PCを使用して魚がPC間を移動
  • +
  • 平均60fpsで動作を確認
  • +
+ + + +
+ +
+ +

他の通信ライブラリと機能的な比較際のChristie Sharpの利点

+
    +
  • Unityの既存通信ライブラリはクライアントサーバ方式のためServerを用意する必要がある +
      +
    • Server抜きのオンラインゲームが開発できる
    • +
    +
  • +
  • 並列処理には別途ライブラリを導入する必要がある +
      +
    • Christie Sharpで強力な並列処理が可能
    • +
    +
  • +
  • 通信が切断した際にゲームロジックが停止しない +
      +
    • 参照し続けるデータはPeekで取得を行うことで、データの更新されないがnullにはならない
    • +
    +
  • +
+ + + +
+ +
+ +

まとめ

+
    +
  • ChristieをUnityで使用するためにC#に書き換えを行った
  • +
  • 書き換え方針としては、MessagePackのバージョンアップC#独自の機能に対応を行いつつ元のソースコードと同じ機能になるように実装
  • +
  • Unityで動作検証を行い、正しく動作することを確認した +
      +
    • Christie Sharpを利用したゲームの開発が可能
    • +
    • 平均60fpsで動作を確認
    • +
    +
  • +
  • Take/Peek/Putを利用したゲームと相性の良いプログラミング
  • +
  • Unity既存のライブラリとの比較を行った
  • +
+ + + +
+ +
+ +

今後の課題

+
    +
  • TopologyManagerの完成 +
      +
    • 2nd keyを用いたTreeMapの通信
    • +
    +
  • +
  • Christie Sharpの性能検証を行う +
      +
    • 他の通信ライブラリとの通信速度や耐久性の検証
    • +
    • Christie Sharpを用いた100人規模のゲーム開発
    • +
    +
  • +
+ + +
+ + +
+ + diff -r 5ce28c1f79ca -r 74fb935dc5b5 Slide/master-slide.pdf.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Slide/master-slide.pdf.html Wed Mar 02 13:15:50 2022 +0900 @@ -0,0 +1,723 @@ + + + + + + + + + + 継続を使用する並列分散フレームワークのUnity実装 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ +
+ + + + + + + +
+
+

継続を使用する並列分散フレームワークのUnity実装

+
+
+
+ Ryo Yasuda, Shinji Kono + 並列信頼研 +
+
+
+
+ + +
+ + +

並列分散フレームワークChristieとUnity

+
    +
  • Unityとはゲーム開発でよく使用されているゲームエンジン
  • +
  • ChristieとはDataGearのTake/Putを使用した分散フレームワーク
  • +
  • UnityでServer抜きのネットワークゲーム開発を行いたい +
      +
    • Java版を接続するのは困難
    • +
    • C#でChristieを実装した
    • +
    +
  • +
  • Unityに並列分散処理をスムーズに導入できた
  • +
+ + + +
+ +
+ +

ChristieによるUnityネットワークゲーム実装の利点

+
    +
  • PUN2では企業ベースのServerが必要(開発がしづらい)
  • +
  • WAN上なので低速 +
      +
    • ChristieにするとLAN上での高速通信が可能
    • +
    • TopologyManagerを使うことによりLAN/WANで動的構成される
    • +
    • スケーラビリティーもTopologyManagerで実現できる(分散ルーティング)
    • +
    • Take/Putなので通信切断や遅延に対して対処しやすい
    • +
    +
  • +
  • Unityはフレーム単位の処理なため並列処理が苦手 +
      +
    • Christieにより画面書き換えと非同期な並列処理や通信が可能
    • +
    +
  • +
  • ChristieのMessagePack(データ通信ライブラリ)のバージョンの問題を解決
  • +
+ + + +
+ +
+ +

Christie の計算モデル

+
    +
  • DataGear(通信単位となるオブジェクト)が揃った時点でCodeGearが処理を開始
  • +
  • DataGearは決まったkeyでDataGearManagerにQueueとして格納
  • +
  • 相手nodeのDataGearManagerのproxyで通信
  • +
+
message
+ + + +
+ +
+ +

DataGearのAPI

+
    +
  • PutでQueueに追加
  • +
  • TakeでQueueからの取り出し
  • +
  • PeekでQueueから取り出さない読み出し +
      +
    • Takeされない限り同じDataGearを読み出し続ける
    • +
    +
  • +
  • フレームごとにPeekでゲームオブジェクトの状態をUnity側で見れる
  • +
  • 通信停止/遅延でもUnityの動作に影響を与えない
  • +
  • スケーラビリティやLAN/WAN構成はTopologyManagerのDGM porxyの管理
  • +
+ + + +
+ +
+ +

Java/C#のannotation

+
    +
  • クラスやフィールドあるいはメソッドに付ける
  • +
  • ユーザ定義可能なmeta計算属性
  • +
  • MessagePackで通信可能なフィールドをannotationで指定する
  • +
  • Christieで通信パターンを指定するのにannotationを用いる
  • +
+ + + +
+ +
+ +

DGのannotation

+
    +
  • Take +
      +
    • 先頭のDG を読み込み、そのDG を削除する
    • +
    +
  • +
  • Peek +
      +
    • 先頭のDG を読み込むがDG を削除しない
    • +
    • 操作をしない場合は同じデータを参照し続ける
    • +
    +
  • +
  • TakeFrom +
      +
    • Take と同じ動作だが、remote 先のDGMを指定できる
    • +
    +
  • +
  • PeekFrom +
      +
    • Peek と同じ動作だが、remote 先のDGMを指定できる
    • +
    +
  • +
+ + + +
+ +
+ +

Christieによる分散プログラミング

+
    +
  • Take/Put/Peekがデータベースのトランザクション
  • +
  • ここではトランザクションはゲームプレイヤー間の合意されたイベント
  • +
  • 複数のプレイヤーが関与する分散プログラムをTake/Put/Peekでローカルに記述できる
  • +
  • ローカルな記述を組み合わせて分散プログラムを記述する
  • +
  • ネットワークの変化、故障、性能の多様性を吸収する
  • +
  • Christieのデバッガー(モデル検査など)も使用可能
  • +
  • TopologyManagerで負荷軽減やチート対策が可能
  • +
+ + + +
+ +
+ +

ローカルnodeから見たChristie

+
    +
  • 型のあるDataGear とKey を持つタプル空間、DataGearManager として格納
  • +
  • 他のノードのDGM のproxyに書き込むことで通信
  • +
  • CodeGear (クラスやスレッド)
  • +
  • DataGear (変数データ)
  • +
  • CodeGearManager (CG,DG,DGMを管理)
  • +
+
message
+ + + +
+ +
+ +

Christie上でNetwork Topologyの形成

+
    +
  • 参加を表明したノードにDataGearManager proxyを決まった名前で作成
  • +
  • ノード同士の配線を指示
  • +
  • 分散プログラムの開始終了
  • +
  • Treeなどの動的Topologyは自動的に接続される
  • +
+
message
+ + + +
+ +
+ +

Christie Sharp のコード例

+
    +
  • Mainでport10001でChristie フレームワークを起動(CreateCGM)
  • +
  • 最初のCodeGearをCodeGearManagerに対して実行する +
    public static void Main(string[] args) {
    +  StartCountUp start = StartCountUp(createCGM(10001));
    +}
    +
    +
  • +
+ + + +
+ +
+ +

CodeGear StartCountUp

+
    +
  • CodeGearはCodeGearManagerを引数として持つ(baseでcgmに対してアクセスを許可)
  • +
  • CodeGearManagerがRun(cgm)をThreadPoolを使って呼び出す +
    public class StartCountUp : StartCodeGear {
    +  public StartCountUp(CodeGearManager cgm) : base(cgm) { }
    +  public override void Run(CodeGearManager cgm) {
    +      cgm.Setup(new CountUpper());  // 新しいCodeGearを生成
    +      CountObject count = new CountObject(1);
    +      put("count", count);  // DataGear countをkey countでPut
    +  }
    +}
    +
    + + +
+ +
+ +

CodeGear CountUpper

+ +
  • key countのDataGearが来たらCountUpperのRunが実行される +
    public class CountUpper : CodeGear {
    +  [Take] public CountObject count; // key countをTakeするannotation
    +  public override void Run(CodeGearManager cgm) {
    +      Console.WriteLine(count.number);
    +      if (count.number < 10) {
    +          cgm.Setup(new CountUpper());  // 毎回新しいCodeGearを生成
    +          count.number += 1;
    +          put("count", count);
    +      } else {
    +          cgm.GetLocalDGM().Finish();  // CodeGearManagerを終了
    +      }
    +  }
    +}
    +
    + + +
  • + +
    + +

    DataGear CountObject

    + +
  • MessagePackを使って通信されるDataGear
  • +
  • Take/Put/Peekはこれに対して行われる +
    [MessagePackObject]
    +public class CountObject {
    +  public int number;
    +  public CountObject(int number) {  // コンストラクタ
    +      this.number = number;
    +  }
    +}
    +
    +
  • + + + + +
    + +
    + +

    Unityの従来の通信ライブラリ

    +
      +
    • Unityはフレーム単位で処理を行う
    • +
    • IEnumeratorでフレームを跨ぐ処理を記述する
    • +
    • Send/Recieveなどでは通信を記述しづらい
    • +
    • Photon Unity Network 2(PUN2) +
        +
      • Cloud ServerサービスPhoton Cloudがある
      • +
      • Server側は開発できない
      • +
      +
    • +
    • Mirror +
        +
      • OSSで開発が行われている
      • +
      • メソッドをServerで実行し結果を反映
      • +
      +
    • +
    + + + +
    + +
    + +

    Photon Unity Network2

    +
    public class PhotonController : MonoBehaviourPunCallbacks {
    +    void Start() {
    +        PhotonNetwork.ConnectUsingSettings();
    +    }
    +    void FixedUpdate() {
    +        if (photonView.IsMine) {   // 自身であるか
    +            float x = Input.GetAxis("Horizontal");
    +            float z = Input.GetAxis("Vertical");
    +            CmdMoveSphere(x, z);
    +        }
    +    }
    +    void CmdMoveSphere(float x, float z) {
    +        Vector3 v = new Vector3(x, 0, z);
    +        GetComponent<Rigidbody>().AddForce(v);
    +    }
    +    public override void OnConnectedToMaster() {  // Server接続時のcallback 
    +        PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
    +    }
    +    public override void OnJoinedRoom() {    // Room接続時のcallback 
    +        PhotonNetwork.Instantiate("Charactor", Vector3.zero, Quaternion.identity);
    +    }
    +}
    +
    + + + +
    + +
    + +

    Mirror

    +
    public class PlayerController : NetworkBehaviour {
    +    [SyncVar] float speed = 1f;
    +    public override void OnStartServer() {  // Server接続時のcallback 
    +        speed = Random.Range(1f, 10f);
    +    }
    +    void FixedUpdate() {
    +        if (isLocalPlayer) {
    +            float x = Input.GetAxis("Horizontal");
    +            float z = Input.GetAxis("Vertical");
    +            CmdMoveSphere(x, z);
    +        }
    +    }
    +    [Command]     // Server側で実行される
    +    void CmdMoveSphere(float x, float z) {
    +        Vector3 v = new Vector3(x + speed, 0, z + speed);
    +        GetComponent<Rigidbody>().AddForce(v);
    +    }
    +}
    +
    + + + +
    + +
    + +

    C#への書き換える利点

    +
      +
    • ChristieはJavaで実装されている +
        +
      • C#に書き換えを行うべきか
      • +
      +
    • +
    • JavaをC#上で呼び出す方式 +
        +
      • annotationが使用できない
      • +
      +
    • +
    • Unityはandroidの開発向けにjarファイルからJavaのメソッドをC#上で呼び出せる機能がある +
        +
      • stringを使用してリソースディレクトリから検索し、使用
      • +
      • 高速化が求められる並列分散プログラミングには不適
      • +
      +
    • +
    • 記述方法が似ているため移植が行いやすい
    • +
    • ThreadPoolをC#で統一できる
    • +
    + + + +
    + +
    + +

    書き換えの方針

    +
      +
    • C#で記述するChristieをChristie Sharpとする
    • +
    • Christie設計時の意図や、互換性を保つためChristieと同じ動作をさせる
    • +
    • ChristieはJava9から開発されており、非推奨なコードやが含まれている
    • +
    • C#に対応しつつ、処理動作の向上や最適化を行うために以下の変更を行った +
        +
      • MessagePackのバージョンアップ
      • +
      • ThreadPoolからTaskへ変更
      • +
      +
    • +
    + + + +
    + +
    + +

    Take annotationの実装

    +
      +
    • Christie ではDGを取得するためにannotation を使用している +
        +
      • C# ではannotation と同様の機能にattribute があり、Take をattribute で実装した
      • +
      +
    • +
    • Take はフィールド変数に対して適用する
    • +
    • Javaの場合 +
      @Target(ElementType.FIELD)
      +@Retention(RetentionPolicy.RUNTIME)
      +public @interface Take { }
      +
      +
    • +
    • C#の場合 +
      [AttributeUsage(AttributeTargets.Field)]
      +public class Take : Attribute { }
      +
      +
    • +
    + + + +
    + +
    + +

    MessagePackの相違点

    +
      +
    • Christie ではMessagePack を使用してデータをシリアライズし送受信している +
        +
      • インスタンス内のpublic 変数に対してシリアライズ可能
      • +
      +
    • +
    • Java版はバージョンが古いため、現在はサポートされていないため最新版とは記述方法が異なる +
      public class MessagePackExample {
      +  @Message // 圧縮を行うクラスにつける
      +  public static class MyMessage {
      +      public String name;
      +      public double version;
      +  }
      +  public static void main(String[] args) throws Exception {
      +      MyMessage src = new MyMessage();
      +      src.name = "msgpack";
      +      src.version = 0.6;
      + 
      +      MessagePack msgpack = new MessagePack();
      +      byte[] bytes = msgpack.write(src);          // シリアライズ
      +      // Deserialize
      +      MyMessage dst = msgpack.read(bytes, MyMessage.class);   // デシリアライズ
      +}
      +
      +
    • +
    + + + +
    + +
    + +

    MessagePackの相違点

    +
      +
    • C# のMessagePack は複数存在している +
        +
      • java 版と似たような書き方をするMessagePack-CSharp を選択した +
        [MessagePackObject]  // シリアライズしたいクラスにつける
        +public class MyClass {
        +  [Key(0)]   // keyを指定
        +  public int Age { get; set; }
        +  [Key(1)]
        +  public string FirstName { get; set; }
        +  [Key(2)]
        +  public string LastName { get; set; }
        +  static void Main(string[] args) {
        +  var mc = new MyClass {
        +      Age = 99,
        +      FirstName = "hoge",
        +      LastName = "huga",
        +  };
        +  byte[] bytes = MessagePackSerializer.Serialize(mc);    // byte[] にシリアライズ
        +  MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes);  // デシリアライズ
        +  // [99,"hoge","huga"]
        +  var json = MessagePackSerializer.ConvertToJson(bytes);  // Jsonとしても展開可能
        +  }
        +}
        +
        +
      • +
      +
    • +
    + + + +
    + +
    + +

    ThreadPoolからTaskへの書き換え

    +
      +
    • Christie ではThreadPool を使用していた +
      public class PriorityThreadPoolExecutors {
      +  private static class PriorityThreadPoolExecutor extends ThreadPoolExecutor {
      +      private static final int DEFAULT_PRIORITY = 0;
      +      public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize,  // コンストラクタ
      +                              int keepAliveTime, TimeUnit unit) {
      +          super(corePoolSize, maximumPoolSize, keepAliveTime, unit, 
      +          (BlockingQueue) new PriorityBlockingQueue<ComparableTask>(10,
      +      ComparableTask.comparatorByPriorityAndSequentialOrder()));  
      +      }  // 優先度によって処理順を入れ替え可能なQueueを指定
      +      @Override
      +      public void execute(Runnable command) {
      +              super.execute(command);
      +      }
      +  }
      +}
      +
      + + +
    + +
    + +

    ThreadPoolからTaskへの書き換え

    + +
  • Christie Sharp ではThreadPoolより高機能なTask を用いて書き換えを行った
  • +
  • Task は複雑な非同期処理を通常のコーディングと同じ感覚で直感的に記述
  • +
  • 裏でThreadPool が動作するため大きく動作は変わらない +
    public class ThreadPoolExecutors {
    +  public ThreadPoolExecutors(int nWorkerThreads, int nIOThreads) {  // コンストラクタ
    +      ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads);
    +  }
    +  public void Execute(CodeGearExecutor command) {
    +      Task.Factory.StartNew(() => command.Run());  // Taskを使用
    +  }
    +}
    +
    +
  • + + + + +
    + +
    + +

    Christie SharpのUnityのコード例

    +
      +
    • ゲームオブジェクトの座標をもう1つのゲームオブジェクトに追従させる例題
    • +
    • StartやUpdateはMonoBehaviourを継承する
    • +
    + +
    public class TransformMoveTest : MonoBehaviour {
    +    private CodeGearManager cgm;
    +    public Transform otherTransform;
    +    private Vector3 pos;
    +    void Start() {    // ゲーム実行時の最初の1回呼び出し
    +        cgm = StartCodeGear.CreateCgm(10000);
    +        cgm.Setup(new PositionAssignCodeGear());   // 新しいCodeGearの生成
    +        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());
    +    }
    +}
    +
    +
    + + +
    + +
    + +

    Christie SharpのUnityのコード例

    +
      +
    • TransformなどのUnity AIPはMainThreadでのみ動作 +
      public class PositionAssignCodeGear : CodeGear {
      +  [Take] private Vector3 pos;
      +  [Peek] private Transform transform;
      +  public override void Run(CodeGearManager cgm) {
      +      MainThreadDispatcher.Post(_ => {    // MainThreadへ処理を移譲
      +          transform.position = pos;
      +      }, null);
      +  }
      +}
      +
      +
    • +
    + + + +
    + +
    + +

    Christie Sharpの利点

    +
      +
    • Unityのフレーム同期処理とChristieの並列分散処理が共存 +
        +
      • CodeGear/DataGearを利用した待ち合わせ処理
      • +
      • CodeGearの処理はTaskによってThreadPoolで行われる
      • +
      • Christieを用いた非同期な並列処理が可能
      • +
      • 通信が切断した際にUnityの動作に影響を与えない
      • +
      • 通信先の参照データをPeekで待ち合わせないで取得する
      • +
      • Take/PutによりトランザクションとしてDataGearをUpdate
      • +
      • TopologyManagerによりDGMのproxyネットワークが構成される
      • +
      • TopologyManagerにCookieの機能があるため、改良すれば切断から復帰可能
      • +
      +
    • +
    + + + +
    + +
    + +

    まとめ

    +
      +
    • Christie をUnity で使用するためにC# に書き換えを行った
    • +
    • 書き換え方針としては、attribute やMessagePack などC# 独自の機能に対応しつつ元のソースコードと同じ機能になるように実装
    • +
    • Unityで動作検証を行い、正しく動作することを確認した +
        +
      • Christie Sharpを利用したゲームの開発が可能
      • +
      • ゲーム班などでネットワークゲームを容易にプログラムできる
      • +
      +
    • +
    • TopologyManagerで自由にネットワーク環境を構築できる
    • +
    • Take/Peek/Putを利用したゲームと相性の良いプログラミング
    • +
    • Unity既存のライブラリとの比較を行った
    • +
    + + + +
    + +
    + +

    今後の課題

    +
      +
    • TopologyManagerの完成 +
        +
      • 2nd keyを用いたTreeMapの通信
      • +
      +
    • +
    • Christie Sharpの性能検証を行う +
        +
      • Aliceで動作していた水族館の例題
      • +
      • Christie Sharpを用いた100人規模のゲーム開発
      • +
      +
    • +
    + + +
    + + +
    + +