DOTS
https://gyazo.com/affcdbd2222d270ab389037b3368610a
Unmanaged memoryを使おうとすると必然的に設計されるもの
ゲーム実装を意識:position/rotationは省メモリなので無駄にしても許されるだろう
64bit CPU時代の設計
32bit CPUの時代index/versionに16bitしか使えない時代だとこの設計は無理
かなりちゃんとしたテストが作れる
https://youtu.be/ydHbtssCrMw
ECSはまだプレビュー。使いやすくなってから使えばいい 仕事で使うのは待つのが賢明
使う段階になったらこれを聞いてほしい
面白い
前半 おもろい メモリの戦い
これがわかればDOTSはかなり攻略できる
ユーザのPCでUnity登場時2005年よりRAMは増えている
1GBぐらいは当たり前になってる
メモリはアドレスを保持するので複雑
2つに参照されたアドレスがあり、1つがいらなくなったので解放する。でももう一つが使ってる。はい死んだ!
C#はリソースをGCが解放する
Managed Memory
解放を呼ばせない
開発者はGCを嫌うが、ないと事故が起きる
他のやり方あるんじゃねぇの?
NativeContainer
Unmanagedメモリを保持する仕組み
プログラマーがdisposeを呼ぶ
GCの仕事をプログラマがやらないといけなくなる
事故が起きるのでは?
いいえ。NativeContainerの生存期間はアルゴリズムできまる
ゲームの弾がいつ消滅するかはわからないが、アルゴリズムならタイミングが分かる
https://youtu.be/ydHbtssCrMw?t=572
ん?ゲームだとそれはわからないこともあるのでは?基素.icon
プレイヤーが操作できたらわかんない
「呼び忘れがあったらきづける」「実行前にわかる」「実効したらエラーをだしてくれる」
なぜ?
ネイティブコンテナの実装はstructのポインタを渡す
モチベーション
https://gyazo.com/f8531e638219ed2e6a9fc7b27172f16a
チャンク
ある物体がn個のコンポーネントで計算されているとする
この物体専用の領域K(DOTSでは16KiB)にm個入れてみる(n=3, m=4)
https://gyazo.com/20be9b91f930bafbeb15e05ac117f326
実際のメモリイメージは並び替えてこう
https://gyazo.com/5477bafe66028f30b9e6d830568205df
あまりの部分は許容する
違う物体も考えてみる(n=4, m=2)
https://gyazo.com/eba1423f77dd7452c9d3d444824027ce
https://gyazo.com/1e1d72522a80f944d84defc39fd49400
物体のことをアーキタイプという
削除するときは上書きする
https://gyazo.com/b702cd2e58bf499f60cce347805544cc
削除で順序は動くのでメモリマネージャを通してアクセスする必要がある
マネージャはどこに持っているか管理している
このようなデータをどう処理するか?
Systemを記述する
3つ
処理対象チャンク
例:BとDをもつチャンク
入出力は?
例:Bを入力、Dを出力
処理
例:B→処理→D
https://gyazo.com/0fc868f31285a445e93d4edd273dd5ad
右上のプログラムでBDをつかっているので実際に使われるチャンクはBD, ABCDの2つ
チャンク自体の順序は一定なので、チャンクごとに並列実行できる
https://gyazo.com/3efc683b1387702e56f29a93bcf17685
入出力決まってるので実際にはこうなる
https://gyazo.com/d4bc00053b1b0030fbf428ba3024469c
このようなSystemをたくさん定義してつなげていく
https://gyazo.com/cb28438dedbe0a623cff7d6476824cde
左のif文はレアケースでバグる(100万人プレイしたら300人バグった!)
Systemもifは中でかけるが、入出力が確定しているのでSystemごとのテストが楽!
関数やクラスを小さく切り出すのと違うの?基素.icon
ところで、「他のオブジェクトを追いかけたりする」には参照が必要では?
https://gyazo.com/cef8938df2c1f301553973c357a6521d
Entytyがその情報を持ってる。ただし参照ではない
https://gyazo.com/6692161338506ac9313912f931ea51e6
5のオブジェクトにアクセスしたいならテーブルの5番目にアクセスして情報を取得する。これは$ O(1)でlookupできる
参照された状態で削除されたら違うオブジェクトになるじゃん!
実は読み込み時にはバージョンを指定している。削除のときにはEntityの中のバージョンを更新することで解決する
https://gyazo.com/e5bcdb676d76df3bc3da27a53003d8f4
Entityは64bit
5を削除時にはバージョン2になる。5のバージョン1はもうないのでマネージャは要求に対してもうないと返す
Unity C#で物理シミュレーションを実装する
deterministic
入力が同じなら出力は同じという性質
マルチスレッドで並列で動かしても結果が同じ
シングルスレッドなら昔からできていたらしい
statelessでstateは入力のみなので実現できる
シミュレーションループ独立
高速
https://gyazo.com/adf232e6622b61a28b1b0aa8ffc2c7f0
メモリに乗りづらくしても(チャンク分離)今より早い
https://gyazo.com/2421c5d6ff26a222161fdfaf3c96501d
ポリモーフィズムとかいらない
データ志向だとsystemの名前に意味がないような気がしてきた
input / outputの型だけ意識する
現時点(0.2.4)では気配りが全然足りないので使いづらい
ハマり4つ
https://gyazo.com/0a1b2d47d710957d638acbb72c80c51c
https://gyazo.com/69d6b7d87dcf0cf7cc7f6b53ab39a55c
実装は全部オープンなので見られる
https://gyazo.com/3d1641d770607d2e5abe7ffc9ff15aaf
https://gyazo.com/0da2c4d9ae1ae9596578e3dd1e11f3f5
コライダーだと転がる
https://youtu.be/Ju4ILgpuVHE
https://gyazo.com/51ead480019e03207b58a8981393f8f7