Mercurial > hg > Papers > 2022 > riono-master
changeset 62:74fb935dc5b5 default tip
update
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 02 Mar 2022 13:15:50 +0900 |
parents | 5ce28c1f79ca |
children | |
files | .hgignore Paper/chapter/3-WorkingInUnity.tex Paper/chapter/appendix.tex Paper/chapter/history.tex Paper/master_paper.pdf Paper/master_paper.tex Poster/riono-slide.html Poster/riono-slide.md Poster/riono-slide.pdf.html Slide/master-slide.pdf.html |
diffstat | 10 files changed, 1014 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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が公開されている。
--- 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}
--- 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} +
--- 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}
--- 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 @@ <h2 id="unityの動作">Unityの動作</h2> <!--デモ?--> <ul> + <li>水族館のデモ動画</li> + <li>2PCを使用して魚がPC間を移動</li> <li>平均60fpsで動作を確認</li> </ul>
--- 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で動作を確認
--- /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 @@ + + + + + +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="content-type" content="text/html;charset=utf-8"> + <title>継続を使用する並列分散フレームワークのUnity実装</title> + + <meta name="generator" content="Slide Show (S9) v4.1.0 on Ruby 2.6.3 (2019-04-16) [universal.x86_64-darwin19]"> + <meta name="author" content="Ryo Yasuda, Shinji Kono" > + +<!-- style sheet links --> +<link rel="stylesheet" href="s6/themes/screen.css" media="screen"> +<link rel="stylesheet" href="s6/themes/print.css" media="print"> +<link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection"> + +<!-- JS --> +<script src="s6/js/jquery-1.11.3.min.js"></script> +<script src="s6/js/jquery.slideshow.js"></script> +<script src="s6/js/jquery.slideshow.counter.js"></script> +<script src="s6/js/jquery.slideshow.controls.js"></script> +<script src="s6/js/jquery.slideshow.footer.js"></script> +<script src="s6/js/jquery.slideshow.autoplay.js"></script> + +<!-- prettify --> +<link rel="stylesheet" href="scripts/prettify.css"> +<script src="scripts/prettify.js"></script> + +<style> + .slide {page-break-after: always;} +</style> + + + + +</head> +<body> + +<div class="layout"> + <div id="header"></div> + <div id="footer"> + <div align="right"> + <img src="s6/images/logo.svg" width="200px"> + </div> + </div> +</div> + +<div class="presentation"> + + <div class='slide cover'> + <table width="90%" height="90%" border="0" align="center"> + <tr> + <td> + <div align="center"> + <h1><font color="#808db5">継続を使用する並列分散フレームワークのUnity実装</font></h1> + </div> + </td> + </tr> + <tr> + <td> + <div align="left"> + Ryo Yasuda, Shinji Kono + 並列信頼研 + <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> + </div> + </td> + </tr> + </table> + </div> + + +<div class='slide'> + +<!-- _S9SLIDE_ --> +<h2 id="オンラインゲームにおけるデータ通信">オンラインゲームにおけるデータ通信</h2> +<ul> + <li>ゲームの通信方式にはクライアントサーバ方式とp2p方式がある</li> + <li>データの安全性や通信環境などでクライアントサーバ方式が主流</li> + <li>サーバに接続して複数ユーザのデータ同期を実現させているため、低速</li> + <li>高速に通信を行たい + <ul> + <li>並列分散フレームワークChristieがある</li> + <li>ChristieはLAN上で高速に通信可能</li> + <li>TopologyManagerを使用することでLAN/WAN上で動的構築される</li> + </ul> + </li> + <li>ゲーム開発で主に使用されているUnityに対応するためにChristieをC#へ書き換えを行う</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christie">Christie</h2> +<ul> + <li>Christieは当研究室で開発している並列分散ライブラリ</li> + <li>Gearという概念を持っており、DataGearによるTake/Putを使用</li> + <li>クラスに相当するCodeGearとフィールド変数に相当するDataGearがある</li> + <li>CodeGearに記述されたDataGearが全て揃う(代入される)とCodeGearの処理が実行される</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="unityにおけるネットワーク通信">Unityにおけるネットワーク通信</h2> +<ul> + <li>Unityは世界中で使用されているゲームエンジン</li> + <li>言語としてC#がサポートされている</li> + <li>フレーム単位の処理が行われ、シングルスレッドで動作しているため並列処理が苦手</li> + <li>Send/Recieveなどでは通信を記述しづらい</li> + <li>Christieにより画面書き換えと非同期な並列処理や通信が可能</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="cへ書き換える利点">C#へ書き換える利点</h2> +<ul> + <li>ChristieはJavaで実装されている + <ul> + <li>C#に書き換えを行うべきか</li> + </ul> + </li> + <li>JavaをC#上で呼び出す方式 + <ul> + <li>annotationが使用できない</li> + </ul> + </li> + <li>Unityはandroidの開発向けにjarファイルからJavaのメソッドをC#上で呼び出せる機能がある + <ul> + <li>stringを使用してリソースディレクトリから検索し、使用</li> + <li>高速化が求められる並列分散プログラミングには不適</li> + </ul> + </li> + <li>記述方法が似ているため移植が行いやすい</li> + <li>ThreadPoolをC#で統一できる</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="cへ書き換えの方針">C#へ書き換えの方針</h2> +<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> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="unityの動作">Unityの動作</h2> +<!--デモ?--> +<ul> + <li>水族館のデモ動画</li> + <li>2PCを使用して魚がPC間を移動</li> + <li>平均60fpsで動作を確認</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="他の通信ライブラリと機能的な比較際のchristie-sharpの利点">他の通信ライブラリと機能的な比較際のChristie Sharpの利点</h2> +<ul> + <li>Unityの既存通信ライブラリはクライアントサーバ方式のためServerを用意する必要がある + <ul> + <li>Server抜きのオンラインゲームが開発できる</li> + </ul> + </li> + <li>並列処理には別途ライブラリを導入する必要がある + <ul> + <li>Christie Sharpで強力な並列処理が可能</li> + </ul> + </li> + <li>通信が切断した際にゲームロジックが停止しない + <ul> + <li>参照し続けるデータはPeekで取得を行うことで、データの更新されないがnullにはならない</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="まとめ">まとめ</h2> +<ul> + <li>ChristieをUnityで使用するためにC#に書き換えを行った</li> + <li>書き換え方針としては、MessagePackのバージョンアップC#独自の機能に対応を行いつつ元のソースコードと同じ機能になるように実装</li> + <li>Unityで動作検証を行い、正しく動作することを確認した + <ul> + <li>Christie Sharpを利用したゲームの開発が可能</li> + <li>平均60fpsで動作を確認</li> + </ul> + </li> + <li>Take/Peek/Putを利用したゲームと相性の良いプログラミング</li> + <li>Unity既存のライブラリとの比較を行った</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="今後の課題">今後の課題</h2> +<ul> + <li>TopologyManagerの完成 + <ul> + <li>2nd keyを用いたTreeMapの通信</li> + </ul> + </li> + <li>Christie Sharpの性能検証を行う + <ul> + <li>他の通信ライブラリとの通信速度や耐久性の検証</li> + <li>Christie Sharpを用いた100人規模のゲーム開発</li> + </ul> + </li> +</ul> + + +</div> + + +</div><!-- presentation --> +</body> +</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 @@ + + + + + +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="content-type" content="text/html;charset=utf-8"> + <title>継続を使用する並列分散フレームワークのUnity実装</title> + + <meta name="generator" content="Slide Show (S9) v4.1.0 on Ruby 2.6.3 (2019-04-16) [universal.x86_64-darwin19]"> + <meta name="author" content="Ryo Yasuda, Shinji Kono" > + +<!-- style sheet links --> +<link rel="stylesheet" href="s6/themes/screen.css" media="screen"> +<link rel="stylesheet" href="s6/themes/print.css" media="print"> +<link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection"> + +<!-- JS --> +<script src="s6/js/jquery-1.11.3.min.js"></script> +<script src="s6/js/jquery.slideshow.js"></script> +<script src="s6/js/jquery.slideshow.counter.js"></script> +<script src="s6/js/jquery.slideshow.controls.js"></script> +<script src="s6/js/jquery.slideshow.footer.js"></script> +<script src="s6/js/jquery.slideshow.autoplay.js"></script> + +<!-- prettify --> +<link rel="stylesheet" href="scripts/prettify.css"> +<script src="scripts/prettify.js"></script> + +<style> + .slide {page-break-after: always;} +</style> + + + + +</head> +<body> + +<div class="layout"> + <div id="header"></div> + <div id="footer"> + <div align="right"> + <img src="s6/images/logo.svg" width="200px"> + </div> + </div> +</div> + +<div class="presentation"> + + <div class='slide cover'> + <table width="90%" height="90%" border="0" align="center"> + <tr> + <td> + <div align="center"> + <h1><font color="#808db5">継続を使用する並列分散フレームワークのUnity実装</font></h1> + </div> + </td> + </tr> + <tr> + <td> + <div align="left"> + Ryo Yasuda, Shinji Kono + 並列信頼研 + <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> + </div> + </td> + </tr> + </table> + </div> + + +<div class='slide'> + +<!-- _S9SLIDE_ --> +<h2 id="並列分散フレームワークchristieとunity">並列分散フレームワークChristieとUnity</h2> +<ul> + <li>Unityとはゲーム開発でよく使用されているゲームエンジン</li> + <li>ChristieとはDataGearのTake/Putを使用した分散フレームワーク</li> + <li>UnityでServer抜きのネットワークゲーム開発を行いたい + <ul> + <li>Java版を接続するのは困難</li> + <li>C#でChristieを実装した</li> + </ul> + </li> + <li>Unityに並列分散処理をスムーズに導入できた</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christieによるunityネットワークゲーム実装の利点">ChristieによるUnityネットワークゲーム実装の利点</h2> +<ul> + <li>PUN2では企業ベースのServerが必要(開発がしづらい)</li> + <li>WAN上なので低速 + <ul> + <li>ChristieにするとLAN上での高速通信が可能</li> + <li>TopologyManagerを使うことによりLAN/WANで動的構成される</li> + <li>スケーラビリティーもTopologyManagerで実現できる(分散ルーティング)</li> + <li>Take/Putなので通信切断や遅延に対して対処しやすい</li> + </ul> + </li> + <li>Unityはフレーム単位の処理なため並列処理が苦手 + <ul> + <li>Christieにより画面書き換えと非同期な並列処理や通信が可能</li> + </ul> + </li> + <li>ChristieのMessagePack(データ通信ライブラリ)のバージョンの問題を解決</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christie-の計算モデル">Christie の計算モデル</h2> +<ul> + <li>DataGear(通信単位となるオブジェクト)が揃った時点でCodeGearが処理を開始</li> + <li>DataGearは決まったkeyでDataGearManagerにQueueとして格納</li> + <li>相手nodeのDataGearManagerのproxyで通信</li> +</ul> +<center><img src="../Paper/images/Remote_DataGearManager.pdf" alt="message" width="800" height="450" /></center> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="datagearのapi">DataGearのAPI</h2> +<ul> + <li>PutでQueueに追加</li> + <li>TakeでQueueからの取り出し</li> + <li>PeekでQueueから取り出さない読み出し + <ul> + <li>Takeされない限り同じDataGearを読み出し続ける</li> + </ul> + </li> + <li>フレームごとにPeekでゲームオブジェクトの状態をUnity側で見れる</li> + <li>通信停止/遅延でもUnityの動作に影響を与えない</li> + <li>スケーラビリティやLAN/WAN構成はTopologyManagerのDGM porxyの管理</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="javacのannotation">Java/C#のannotation</h2> +<ul> + <li>クラスやフィールドあるいはメソッドに付ける</li> + <li>ユーザ定義可能なmeta計算属性</li> + <li>MessagePackで通信可能なフィールドをannotationで指定する</li> + <li>Christieで通信パターンを指定するのにannotationを用いる</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="dgのannotation">DGのannotation</h2> +<ul> + <li>Take + <ul> + <li>先頭のDG を読み込み、そのDG を削除する</li> + </ul> + </li> + <li>Peek + <ul> + <li>先頭のDG を読み込むがDG を削除しない</li> + <li>操作をしない場合は同じデータを参照し続ける</li> + </ul> + </li> + <li>TakeFrom + <ul> + <li>Take と同じ動作だが、remote 先のDGMを指定できる</li> + </ul> + </li> + <li>PeekFrom + <ul> + <li>Peek と同じ動作だが、remote 先のDGMを指定できる</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christieによる分散プログラミング">Christieによる分散プログラミング</h2> +<ul> + <li>Take/Put/Peekがデータベースのトランザクション</li> + <li>ここではトランザクションはゲームプレイヤー間の合意されたイベント</li> + <li>複数のプレイヤーが関与する分散プログラムをTake/Put/Peekでローカルに記述できる</li> + <li>ローカルな記述を組み合わせて分散プログラムを記述する</li> + <li>ネットワークの変化、故障、性能の多様性を吸収する</li> + <li>Christieのデバッガー(モデル検査など)も使用可能</li> + <li>TopologyManagerで負荷軽減やチート対策が可能</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="ローカルnodeから見たchristie">ローカルnodeから見たChristie</h2> +<ul> + <li>型のあるDataGear とKey を持つタプル空間、DataGearManager として格納</li> + <li>他のノードのDGM のproxyに書き込むことで通信</li> + <li>CodeGear (クラスやスレッド)</li> + <li>DataGear (変数データ)</li> + <li>CodeGearManager (CG,DG,DGMを管理)</li> +</ul> +<center><img src="../Paper/images/GearsRelationships.pdf" alt="message" width="550" height="350" /></center> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christie上でnetwork-topologyの形成">Christie上でNetwork Topologyの形成</h2> +<ul> + <li>参加を表明したノードにDataGearManager proxyを決まった名前で作成</li> + <li>ノード同士の配線を指示</li> + <li>分散プログラムの開始終了</li> + <li>Treeなどの動的Topologyは自動的に接続される</li> +</ul> +<center><img src="../Paper/images/DynamicTopology.pdf" alt="message" width="550" height="350" /></center> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christie-sharp-のコード例">Christie Sharp のコード例</h2> +<ul> + <li>Mainでport10001でChristie フレームワークを起動(CreateCGM)</li> + <li>最初のCodeGearをCodeGearManagerに対して実行する + <pre><code class="language-cs">public static void Main(string[] args) { + StartCountUp start = StartCountUp(createCGM(10001)); +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="codegear-startcountup">CodeGear StartCountUp</h2> +<ul> + <li>CodeGearはCodeGearManagerを引数として持つ(baseでcgmに対してアクセスを許可)</li> + <li>CodeGearManagerがRun(cgm)をThreadPoolを使って呼び出す + <pre><code class="language-cs:StartCountUp.cs">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 + } +} +</code></pre> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="codegear-countupper">CodeGear CountUpper</h2> + </li> + <li>key countのDataGearが来たらCountUpperのRunが実行される + <pre><code class="language-cs:CountUpper.cs">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を終了 + } + } +} +</code></pre> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="datagearcountobject">DataGear CountObject</h2> + </li> + <li>MessagePackを使って通信されるDataGear</li> + <li>Take/Put/Peekはこれに対して行われる + <pre><code class="language-cs:CountObject.cs">[MessagePackObject] +public class CountObject { + public int number; + public CountObject(int number) { // コンストラクタ + this.number = number; + } +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="unityの従来の通信ライブラリ">Unityの従来の通信ライブラリ</h2> +<ul> + <li>Unityはフレーム単位で処理を行う</li> + <li>IEnumeratorでフレームを跨ぐ処理を記述する</li> + <li>Send/Recieveなどでは通信を記述しづらい</li> + <li>Photon Unity Network 2(PUN2) + <ul> + <li>Cloud ServerサービスPhoton Cloudがある</li> + <li>Server側は開発できない</li> + </ul> + </li> + <li>Mirror + <ul> + <li>OSSで開発が行われている</li> + <li>メソッドをServerで実行し結果を反映</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="photon-unity-network2">Photon Unity Network2</h2> +<pre><code class="language-cs">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); + } +} +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="mirror">Mirror</h2> +<pre><code class="language-cs">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); + } +} +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="cへの書き換える利点">C#への書き換える利点</h2> +<ul> + <li>ChristieはJavaで実装されている + <ul> + <li>C#に書き換えを行うべきか</li> + </ul> + </li> + <li>JavaをC#上で呼び出す方式 + <ul> + <li>annotationが使用できない</li> + </ul> + </li> + <li>Unityはandroidの開発向けにjarファイルからJavaのメソッドをC#上で呼び出せる機能がある + <ul> + <li>stringを使用してリソースディレクトリから検索し、使用</li> + <li>高速化が求められる並列分散プログラミングには不適</li> + </ul> + </li> + <li>記述方法が似ているため移植が行いやすい</li> + <li>ThreadPoolをC#で統一できる</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="書き換えの方針">書き換えの方針</h2> +<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> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="take-annotationの実装">Take annotationの実装</h2> +<ul> + <li>Christie ではDGを取得するためにannotation を使用している + <ul> + <li>C# ではannotation と同様の機能にattribute があり、Take をattribute で実装した</li> + </ul> + </li> + <li>Take はフィールド変数に対して適用する</li> + <li>Javaの場合 + <pre><code class="language-java:Take.java">@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Take { } +</code></pre> + </li> + <li>C#の場合 + <pre><code class="language-cs:Take.cs">[AttributeUsage(AttributeTargets.Field)] +public class Take : Attribute { } +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="messagepackの相違点">MessagePackの相違点</h2> +<ul> + <li>Christie ではMessagePack を使用してデータをシリアライズし送受信している + <ul> + <li>インスタンス内のpublic 変数に対してシリアライズ可能</li> + </ul> + </li> + <li>Java版はバージョンが古いため、現在はサポートされていないため最新版とは記述方法が異なる + <pre><code class="language-java:MessagePackEx.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); // デシリアライズ +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="messagepackの相違点-1">MessagePackの相違点</h2> +<ul> + <li>C# のMessagePack は複数存在している + <ul> + <li>java 版と似たような書き方をするMessagePack-CSharp を選択した + <pre><code class="language-cs">[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としても展開可能 + } +} +</code></pre> + </li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="threadpoolからtaskへの書き換え">ThreadPoolからTaskへの書き換え</h2> +<ul> + <li>Christie ではThreadPool を使用していた + <pre><code class="language-java:PriorityThreadPoolExecutors.java">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); + } + } +} +</code></pre> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="threadpoolからtaskへの書き換え-1">ThreadPoolからTaskへの書き換え</h2> + </li> + <li>Christie Sharp ではThreadPoolより高機能なTask を用いて書き換えを行った</li> + <li>Task は複雑な非同期処理を通常のコーディングと同じ感覚で直感的に記述</li> + <li>裏でThreadPool が動作するため大きく動作は変わらない + <pre><code class="language-cs:ThreadPoolExecuters.cs">public class ThreadPoolExecutors { + public ThreadPoolExecutors(int nWorkerThreads, int nIOThreads) { // コンストラクタ + ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads); + } + public void Execute(CodeGearExecutor command) { + Task.Factory.StartNew(() => command.Run()); // Taskを使用 + } +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christie-sharpのunityのコード例">Christie SharpのUnityのコード例</h2> +<ul> + <li>ゲームオブジェクトの座標をもう1つのゲームオブジェクトに追従させる例題</li> + <li>StartやUpdateはMonoBehaviourを継承する</li> +</ul> + +<pre><code class="language-cs:TransformMoveTest.cs">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()); + } +} + +</code></pre> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christie-sharpのunityのコード例-1">Christie SharpのUnityのコード例</h2> +<ul> + <li>TransformなどのUnity AIPはMainThreadでのみ動作 + <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(_ => { // MainThreadへ処理を移譲 + transform.position = pos; + }, null); + } +} +</code></pre> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="christie-sharpの利点">Christie Sharpの利点</h2> +<ul> + <li>Unityのフレーム同期処理とChristieの並列分散処理が共存 + <ul> + <li>CodeGear/DataGearを利用した待ち合わせ処理</li> + <li>CodeGearの処理はTaskによってThreadPoolで行われる</li> + <li>Christieを用いた非同期な並列処理が可能</li> + <li>通信が切断した際にUnityの動作に影響を与えない</li> + <li>通信先の参照データをPeekで待ち合わせないで取得する</li> + <li>Take/PutによりトランザクションとしてDataGearをUpdate</li> + <li>TopologyManagerによりDGMのproxyネットワークが構成される</li> + <li>TopologyManagerにCookieの機能があるため、改良すれば切断から復帰可能</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="まとめ">まとめ</h2> +<ul> + <li>Christie をUnity で使用するためにC# に書き換えを行った</li> + <li>書き換え方針としては、attribute やMessagePack などC# 独自の機能に対応しつつ元のソースコードと同じ機能になるように実装</li> + <li>Unityで動作検証を行い、正しく動作することを確認した + <ul> + <li>Christie Sharpを利用したゲームの開発が可能</li> + <li>ゲーム班などでネットワークゲームを容易にプログラムできる</li> + </ul> + </li> + <li>TopologyManagerで自由にネットワーク環境を構築できる</li> + <li>Take/Peek/Putを利用したゲームと相性の良いプログラミング</li> + <li>Unity既存のライブラリとの比較を行った</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="今後の課題">今後の課題</h2> +<ul> + <li>TopologyManagerの完成 + <ul> + <li>2nd keyを用いたTreeMapの通信</li> + </ul> + </li> + <li>Christie Sharpの性能検証を行う + <ul> + <li>Aliceで動作していた水族館の例題</li> + <li>Christie Sharpを用いた100人規模のゲーム開発</li> + </ul> + </li> +</ul> + + +</div> + + +</div><!-- presentation --> +</body> +</html>