annotate presen/slide.md @ 12:10a1f30eb748

Update English abstruct.
author Kazuma Takeda
date Wed, 15 Feb 2017 09:28:06 +0900
parents 207fa0b0c3a2
children 7b39f43e4088
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
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
70 # JungleのAPI
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
71
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
72 前章ではJungleの概要を記述した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
73 本章ではJungleの主なAPIについて紹介する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
74
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
75
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
76 # Jungleの木
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
77
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
78 Jungleは複数の木を名前を利用して管理しており、名前により作成・編集を行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
79
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
80 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
81 // Jungleに新しく木を生成する。木の名前が重複した場合、生成に失敗しnullを返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
82 JungleTree createNewTree(string treeName)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
83
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
84 // JungleからtreeNameと名前が一致するtreeを取得する。名前が一致するTreeがない場合取得は失敗しnullを返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
85 JungleTree getTreeByName(string treeName)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
86
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
87 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
88
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
89 以下のコードは、Jungleの木を"TreeName"で生成し取得する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
90
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
91 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
92 JungleTree tree = jungle.createNewTree("GameTree");
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
93 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
94
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
95 # TreeNode
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
96
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
97 Jungleが保持している木は、複数のノードの集合で出来ている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
98 ノードは、自身の子のListと属性名と属性値の組でデータを持つ。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
99 ノードに対するアクセスは、TreeNodeクラスに記述されているAPIを用いて行われる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
100
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
101 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
102 // ノードの子供を扱うChildrenオブジェクトを返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
103 Children getChildren()
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
104
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
105 // ノードが保持しているデータを扱うAttribteオブジェクトを返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
106 Attribute getAttribute()
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
107 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
108
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
109 # ChildrenとAttribute
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
110
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
111 Childrenクラスを利用し、ノードの子どもにアクセスする。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
112
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
113 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
114 // ノードが持っている子どもの個数を返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
115 int size()
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
116
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
117 // ノードが持つ子どもの中から、 変数numで指定された位置にある子ノードを返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
118 Either<Error, TreeNode> at(int num)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
119 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
120
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
121 Attributeクラスを利用し、ノードの保持する値にアクセスする。
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
122
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
123 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
124 // ノードからKeyで管理されるValueをobject型で返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
125 object get(string key)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
126
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
127 // ノードからKeyで管理されるValueをstring型で返す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
128 string getString(string key)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
129 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
130
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
131 # Eitherクラス
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
132
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
133 Jungleでは例外がある場合、Eitherクラスを用いて行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
134
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
135 - 失敗時はA
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
136 - 成功時はB
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
137
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
138 を包んで返す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
139 失敗した場合ははじめからやり直す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
140 以下に例を記述する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
141
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
142 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
143 Either<Error,TreeNode> either = children.at(2);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
144 if (either.isA())
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
145 return either.a();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
146 TreeNode child = either.b();
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 # Jungleのサンプルコード
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
151
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
152 Jungleの例を記載する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
153
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
154 以下のコードは、ルートノードの2番目の子どもから、属性名"name"とペアになっている属性値を取得する。
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 JungleTree tree = jungle.getTreeByName("GameTree");
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
158 TreeNode root = tree.getRootNode();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
159 Children children = root.getChildren();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
160 Either<Error,TreeNode> either = children.at(2);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
161 if (either.isA())
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
162 return either.a();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
163 TreeNode child = either.b();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
164 Attribute attribute = child.getAttribute();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
165 string value = attribute.getstring("name");
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 # Jungleの木の編集
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
170
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
171 Jungleの木の編集はJungleTreeEditorクラスを用いて行われる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
172
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
173 JungleTreeEditorクラスには編集を行うために、定義されているAPIを記述する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
174
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
175 また、ノードを指定して編集を行う際にNodePathクラスを用いる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
176
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
177 # NodePath
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
178
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
179 Jungleでは、木のノードの位置をNodePathクラスを使って表す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
180
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
181 NodePathクラスはルートノードからスタートし、対象のノードまでの経路を、数字を用いて指し示すことで対象のノードの場所を表す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
182
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
183 また、ルートノードは例外として-1と表記される。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
184
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
185 <div style="text-align: center;">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
186  <img src="./images/NodePath.pdf" alt="message" width="400">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
187 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
188
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
189 # ノードの追加
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
190
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
191 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
192 // 変数pathで指定した場所にある、ノードの子供の変数posで指定した位置子ノードを追加
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
193 Either<Error, JungleTreeEditor> addNewChildAt( NodePath path, int pos)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
194 // 変数pathで指定した場所にあるノードに、属性名 変数key 属性値 変数valueのペアで値を挿入
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
195 Either<Error, JungleTreeEditor> putAttribute( NodePath path, string key, object value)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
196
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
197 // 変数pathで指定した場所にあるノードが持つ、属性名 変数keyとペアで保存されているデータを削除
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
198 Either< Error, JungleTreeEditor> deleteAttribute( NodePath path, string key)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
199
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
200 ```
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 編集の最後にTreeに対してコミットを行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
205
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
206 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
207 // 木へ行った変更をコミット。自分が編集を行っていた間に、他のJungleTreeEditorクラスによって木が更新されていた場合、コミットは失敗
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
208 Either<Error, JungleTreeEditor> commit()
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
209 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
210
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
211 # ゲームのデータ構造
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
212
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
213 Jungleはもともと認証管理システムやWeb向けに作られたものである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
214 これらはすべて木構造をベースとしている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
215
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
216 ゲームでも同じことが考えられる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
217 そこでゲームエンジンUnity向けにJungleの再実装を行い、ゲーム向けのデータベースとしての提案を行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
218
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
219 Unityは3Dゲームエンジンで、ゲームを構成する要素(Object)をC\#で制御する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
220 Objectは一つのゲームのシーン(一画面の状況)の中で木構造を持つ。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
221 これをシーングラフと言う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
222 シーングラフをそのままJungleに格納するという手法が考えられる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
223
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
224 # Jungle-Sharpの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
225
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
226 JungleはもともとJavaとHaskellで書かれていた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
227 今回はJava版をベースにC\#で再実装する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
228
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
229 エラーをチェックするEitherの部分だけはHaskellの要素を取ってくる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
230
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
231 # Atomic Refarenceの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
232
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
233 Jungleの木の変更(commit)はCAS(Check and Set)を用いてatomicに行われる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
234 競合している書き込み中に自分の書き込みが成功した場合に関数commit()が成功する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
235 失敗した場合ははじめからもう一度行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
236
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
237 JavaのモジュールにはAtomicRefarenceが存在した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
238 C\#では自分で作る必要があった。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
239
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
240 ``` C\#
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
241
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
242 // C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
243 public bool CompareAndSet(T newValue, T prevValue) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
244 T oldValue = value;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
245 return (oldValue
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
246 != Interlocked.CompareExchange
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
247 (ref value, newValue, prevValue));
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
248 }
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 # Listの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
253
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
254 木やリストをたどる時にJavaではIteratorを用いる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
255 Iteratorは次の値があるかを返すboolean hasNext()と、Tという型の次の値を取ってくるT next()を持つObjectである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
256 C\#では木やリストを辿りながらyeildで次の値を返す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
257 Javaでは以下のように実装されている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
258
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
259 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
260
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
261 public Iterator<T> iterator() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
262 return new Iterator<T>() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
263 Node<T> currentNode = head.getNext();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
264
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
265 @Override
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
266 public boolean hasNext() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
267 return currentNode.getAttribute()
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
268 != null;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
269 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
270
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
271 @Override
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
272 public T next() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
273 T attribute
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
274 = currentNode.getAttribute();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
275 currentNode
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
276 = currentNode.getNext();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
277 return attribute;
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 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
281
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
282 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
283
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
284 # Listの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
285
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
286 C\#ではそもそも匿名クラスの中でメソッドを定義できない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
287 この場合はIEnuratorを使って書き直すことができた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
288
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
289 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
290
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
291 // C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
292 public IEnumerator<T> iterator() {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
293 Node<T> currentNode = head.getNext();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
294 while (currentNode.getAttribute() != null) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
295 yield return (T)currentNode.getAttribute();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
296 currentNode = currentNode.getNext ();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
297 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
298 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
299
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
300 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
301
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
302 # Eitherのチェック
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
303
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
304 Haskellでは例外処理はモナド内部で行う設計になっている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
305 Eitherもその一つである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
306
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
307 Jungleではある処理に対してエラーであればA、
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
308 なければBをEitherに包んで返す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
309
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
310 JavaのJungleでは分岐を使ってチェックする必要があった。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
311
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
312 ``` Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
313
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
314 // Java
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
315 Either<Error,TreeNode> either = children.at(2);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
316 if (either.isA())
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
317 return either.a();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
318 TreeNode child = either.b();
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 # bindの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
323
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
324 Eitherクラスに実装したbindは自身のEitherをチェックした後、
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
325 エラーがなければ関数fを実行し評価する仕組みである。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
326
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
327 ```C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
328
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
329 public Either<A, B> bind (System.Func<B, Either<A, B>> f) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
330 if (this.isA ()) {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
331 return this;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
332 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
333 return f (this.b ());
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
334 }
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
335
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
336 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
337
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
338 ユーザー側でのエラーのチェックは不要になるが、関数fのLambda式を自分で定義する必要がある。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
339 次のページにその例を示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
340
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
341 # bindの引数に渡すラムダ式の例
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
342
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
343 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
344
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
345 Either<Error, JungleTreeEditor> either = DefaultEither<Error, JungleTreeEditor>.newB(editor);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
346 Item apple = new Item("Apple");
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
347
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
348 either = either.bind ((JungleTreeEditor arg) => {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
349 return arg.putAttribute (rootNode, item.name, item);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
350 });
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
351
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
352 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
353
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
354 # 例題のゲーム
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
355
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
356 前章ではJungle-Sharpのどのように実装したかを述べた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
357
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
358 この章では実際にゲームを構築し、そのデータベースとしてJungleを導入する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
359
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
360 今回作ったゲームはMinecraftの簡易版である。
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
361
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
362 <div style="text-align: center;">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
363  <img src="./images/craft.png" alt="message" width="400">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
364 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
365
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
366 プレイヤーは自由にマップを移動し、ステージの破壊や、生成を行うことができる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
367
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
368 破壊や生成のオペレーションに合わせてJungleのノードにも同期する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
369
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
370
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
371 # ゲームデータの種類
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
372
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
373 ゲームのデータにはいくつかの種類が考えられる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
374
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
375 ## オブジェクトが単体で持つデータ
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
376
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
377 シーン内に存在するオブジェクトが持つパラメータ。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
378
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
379 例えば、プレイヤーのHPや経験値、位置座標などを示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
380
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
381 ## オブジェクト1つで複数持つデータ
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
382
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
383 プレイヤーが持つアイテムデータなどを示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
384
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
385 ## マスタデータ(ReadOnly)
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
386
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
387 アイテムの名前や敵の出現確率などを示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
388
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
389 ゲーム開発者のみが更新できる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
390
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
391 # データのデータ設計
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
392
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
393 Jungleには複数の木を持つことができる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
394
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
395 ゲームのシーンを構成するGameTreeとアイテムを管理するItemTreeをJungle内に作る。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
396
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
397 # GameTree
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
398
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
399 GameTreeではシーン内にあるPlayerやStageを構成するCubeなどを格納している。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
400 Jungleではオブジェクトが単体で持つデータと、オブジェクト一つで複数持つデータを同時に表現できる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
401 以下にその例を示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
402
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
403 <div style="text-align: center;">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
404  <img src="./images/Tree.pdf" alt="message" width="600">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
405 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
406
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
407 # ItemTree
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
408
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
409 ItemTreeではItemデータを格納している。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
410 データの種類ではマスターデータにあたいする。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
411 以下にその例を示す。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
412
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
413 <div style="text-align: center;">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
414  <img src="./images/ItemTree.pdf" alt="message" width="800">
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
415 </div>
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
416
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
417 # Jungleの改良
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
418
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
419 前章では例題となるゲームを作成した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
420 その上でJungleではデータ型について問題となった。
0
9d1c71c756ae first commit
Kazuma Takeda
parents:
diff changeset
421
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
422 C\#の再実装を行った際にJavaのJungleに沿ってデータの型、つまりByteArrayで設計を行っていた。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
423
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
424 データの格納を行うたびにByte Arrayへのキャストを行う必要がある。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
425 しかし、キャストの処理は軽くはない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
426
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
427 そこで、シーンを構成するObjectをそのまま格納するに仕様を変更した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
428 C\#ではObjectクラスのエイリアスとしてobject型が使える。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
429
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
430 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
431
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
432 Player player = new Player ();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
433 either = either.bind ((JungleTreeEditor arg) => {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
434 return arg.putAttribute ("Player", player);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
435 });
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
436
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
437 Enemy enemy = new Enemy ();
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
438 either = either.bind ((JungleTreeEditor arg) => {
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
439 return arg.putAttribute ("Enemy", enemy);
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
440 });
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
441
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
442 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
443
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
444 # データを取り出す
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
445
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
446 データを取り出すにはGenericで型を指定する、もしくはas演算子を用いてキャストを行う。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
447 以下に取り出す例を記述する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
448
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
449 ``` C\#
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
450 Player player = attr.get<Player> ("Player");
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
451 Enemy enemy = attr.get ("Enemy") as Enemy;
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
452 ```
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
453
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
454 データの型の再設計を行ったことによりシーン内のオブジェクトをそのまま格納が可能になった。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
455 格納の際にByte Arrayに変換する必要がない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
456
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
457 分散構造や、ネットワークで必要な時だけ変換する。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
458
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
459 # まとめ
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
460
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
461 本研究の流れは
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
462
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
463 - Jungle-Sharpの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
464 - UnityでのApplicationの実装
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
465 - 問題点の改良
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
466
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
467 である。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
468
12
10a1f30eb748 Update English abstruct.
Kazuma Takeda
parents: 10
diff changeset
469 Jungle-Sharpの実装ではJavaと比較的似ている言語であるため、移行する方法を確立した。
10
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
470 C\#版のJungleではJavaに劣らない、もしくはそれ以上のパフォーマンスを出すことが出来た。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
471
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
472 実際のゲームに合わせたJungleの拡張を行った。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
473
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
474 データの格納の際にByteBufferであったものをObject型に変更した。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
475 これにより、シーンを構成するObjectデータを手間なく格納することを可能にした。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
476
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
477 Jungleは非破壊であるため、過去の変更を持っている。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
478
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
479 ゲームにおいて過去の木を持ち続けることはパフォーマンスの低下につながる。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
480 そのため、過去の木をどこまで必要かを検討しなければならない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
481
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
482 現在C\#版のJungleにはデータを永続化させる仕組みは備わっていない。
207fa0b0c3a2 Create Slide.
Kazuma Takeda
parents: 5
diff changeset
483 実用的なゲームのデータベースとして使うためには永続化を実装する必要がある。