# HG changeset patch # User riono # Date 1620311839 -32400 # Node ID 102de90587f534e2a67c6ca941fa3b7d0187ed37 # Parent 575b1e144749bcaa8ab524d58678bea693b54164 update diff -r 575b1e144749 -r 102de90587f5 Paper/riono-sigos.bib --- a/Paper/riono-sigos.bib Thu May 06 22:53:53 2021 +0900 +++ b/Paper/riono-sigos.bib Thu May 06 23:37:19 2021 +0900 @@ -1,41 +1,47 @@ -@Misc{rfbprotocol, - author = "{RICHARDSON, T., AND LEVINE, J.}", - title = "The remote framebuffer protocol. RFC 6143", - month = "mar", - year = 2011 +@Misc{christie, + author = "{照屋 のぞみ,河野 真治}", + title = "分散フレームワークChristieの設計", + journal = "琉球大学理工学研究科修士論文", + month = "", + year = 2018 } -@Misc{tightvnc, - author = "{TightVNC Software}", - howpublished = "\url{http://www.tightvnc.com}" + +@Misc{alice, + author = "{赤嶺 一樹,河野 真治}", + title = "分散ネットワークフレームワークAlice の 提案と実装", + journal = "琉球大学理工学研究科修士論文", + month = "", + year = 2019 } -@Misc{vnc, - author = "{RICHARDSON, T., STAFFORD-FRASER, Q., WOOD, K. R., AND HOPPER,}", - title = "A. Virtual Network Computing", - month = "jan", - year = 1998 +@Misc{unity, + author = "{Unity}", + title = "", + howpublished = "\url{https://unity.com}" } -@Misc{zlib, - author = "{LOUP GAILLY, J., AND ADLER, M.}", - title = "zlib: A massively spiffy yet delicately unobtrusive compression library.", - howpublished = "\url{http://zlib.net}" +@Misc{pun2, + author = "{Photon Unity Networking 2}", + title = "", + howpublished = "\url{https://doc-api.photonengine.com}" +} +@Misc{mlapi, + author = "{Unity Multiplayer MLAPI}", + title = "", + howpublished = "{https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi}" } -@article{taninari:2011a, - author = "{Yu TANINARI and Nobuyasu OSHIRO and Shinji KONO}", - title = "VNCを用いた授業用画面共有システムの実装と設計", - journal = "日本ソフトウェア科学会第28回大会論文集", - month = "sep", - year = 2011 +@Misc{csmessage, + author = "{MessagePack-CSharp}", + title = "", + howpublished = "{https://github.com/neuecc/MessagePack-CSharp}" } -@article{taninari:2012a, - author = "{Yu TANINARI and Nobuyasu OSHIRO and Shinji KONO}", - title = "VNCを用いた授業用画面共有システムの設計・開発", - journal = "情報処理学会 システムソフトウェアとオペレーティング・システム研究会(OS)", - month = "may", - year = 2012 -} \ No newline at end of file + +@Misc{mspack, + author = "{msgpack-java}", + title = "", + howpublished = "{https://github.com/msgpack/msgpack-java}" +} diff -r 575b1e144749 -r 102de90587f5 Paper/riono-sigos.pdf Binary file Paper/riono-sigos.pdf has changed diff -r 575b1e144749 -r 102de90587f5 Paper/riono-sigos.tex --- a/Paper/riono-sigos.tex Thu May 06 22:53:53 2021 +0900 +++ b/Paper/riono-sigos.tex Thu May 06 23:37:19 2021 +0900 @@ -66,7 +66,7 @@ \author{河野 真治}{Shinji Kono}{IE}[kono@ie.u-ryukyu.ac.jp] \begin{abstract} - FPSやMMORPGなどのゲームにおける通信方式には、クライアントサーバ方式とp2p方式の2つが考えられる。しかし、クライアントの負荷軽減やチート対策などを理由にクライアントサーバ方式が主流である。データの同期にはサーバを経由するため低速である。 + FPSやMMORPGなどのゲームにおける通信方式には、クライアントサーバ方式とp2p方式の2つが考えられる。クライアントの負荷軽減やチート対策などを理由にクライアントサーバ方式が主流である。しかし、データの同期にはサーバを経由するため低速である。 そこで本研究室で開発している分散フレームワークChristieを用いることで、高速かつ、安全に、データの同期を行いたいと考えた。 本研究ではChristieをゲームエンジンUnityに対応するため、C\#への書き換えを行う。 \end{abstract} @@ -96,7 +96,7 @@ オンラインゲームはさまざまな回線を通じて複数のプレイヤーが関与する分散プログラムである。通信形態はクラウド上のサーバを 中心とした形態が多い。分散プログラムを正しく書くことは難しく、また、ゲームの場合はさまざまな攻撃が行われることが多い。 -ネットワーク上のパケットを用いた攻撃やウイルスもそうだが、ゲームのルールにそっていても、プレイヤーのデバイス上で +ネットワーク上のパケットを用いた攻撃やウイルスもそうだが、ゲームのルールに沿っていても、プレイヤーのデバイス上で プログラムを用いたチートが行われる場合もある。 TCP/IPが現状のインターネットの標準的なプロトコルであり、その上に、信頼性はないがコネクションなしにデータを転送できる @@ -106,7 +106,7 @@ さまざまな通信ライブラリが存在する。 当研究室では初代PlayStation用に作成した Federated Linda を拡張して、CodeGear / DataGear を用いた分散フレームワークを -開発中である。これは Java でかかれており、Unity 上で直接動かすことはできない。そこで、C\# で再実装することにより +開発中である。これは Java で書かれており、Unity 上で直接動かすことはできない。そこで、C\# で再実装することにより Unity 上のゲームの通信ライブラリとして使用できるようにする。 従来の通信ライブラリと異なり、型のあるDataGear をタプル空間(DataGearManger/DGM)に Key を持つストリームとして @@ -125,10 +125,10 @@ 本論文では Java で書かれた Chirstie と C\# で書かれたものの説明し、その機能と実装の差について考察する。 \section{Christie のC\#への書き換えについて} -Christie はAlice というプロジェクトで開発が行われていた。しかしAlice には様々な問題点があった。データを管理しているlocalDataGear をシングルトンで設計してしまい、local で接続を行う際には複数のアプリケーションを立ち上げる必要がある。また、データを受け取る際にObject 型で受け取っている影響で何の方が送信されるか不明瞭である点などがあり、再設計を行う必要性が発生した。それらの問題点を解消するためにAlice を再構築したものがChristie である。 +Christie\cite{christie} はAlice\cite{alice} というプロジェクトで開発が行われていた。しかしAlice には様々な問題点があった。データを管理しているlocalDataGear をシングルトンで設計してしまい、local で接続を行う際には複数のアプリケーションを立ち上げる必要がある。また、データを受け取る際にObject 型で受け取っている影響で何の型が送信されるか不明瞭である点などがあり、再設計を行う必要性が発生した。それらの問題点を解消するためにAlice を再構築したものがChristie である。 Christie はAlice の機能や概念を維持しつつ、Alice で発生していた問題点やプログラムの煩雑さなどを解消している。 -今回Chrstie をC\# への書き換えを行う。これは、ゲーム制作において多くの開発者に使用されているUnity に対応するためである。Unity はC\# でプログラミングが可能であり、C\# とjavaは比較的書き方が似ているため、書き換えが行いやすいと判断した。 +今回Chrstie をC\# へ書き換えを行う。これは、ゲーム制作において多くの開発者に使用されているUnity に対応するためである。Unity はC\# でプログラミングが可能であり、C\# とjavaは比較的書き方が似ているため、書き換えが行いやすいと判断した。 C\# への書き換えの方針は、java 版との互換性を保つために極力同じ動作をするAPI を用いて実装を行った。 @@ -161,7 +161,7 @@ \end{center} \end{figure} -put操作を行った後は、対象のDGMの中にqueueとして保管される。DataGearを取り出す際には、CodeGearm内で宣言した変数データにannotationをつける。DataGearのannotationにはTake、Peek、TakeFrom、PeekFromの4つがある。 +put操作を行った後は、対象のDGMの中にqueueとして保管される。DataGearを取り出す際には、CodeGear内で宣言した変数データにannotationをつける。DataGearのannotationにはTake、Peek、TakeFrom、PeekFromの4つがある。 \begin{description} @@ -198,7 +198,7 @@ Code \ref{code:javaHWC} 、Code \ref{code:javaFHW} がCodeGearにあたる。それぞれのフィールド変数には@Take annotation が付いており、DGM に格納されたkey を参照してデータを取得する。その後DataGearManger に格納されたデータは破棄される。 -Code \ref{code:javaHWC} では最初にフィールド変数 helloWorld にstring 型の"hellow"を取得、print を行い、再びkey hello、data "hello" をDGM にput している。また8行目で自らをsetpuしているため、再帰的にHelloWorldCodeGear が再実行される。2回目の実行ではフィールド変数 helloWorld に"world" が格納と出力がされ、key world、data "world" がDGM に格納される。Code \ref{code:javaHWC} でput した"hello" と"world" は最終的に、Code \ref{code:javaFHW} の同名のフィールド変数に格納される。 +Code \ref{code:javaHWC} では最初にフィールド変数 helloWorld にstring 型の"hello"を取得、print を行い、再びkey hello、data "hello" をDGM にput している。また8行目で自らをsetupしているため、再帰的にHelloWorldCodeGear が再実行される。2回目の実行ではフィールド変数 helloWorld に"world" の格納と出力がされ、key world、data "world" がDGM に格納される。Code \ref{code:javaHWC} でput した"hello" と"world" は最終的に、Code \ref{code:javaFHW} の同名のフィールド変数に格納される。 2回目の実行でもsetup しているが、DGMにはkey helloWorld のデータが無いため、3回目以降は実行されない。 Code \ref{code:javaHWC} の2回の実行後、Code \ref{code:javaHWC} のローカル変数hello とworld が全て揃ったことによりCode \ref{code:javaHWC} が実行されプログラムは終了する。 @@ -217,7 +217,7 @@ \section{Unity} -Unity はUnity Technologies が開発を行っている、ゲームエンジンである。世界で最も使用されているゲームエンジンであり、ゲーム制作に必要な機能が揃っており、個人でもゲーム開発が可能になっている。 +Unity\cite{unity} はUnity Technologies が開発を行っている、ゲームエンジンである。世界で最も使用されているゲームエンジンであり、ゲーム制作に必要な機能が揃っており、個人でもゲーム開発が可能になっている。 主な特徴としては、様々なプラットフォームに対応可能であり、PC、iOS、Androidやその他コンシューマも開発可能である。また非常に軽いことも特徴であり、スペックが低いノートPC でも十分ゲーム開発が可能である。 プログラミング言語はC\# が使用でき、C\# 既存のAPI やUnity 用に拡張されたAPI なども使用可能である。 @@ -244,12 +244,12 @@ \lstinputlisting[caption=C\# における Take attribute の実装, label=code:csTake]{src/Take.cs} -java でannotation を自作する際には、 @interfacs で宣言する。また、Code \ref{code:javaTake} の8行目ではannotation情報をどの段階まで保持するかを指定しており、Take の場合 JVMによって保存され、ランタイム環境で使用できる。9行目ではannotationの適用可能箇所を指定しており、フィールド変数に対して適応可能となっている。 +java でannotation を自作する際には、 @interface で宣言する。また、Code \ref{code:javaTake} の2行目ではannotation情報をどの段階まで保持するかを指定しており、Take の場合 JVMによって保存され、ランタイム環境で使用できる。3行目ではannotationの適用可能箇所を指定しており、フィールド変数に対して適応可能となっている。 C\# でattribute を作成する際には、 System.Attributeを継承する必要がある。attribute の適用可能箇所については、Code \ref{code:csTake} の4行目でフィールド変数を指定している。 \section{MessagePackの相違点} -Christie ではデータを送信する際に、MessagePack を使用してデータを圧縮し、送信している。java 版で使用しているMessagePack はバージョンが古く現在はサポートされてない。そのためMessagePack の最新版とは記述方法が異なっている。Code \ref{code:javamspackEx} はMessagePack の使用方法を示したものである。 +Christie ではデータを送信する際に、MessagePack\cite{mspack} を使用してデータを圧縮し、送信している。java 版で使用しているMessagePack はバージョンが古く現在はサポートされてない。そのためMessagePack の最新版とは記述方法が異なっている。Code \ref{code:javamspackEx} はMessagePack の使用方法を示したものである。 \lstinputlisting[caption=java におけるMessagePack の使用方法, label=code:javamspackEx]{src/MessagePackEx.java} @@ -258,7 +258,7 @@ 解凍にはmsgpack.read を使用し、圧縮されたbyte[] 型と圧縮対象のクラスを渡すことで解凍できる。 -C\# のMessagePack は複数存在しており、java と同様な書き方をするMessagePack-CSharp を選択した。 +C\# のMessagePack は複数存在しており、java と同様な書き方をするMessagePack-CSharp\cite{csmessage} を選択した。 \lstinputlisting[caption=C\# におけるMessagePack の使用方法, label=code:csmspackEx]{src/MessagePackEx.cs} @@ -284,7 +284,7 @@ 実装の優先度が低かったため、今回はCodeGear のpriority による実行順変更については実装を行わなかった。 \section{Unity で使用されている通信ライブラリとの比較} -Unityで主に使用されている通信ライブラリにPhoton Unity Networking 2 (以下PUN2)と、公式サポートされたMLAPI の2つとChristie \# の比較を行う。 +Unityで主に使用されている通信ライブラリにPhoton Unity Networking 2\cite{pun2} (以下PUN2)と、公式サポートされたMLAPI\cite{mlapi} の2つとChristie \# の比較を行う。 PUN2 はUnity でオンラインゲームを作成する際に最もよく使用される通信ライブラリの1つである。Photon Cloud というサービスがあり、自前でサーバを用意せずともサーバを使うことが可能である。サーバクライアント方式であり、TCPで通信を行っている。ネームサーバ、マスターサーバ、ゲームサーバの3つのサーバがあり、Photon Cloud に接続するとネームサーバに入り、接続している地域からマスターサーバが自動で選択される。マスターサーバではマッチメイキングが行われ、完了するとルームが作成されているゲームサーバに転送される。 Unity の実行は各クライアントで行われ、サーバには同期に必要なデータが送信される。また送受信できるデータはUnity 用に適応されており、コードを書かなくても座標であるTransform や物理演算のRigidBody などは同期が可能になっている。