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