annotate Paper/chapter/2-RewriteCS.tex @ 20:d550ccb7f803

update chapter 2
author riono <e165729@ie.u-ryukyu.ac.jp>
date Sat, 29 Jan 2022 19:39:47 +0900
parents Paper/chapter/2-Unity.tex@54229d70b7b3
children 866f4329e430
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
1 \chapter{ChristieのC\#への書き換え}
18
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
2
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
3 \section{Unity}
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
4 UnityはUnity Technologiesが開発、公開しているゲームエンジンである。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
5 画像や3Dモデルの表示、物理演算、UIのイベント機能などゲーム制作に必要な機能が標準で備わっており、
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
6 個人でもゲーム開発が可能となっている。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
7 さまざまなプラットフォームに対応可能であり、PC、iOS、Androidやその他コンシューマ機器も開発可能である。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
8 また、非常に動作が軽いことも特徴であり、スペックが低いノートPCでも十分ゲーム開発が可能である。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
9
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
10 プログラミング言語としてはC\#がサポートされている。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
11 最新バージョンである2021.2.8ではC\# 9がサポートされており、
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
12 .NET Frameworkはバージョン4.6に対応している。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
13 C\#向けの既存のAPIや外部ライブラリ、Unity用に開発されたAPIなども使用可能である。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
14 拡張性が高く、開発に必要な機能を作成しUnityのメニューから実行することも可能である。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
15
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
16
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
17 本研究では、開発環境を整えるためのハードルの低さ、公開されている通信ライブラリの豊富さなどを考慮しUnityを採用した。
20
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
18 Unity上でChristieを動作させるために、Javaで記述されているChristieをC\#に書き換えを行う。
18
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
19
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
20 \section{Christie Sharpの書き換えの基本方針}
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
21 Javaで記述されたChristieと区別するため、C\#で記述するChristieをChrisite Sharpとする。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
22 Chrisite Sharpではコードの保守性や、Christie設計時の意図などを守るため、Chrisiteと同じ挙動、同じ動作をする必要がある。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
23 初めにC\#単体で動作するように、Christieの核となる部分の書き換えを行った。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
24
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
25
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
26 ChristieはJava 9から開発されていたため、現在では非推奨なコードやバージョンアップが必要な箇所が存在する。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
27 そこで書き換えを行う際に、C\#に対応しつつ処理動作の向上や最適化を行うために以下の改良を行った。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
28
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
29 \begin{itemize}
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
30 \item MessagePackの変更及びバージョンアップ
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
31 \item ThreadPoolからTaskへの変更
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
32 \end{itemize}
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
33
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
34
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
35 \section{attributeの実装}
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
36 ChristieではDGを取得する際に、annotationを用いてTakeやPeekなどのコマンドを処理していた。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
37 Christie Sharpはannotationではなく、代わりにattributeを利用してコマンドの処理を行っている。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
38
20
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
39 \lstinputlisting[label=src:JavaTakeImple, caption=JavaにおけるTake annotationの実装]{src/java/Take.java}
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
40 \lstinputlisting[label=src:CSTakeImple, caption=C\#におけるTake attributeの実装]{src/cs/Take.cs}
18
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
41
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
42 ソースコード\ref{src:JavaTakeImple}はJavaにおけるTake annotationの実装である。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
43 Javaでannotationを自作する際には、\@interfaceで宣言を行う。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
44 1行目ではannotationの適用可能箇所を指定しておりフィールド変数に対して付与可能としている。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
45 また、2行目はannotationの情報をどの段階まで保持するかを指定しており、Takeの場合JVMによって保存され、ランタイム環境で使用可能となっている。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
46
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
47 ソースコード\ref{src:CSTakeImple}はC\#におけるTake attributeの実装である。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
48 C\#でattributeを自作する際には、System.Attributeを継承する必要がある。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
49 attributeの適用可能箇所については、1行目にてフィールド変数を指定している。
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
50
20
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
51
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
52 attributeの使用方法はannotationと同じく変数の宣言の前に、[ ]内に使用するattributeを宣言する(ソースコード\ref{src:CSTakeExample})。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
53
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
54 \lstinputlisting[label=src:CSTakeExample, caption=Take attributeの例]{src/cs/TakeExample.cs}
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
55
18
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
56
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
57
20
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
58 \section{TaskによるCodeGearの処理}
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
59 ChrisiteではCGの実行にThreadPoolを利用していた。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
60 しかしThreadPoolは管理や生成が煩雑であり、コストパフォーマンスの低下につながりやすい。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
61 C\#にはThreadをより使いやすく高機能にしたTaskという機能がある。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
62 TaskはC\#のThreadPoolを拡張しており、内部にThreadPoolと実行待ちQueueを持っている。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
63 Task.RunメソッドやTask.Factory.StartNewメソッドで処理を実行でき、処理が渡されるとThreadPoolで処理されるため、Christieと同じ動作をすると考え、Christie SharpではTaskで書き換えを行った。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
64
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
65 \lstinputlisting[label=src:JavaThreadPoolExecutor, caption=ChristieにおけるThreadPoolの実装の一部]{src/java/ThreadPoolExecutor.java}
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
66
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
67 ソースコード\ref{src:JavaThreadPoolExecutor}はChristieにおけるCodeGearを処理するThreadPoolの実装の一部である。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
68 Javaでは独自にThreadPoolを実装する際にはThreadPoolExecutorを継承する。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
69 またThreadの優先度を変更する機能が実装されており、CodeGear実行時に処理の優先度を設定することが可能となっている。
18
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
70
20
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
71 \newpage
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
72
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
73 \lstinputlisting[label=src:CSThreadPoolExecutor, caption=Christie SharpにおけるThreadPoolの実装]{src/cs/ThreadPoolExecutor.cs}
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
74
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
75 ソースコード\ref{src:CSThreadPoolExecutor}はソースコード\ref{src:JavaThreadPoolExecutor}をC\#に書き換えを行ったものである。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
76 CGの実行には14行目のExecuteを呼び出し、Taskで実行を行っている。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
77
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
78
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
79 Threadの優先度による実行順変更については、実装の優先度が低かったため今回は実装を行っていない。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
80 Taskのスケジューラーは自作可能であり、実行待ちQueueの処理順を変更することができるため実装可能である。
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
81
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
82
d550ccb7f803 update chapter 2
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
83 \section{Socket通信用のThreadをTaskに変更}
18
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
84
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
85
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
86 \section{MessagePackの変更}
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
87
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
88
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
89 \section{送信データの修正}
54229d70b7b3 updatae
riono <e165729@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
90