Mercurial > hg > Papers > 2021 > riono-sigos
view Paper/riono-sigos.tex @ 14:73a3c53c7568
fix sorucecode
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 04 May 2021 20:17:17 +0900 |
parents | 8336f55a92e7 |
children | 2dd23f9603b3 |
line wrap: on
line source
%% %% 研究報告用スイッチ %% [techrep] %% %% 欧文表記無しのスイッチ(etitle,eabstractは任意) %% [noauthor] %% %\documentclass[submit,techrep]{ipsj} \documentclass[submit,techrep,noauthor]{ipsj} \usepackage[dvips]{graphicx} \usepackage{latexsym} \usepackage{url} \usepackage{listings} \usepackage{caption} \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline} \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\} \def\|{\verb|} % %\setcounter{巻数}{59}%vol59=2018 %\setcounter{号数}{10} %\setcounter{page}{1} \lstset{ language=java, tabsize=2, numbers=left, frame=single, basicstyle={\ttfamily\footnotesize}, % identifierstyle={\footnotesize}, % commentstyle={\footnotesize\itshape}, % keywordstyle={\footnotesize\bfseries}, % ndkeywordstyle={\footnotesize}, % stringstyle={\footnotesize\ttfamily}, breaklines=true, captionpos=t, columns=[l]{fullflexible}, % xrightmargin=0zw, % xleftmargin=1zw, % aboveskip=1zw, numberstyle={\scriptsize}, % stepnumber=1, numbersep=0.5zw, % lineskip=-0.5ex, } \renewcommand{\lstlistingname}{Code} \begin{document} \title{継続を使用する並列分散フレームワークのUnity実装} %\etitle{How to Prepare Your Paper for IPSJ SIG Technical Report \\ (version 2018/10/29)} \affiliate{KIE}{琉球大学大学院理工学研究科情報工学専攻} \affiliate{IE}{琉球大学工学部工学科知能情報コース} \author{安田 亮}{Ryo Yasuda}{KIE}[riono210@cr.ie.u-ryukyu.ac.jp] \author{河野 真治}{Shinji Kono}{IE}[kono@ie.u-ryukyu.ac.jp] \begin{abstract} FPSやMMORPGなどのゲームにおける通信方式には、クライアントサーバ方式とp2p方式の2つが考えられる。しかし、クライアントの負荷軽減やチート対策などを理由にクライアントサーバ方式が主流である。データの同期にはサーバを経由するため低速である。 そこで本研究室で開発している分散フレームワークChristieを用いることで、高速かつ、安全に、データの同期を行いたいと考えた。 本研究ではChrisiteをゲームエンジンUnityに対応するため、C\#への書き換えを行う。 \end{abstract} % %\begin{jkeyword} %情報処理学会論文誌ジャーナル,\LaTeX,スタイルファイル,べからず集 %\end{jkeyword} % %\begin{eabstract} %This document is a guide to prepare a draft for submitting to IPSJ %Journal, and the final camera-ready manuscript of a paper to appear in %IPSJ Journal, using {\LaTeX} and special style files. Since this %document itself is produced with the style files, it will help you to %refer its source file which is distributed with the style files. %\end{eabstract} % %\begin{ekeyword} %IPSJ Journal, \LaTeX, style files, ``Dos and Dont's'' list %\end{ekeyword} \maketitle \section{オンラインゲームにおけるデータ通信} \section{Christieの基礎概念} Chrisiteは当研究室で開発している分散通信フレームワークである。同じく当研究室で開発している GearsOSのファイルシステムに組み込まれる予定があるため、GearsOSを構成する言語 Continuation based Cと似た概念を持っている。 Chrisiteに存在する概念として以下のようなものがある。 \begin{itemize} %箇条書き \item CodeGear \item DataGear \item CodeGearManager \item DataGearManager \end{itemize} 以下はjava版のChrisiteについて解説を行う。 CodeGearはクラスやスレッドに相当する。 DataGearは変数データに相当し、CodeGear内でannotationを用いて変数データを取得する。CodeGear内に記述した全てのDataGearの中にデータが格納された際に、初めてそのCodeGearが実行されるという仕組みになっている。 CodeGearManagerはノードであり、CodeGear、DataGear、DataGearManagerを管理する。 DataGearManagerはDataGearを管理するものであり、putという操作により変数データ、つまりDataGearを格納できる。DataGearManagerのput操作を行う際にはLocalとRemoteのどちらかを選び、変数のkeyとデータを引数として渡す。 Localであれば、LocalのCodeGearManagerが管理しているDataGearManagerに対しDataGearを格納していく。Remoteであれば、接続したRemote先のCodeGearManagerが管理しているDataGearManagerにDataGearを格納できる。 put操作を行った後は、対象のDataGearManagerの中にqueueとして保管される。DataGearを取り出す際には、CodeGearm内で宣言した変数データにannotationをつける。DataGearのannotationにはTake、Peek、TakeFrom、PeekFromの4つがある。 \begin{description} \item[Take] 先頭のDataGear を読み込み、そのDataGear を削除する。DataGearが複数ある場合、この動作を用いる \item[Peek] 先頭のDataGear を読み込むが、DataGear が削除されない。そのため、特に操作をしない場合は同じデータを参照し続ける。 \item[TakeFrom (Remote DGM name)] Take と似ているが、Remote DGM nameを指定することで、その接続先(Remote) のDataGearManager からTake 操作を行える。 \item[PeekFrom (Remote DGM name)] Peek と似ているが、Remote DGM name を指定することで、その接続先(Remote) のDataGearManager からPeek 操作を行える。 \end{description} \section{プログラムの例} Code \ref{code:javaSHW} はChrisite の機能を使用してhello world を出力する例題である。 CodeGearManager を作り、setup(new CodeGear) を行うことで各CodeGear に記述されたDataGear の待ち合わせを行う。全てのDataGear が揃った場合にCodeGear が実行される。CodeGearaManager の作成方法はStartCodeGear を継承したものから、createCGM(port) を実行することにより、CodeGearManager が作成できる。 \lstinputlisting[caption=StartHelloWorld, label=code:javaSHW]{src/StartHelloWorld.java} \section{歴史について} \section{Unity} \section{annotation の書き換え} java 版ではDataGear を取得する際に、annotation という java の機能を用いて行った。C\#には annotation はなく、代わりにattribute を利用して DataGear の取得を行っている。 以下のCode \ref{code:javaTake}、Code \ref{code:csTake}はjava とC\# におけるTakeの実装である。 \lstinputlisting[caption=java における Take annotation, label=code:javaTake]{src/Take.java} \lstinputlisting[caption=C\# における Take attribute, label=code:csTake]{src/Take.cs} java でannotation を自作する際には、 @interfacs で宣言する。また、Code \ref{code:javaTake} の8行目ではannotation情報をどの段階まで保持するかを指定しており、Take の場合 JVMによって保存され、ランタイム環境で使用できる。9行目ではannotationの適用可能箇所を指定しており、フィールド変数に対して適応可能となっている。 C\# でattribute を作成する際には、 System.Attributeを継承する必要がある。attribute の適用可能箇所については、Code \ref{code:csTake} の4行目でフィールド変数を指定している。 \section{MessagePackの相違点} Christie ではデータを送信する際に、MessagePack を使用してデータを圧縮し、送信している。java 版で使用しているMessagePack はバージョンが古く現在はサポートされてない。そのためMessagePack の最新版とは記述方法が異なっている。Code \ref{code:mspackEx} はMessagePack の使用方法を示したものである。 \lstinputlisting[caption=java 版におけるMessagePack の使用方法, label=code:javamspackEx]{src/MessagePackEx.java} MessagePack を使用するには圧縮するクラスに対して @Message annotationをつける必要がある。これにより、クラス内で定義したpublic変数が圧縮される。 Code \ref{code:javamspackEx} の17 - 21行目は圧縮解凍の例であり、MessagePackのインスタンスを作成後、msgpack.write(data) を行うことでbyte[] 型にdataを圧縮できる。 解凍にはmsgpack.read を使用し、圧縮されたbyte[] 型と圧縮対象のクラスを渡すことで解凍できる。 C\# のMessagePack は複数存在しており、java と同様な書き方をするMessagePack-CSharp を選択した。 \lstinputlisting[caption=C\# 版におけるMessagePack の使用方法, label=code:csmspackEx]{src/MessagePackEx.cs} MessagePack-CSharp ではjava 版と同様にクラスに対して圧縮を行うためCode \ref{code:csmspackEx} の1行目で MessagePackObject attribute を追加している。また、圧縮する変数に対してkey を設定することができ、int やstring を指定することができる。 データの圧縮にはMessagePackSerializer.Serialize (data) を使用し、byte[] 型に圧縮される。解凍にはMessagePackSerializer.Deserialize$<T>$(data) を使用する。Deserializeはジェネリスク関数であるため、$<>$内に解凍するデータのクラスを指定する。 Code \ref{code:csmspackEx} の21行目では、変数それぞれにkey を設定していることでjson に展開することが可能である。 \section{CodeGear 実行時のThreadPool からTask への変更} java では別Thread を \section{C\#への書き換え後のプログラムの例} \lstinputlisting[caption=C\# StartHelloWorld, label=code:csSHW]{src/StartHelloWorld.cs} \section{Unityでの動作} \section{チート対策について} \section{実装の現状} \nocite{*} \bibliographystyle{ipsjunsrt} \bibliography{riono-sigos} \end{document}