annotate presen/slide.md @ 13:7b39f43e4088

fix english description.
author Kazuma Takeda
date Wed, 15 Feb 2017 17:20:12 +0900
parents 10a1f30eb748
children b2f7835ac00e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
d12960315992 Add Image, delete subsection.
Kazuma Takeda
parents: 0
diff changeset
1 title: ゲームエンジンにおけるJungleDatabaseの提案
d12960315992 Add Image, delete subsection.
Kazuma Takeda
parents: 0
diff changeset
2 author: Kazuma Takeda
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
3 profile:
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
4 lang: Japanese
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
5 code-engine: coderay
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
6
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
7 # この発表のセクション
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
8
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
9 - RDBとNoSQL
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
10 - Jungle Databseの提案
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
11 - Jungleの仕様
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
12 - ゲームのデータ構造
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
13 - Jungle-Sharpの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
14 - 例題ゲームの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
15 - Jungle-Sharpの改良点
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
16
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
17 # RDBとNoSQL
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
18
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
19 Relational Databseと呼ばれるRDBは行と列からなる2次元のテーブルにより実装されているデータベース。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
20 データ型として文字列や数値、日付、Bool型がある。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
21
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
22 データの一貫性を重視しているRDBでは分散システムには向いていない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
23
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
24 NoSQL(Not Only SQL) Databaseと呼ばれる非リレーショナル型のデータベース。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
25 スキームを持たないため、扱うデータの型を気にしなくてもよい。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
26
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
27 一貫性を一部犠牲にしているNoSQLでは分散させることが可能である。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
28 CassandraやMongoDBなどが例に挙げられる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
29
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
30 # インピーダンスミスマッチ
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
31
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
32 プログラム中ではListやネスト構造によりデータを扱うことができる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
33 しかしデータベースにはそのような概念はない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
34
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
35 そこにプログラムとデータベースの間にギャップが生じる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
36 これをインピーダンスミスマッチという。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
37
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
38 RDBではネスト構造を許さない第一正規形とは相容れない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
39
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
40
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
41 # NoSQLのトランザクション
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
42
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
43 CassandraやほとんどのNoSQLではACIDなトランザクションがない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
44 トランザクション中の処理は外部からは閲覧出来ない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
45 しかし、複数行を1回で書き換える機能を持っていないため、
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
46 データを書き込んでいる途中の状態が見えてしまう場合がある。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
47
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
48 # Jungle Databaseの提案
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
49
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
50 前章までRDBではプログラムとのミスマッチや分散構造に向いていない問題、NoSQLではトランザクションでの問題点について触れた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
51 これらの問題を解決するため、当研究室で開発しているデータベースJungleを提案する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
52
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
53 Jungleは過去の変更データを保存しつつ新しい木を構築してく木構造(非破壊構造)の手法をとる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
54 非破壊にすることにより、データを読み出す側と書き込む側のデータを安全に扱うことができる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
55
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
56 Jungleは名前で管理された木のあつまりからなる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
57 木は複数のノードの集合からなる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
58
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
59 ノード自身にはKey-Valueのデータを格納することができる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
60 これはデータベースのレコードに相当する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
61
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
62 Jungleのトランザクションはルートから変更を行うノードまでコピーを行い、新しく木構造を構築する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
63 最後にルートをアトミックに入れ替えてコミットする。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
64 コミットが失敗した場合は最初からやり直す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
65 これにより、原子性を実現する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
66
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
67 Jungleはcommit logを持ち、それを他のノードやディスクに転送することにより、
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
68 分散構成と永続性を実現する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
69
13
7b39f43e4088 fix english description.
Kazuma Takeda
parents: 12
diff changeset
70 # JungleのDatabase
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
71
13
7b39f43e4088 fix english description.
Kazuma Takeda
parents: 12
diff changeset
72 Jungleの構造としては以下の図のようになっている。
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
73
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
74 <div style="text-align: center;">
13
7b39f43e4088 fix english description.
Kazuma Takeda
parents: 12
diff changeset
75  <img src="./images/transaction.pdf" alt="message" width="700">
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
76 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
77
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
78 # ゲームのデータ構造
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
79
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
80 Jungleはもともと認証管理システムやWeb向けに作られたものである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
81 これらはすべて木構造をベースとしている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
82
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
83 ゲームでも同じことが考えられる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
84 そこでゲームエンジンUnity向けにJungleの再実装を行い、ゲーム向けのデータベースとしての提案を行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
85
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
86 Unityは3Dゲームエンジンで、ゲームを構成する要素(Object)をC\#で制御する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
87 Objectは一つのゲームのシーン(一画面の状況)の中で木構造を持つ。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
88 これをシーングラフと言う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
89 シーングラフをそのままJungleに格納するという手法が考えられる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
90
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
91 # Jungle-Sharpの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
92
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
93 JungleはもともとJavaとHaskellで書かれていた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
94 今回はJava版をベースにC\#で再実装する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
95
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
96 エラーをチェックするEitherの部分だけはHaskellの要素を取ってくる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
97
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
98 # Atomic Refarenceの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
99
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
100 Jungleの木の変更(commit)はCAS(Check and Set)を用いてatomicに行われる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
101 競合している書き込み中に自分の書き込みが成功した場合に関数commit()が成功する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
102 失敗した場合ははじめからもう一度行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
103
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
104 JavaのモジュールにはAtomicRefarenceが存在した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
105 C\#では自分で作る必要があった。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
106
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
107 ``` C\#
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
108
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
109 // C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
110 public bool CompareAndSet(T newValue, T prevValue) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
111 T oldValue = value;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
112 return (oldValue
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
113 != Interlocked.CompareExchange
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
114 (ref value, newValue, prevValue));
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
115 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
116
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
117 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
118
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
119 # Listの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
120
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
121 木やリストをたどる時にJavaではIteratorを用いる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
122 Iteratorは次の値があるかを返すboolean hasNext()と、Tという型の次の値を取ってくるT next()を持つObjectである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
123 C\#では木やリストを辿りながらyeildで次の値を返す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
124 Javaでは以下のように実装されている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
125
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
126 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
127
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
128 public Iterator<T> iterator() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
129 return new Iterator<T>() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
130 Node<T> currentNode = head.getNext();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
131
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
132 @Override
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
133 public boolean hasNext() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
134 return currentNode.getAttribute()
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
135 != null;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
136 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
137
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
138 @Override
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
139 public T next() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
140 T attribute
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
141 = currentNode.getAttribute();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
142 currentNode
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
143 = currentNode.getNext();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
144 return attribute;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
145 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
146 };
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
147 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
148
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
149 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
150
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
151 # Listの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
152
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
153 C\#ではそもそも匿名クラスの中でメソッドを定義できない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
154 この場合はIEnuratorを使って書き直すことができた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
155
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
156 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
157
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
158 // C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
159 public IEnumerator<T> iterator() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
160 Node<T> currentNode = head.getNext();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
161 while (currentNode.getAttribute() != null) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
162 yield return (T)currentNode.getAttribute();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
163 currentNode = currentNode.getNext ();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
164 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
165 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
166
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
167 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
168
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
169 # Eitherのチェック
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
170
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
171 Haskellでは例外処理はモナド内部で行う設計になっている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
172 Eitherもその一つである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
173
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
174 Jungleではある処理に対してエラーであればA、
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
175 なければBをEitherに包んで返す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
176
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
177 JavaのJungleでは分岐を使ってチェックする必要があった。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
178
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
179 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
180
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
181 // Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
182 Either<Error,TreeNode> either = children.at(2);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
183 if (either.isA())
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
184 return either.a();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
185 TreeNode child = either.b();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
186
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
187 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
188
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
189 # bindの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
190
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
191 Eitherクラスに実装したbindは自身のEitherをチェックした後、
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
192 エラーがなければ関数fを実行し評価する仕組みである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
193
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
194 ```C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
195
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
196 public Either<A, B> bind (System.Func<B, Either<A, B>> f) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
197 if (this.isA ()) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
198 return this;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
199 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
200 return f (this.b ());
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
201 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
202
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
203 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
204
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
205 ユーザー側でのエラーのチェックは不要になるが、関数fのLambda式を自分で定義する必要がある。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
206 次のページにその例を示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
207
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
208 # bindの引数に渡すラムダ式の例
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
209
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
210 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
211
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
212 Either<Error, JungleTreeEditor> either = DefaultEither<Error, JungleTreeEditor>.newB(editor);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
213 Item apple = new Item("Apple");
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
214
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
215 either = either.bind ((JungleTreeEditor arg) => {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
216 return arg.putAttribute (rootNode, item.name, item);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
217 });
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
218
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
219 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
220
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
221 # 例題のゲーム
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
222
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
223 前章ではJungle-Sharpのどのように実装したかを述べた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
224
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
225 この章では実際にゲームを構築し、そのデータベースとしてJungleを導入する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
226
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
227 今回作ったゲームはMinecraftの簡易版である。
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
228
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
229 <div style="text-align: center;">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
230  <img src="./images/craft.png" alt="message" width="400">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
231 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
232
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
233 プレイヤーは自由にマップを移動し、ステージの破壊や、生成を行うことができる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
234
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
235 破壊や生成のオペレーションに合わせてJungleのノードにも同期する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
236
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
237
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
238 # ゲームデータの種類
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
239
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
240 ゲームのデータにはいくつかの種類が考えられる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
241
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
242 ## オブジェクトが単体で持つデータ
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
243
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
244 シーン内に存在するオブジェクトが持つパラメータ。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
245
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
246 例えば、プレイヤーのHPや経験値、位置座標などを示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
247
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
248 ## オブジェクト1つで複数持つデータ
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
249
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
250 プレイヤーが持つアイテムデータなどを示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
251
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
252 ## マスタデータ(ReadOnly)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
253
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
254 アイテムの名前や敵の出現確率などを示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
255
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
256 ゲーム開発者のみが更新できる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
257
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
258 # データのデータ設計
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
259
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
260 Jungleには複数の木を持つことができる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
261
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
262 ゲームのシーンを構成するGameTreeとアイテムを管理するItemTreeをJungle内に作る。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
263
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
264 # GameTree
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
265
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
266 GameTreeではシーン内にあるPlayerやStageを構成するCubeなどを格納している。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
267 Jungleではオブジェクトが単体で持つデータと、オブジェクト一つで複数持つデータを同時に表現できる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
268 以下にその例を示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
269
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
270 <div style="text-align: center;">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
271  <img src="./images/Tree.pdf" alt="message" width="600">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
272 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
273
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
274 # ItemTree
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
275
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
276 ItemTreeではItemデータを格納している。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
277 データの種類ではマスターデータにあたいする。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
278 以下にその例を示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
279
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
280 <div style="text-align: center;">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
281  <img src="./images/ItemTree.pdf" alt="message" width="800">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
282 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
283
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
284 # Jungleの改良
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
285
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
286 前章では例題となるゲームを作成した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
287 その上でJungleではデータ型について問題となった。
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
288
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
289 C\#の再実装を行った際にJavaのJungleに沿ってデータの型、つまりByteArrayで設計を行っていた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
290
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
291 データの格納を行うたびにByte Arrayへのキャストを行う必要がある。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
292 しかし、キャストの処理は軽くはない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
293
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
294 そこで、シーンを構成するObjectをそのまま格納するに仕様を変更した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
295 C\#ではObjectクラスのエイリアスとしてobject型が使える。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
296
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
297 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
298
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
299 Player player = new Player ();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
300 either = either.bind ((JungleTreeEditor arg) => {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
301 return arg.putAttribute ("Player", player);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
302 });
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
303
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
304 Enemy enemy = new Enemy ();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
305 either = either.bind ((JungleTreeEditor arg) => {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
306 return arg.putAttribute ("Enemy", enemy);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
307 });
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
308
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
309 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
310
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
311 # データを取り出す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
312
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
313 データを取り出すにはGenericで型を指定する、もしくはas演算子を用いてキャストを行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
314 以下に取り出す例を記述する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
315
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
316 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
317 Player player = attr.get<Player> ("Player");
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
318 Enemy enemy = attr.get ("Enemy") as Enemy;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
319 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
320
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
321 データの型の再設計を行ったことによりシーン内のオブジェクトをそのまま格納が可能になった。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
322 格納の際にByte Arrayに変換する必要がない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
323
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
324 分散構造や、ネットワークで必要な時だけ変換する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
325
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
326 # まとめ
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
327
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
328 本研究の流れは
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
329
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
330 - Jungle-Sharpの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
331 - UnityでのApplicationの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
332 - 問題点の改良
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
333
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
334 である。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
335
12
10a1f30eb748 Update English abstruct.
Kazuma Takeda
parents: 10
diff changeset
336 Jungle-Sharpの実装ではJavaと比較的似ている言語であるため、移行する方法を確立した。
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
337 C\#版のJungleではJavaに劣らない、もしくはそれ以上のパフォーマンスを出すことが出来た。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
338
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
339 実際のゲームに合わせたJungleの拡張を行った。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
340
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
341 データの格納の際にByteBufferであったものをObject型に変更した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
342 これにより、シーンを構成するObjectデータを手間なく格納することを可能にした。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
343
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
344 Jungleは非破壊であるため、過去の変更を持っている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
345
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
346 ゲームにおいて過去の木を持ち続けることはパフォーマンスの低下につながる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
347 そのため、過去の木をどこまで必要かを検討しなければならない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
348
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
349 現在C\#版のJungleにはデータを永続化させる仕組みは備わっていない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
350 実用的なゲームのデータベースとして使うためには永続化を実装する必要がある。