勉強会のレポート(メモ)です。
参加したのはこちら、「Unity ECS完全に理解した」
動画はこちらになります。
- 0. タイムスケジュール
- 1. ECS初学者向けTips集
- 2. ECSで爆速TrailRender
- 3. Hybrid ECSで高速Transform更新
- 3. LT1: PureECSで作ったサンプルを更新した話
- 5. LT2: LTでわかる!アセンブラ
- 6. LT3: Memory Management of C# with Unity Native Collections
- タイムライン
- 感想
0. タイムスケジュール
内容 | 担当 | |
---|---|---|
19:00 | 受付開始 | |
19:30 | イントロダクション | |
19:40 | ECS Tips集(仮) | @mao |
20:00 | ECSで作る爆速TrailRenderer | @notargs |
20:20 | 休憩 | - |
20:30 | Hybrid ECSで高速Transform更新 | @Es_Program |
20:50 | LT1: PureECSで作ったサンプルを更新した話 | @kakunpc |
21:00 | LT2: LTで分かる!アセンブラ(仮) | @tnayuki |
21:10 | LT3: Memory Management of C# with Unity Native Collections | @neuecc |
21:20 | 懇親会準備 | |
21:25 | 懇親会 | |
22:15 | 片付け |
1. ECS初学者向けTips集
スライド
プレゼンテーションで開かないとレイアウト崩れたりしますが…一先ずは登壇資料を公開しました🙇♀️#ECS完全に理解した
— mao (@TEST_H_) October 22, 2018
ECS初学者に向けてのTips集https://t.co/zEFvryu2Xd
リンクが多めです、スライドを見てください。
話す内容:さわり始めの方に、Tipsを共有
注意点:今回はPureECSを前提とした内容です
公式や公開プロジェクトのサンプルを動かす時の注意点
・動かすのなら、UnityとECSのパッケージを合わせておいたほうがよい
・ECSはPreviewのために破壊的変更が多い
用語
・World
ComponentSystemの所属先。
現状だとDefaultWorldというのが自動生成される。
自分で作ることもできる。
・Component System
Entityがもつ、ComponentDataを見て、
必要なものがそろっていたら処理を行う部分。
(TransformSystem(pos/rotation/scale)のどれかをもっていたら処理など)
・Component Data
PositionやRotationなど、MonoBehaviourのフィールドに相当。
・Entity
実体、GameObjectに相当する。
EntityはEntityであり、何かを継承して作るわけではない。
どうやって描画する?
デフォルトで用意されています。
MeshInstanceRenderSystem
・頂点シェーダーで単純なアニメの再生なら対応可能
・改造、自作で高速化も
アニメーションはどうする?
用意されていない。自作する必要があります。
なので作ってみました。githubで公開されています
仕組み
頂点シェーダーで動かしています。
衝突判定は?
ないです。自作する必要がある。
近々公式ででるらしい。
仕組み
総当たりです。弾とか総当たりで見て何かします。
ColliderをComponentDataで実装。
Entityの取得
識別用の空のComponentDataをEntityに組み込むことで識別可能。
その他、Tips
は資料を見てください。
2. ECSで爆速TrailRender
スライド
【Unity】ECS完全に理解した勉強会に登壇しました! - notargs’s blog https://t.co/m2uyUnoHEX
— のたぐすECSキャット@cluster (@notargs) October 22, 2018
本日の公演資料を公開しました!#ECS完全に理解した
ソースコードはスライドを参照してください。
対象者:
難易度辛口
ECSを使ったことある人、さらに最適化について知りたい人
お品書き
1.パーティクルを作る
2.Trailを作る
3.Trailを高速化
ECSとはGameObjectのすごい奴です
1. パーティクルを作る
ECSで作るメリット
・生成破棄のコストが少ない
・C#で制御できるので融通がきく
2. TrailRender
どう実装する
・通った位置を全て保存
・古いものは削除
・BufferArrayで配列を持たる
Graphics.DrawMeshメソッドで描画する
3. さらに最適化
GPUへ送る情報を減らす
・CpmputeBuffer
GPUで配列を扱うためのフォーマット
・Segment,TrailElementの数を数える
配列のサイズがたりなければ再確保する
・NativeArray.GetUnsafePtr
・UnsefeUnitily.MemCpy
配列の中身をコピするがめちゃくちゃ早い
NativeArrayへ値を転写
あかんもうついていけへん
3. Hybrid ECSで高速Transform更新
スライド
先程の講演資料ですー#ECS完全に理解したhttps://t.co/60QP7liWpM
— Es (@Es_Program) October 22, 2018
図解が豊富です。スライドを参照してください。
難易度は甘口です。
Hybrid?
我々はGameObjectにMonoBehaviourに慣れすぎている。
とっつきやすさはあります。
パフォーマスはどうなの?
簡単なうえに結構効果あり、20倍早くなりました。
ざっくり概要 PureとHybridって何?
pure
・普通のECS
・GameObjectやComponentに協調しない
Hybrid
・協調します。
・1GameObject -> 1Entity
・従来の開発スタイル+ECS恩恵
HybridはEntity生成先がGameObjectになっただけで変わらない
Entityの生成はGameObjectEntityをくっつけるだけ、コードを書く必要はなし。
内部的にもPureと変わらない。
回転させる流れ
・Entitiesパッケージを追加
・適当にキューブを作り
・コンポーネントを追加
これでもう動きます
Systemに注目
独自の自動回転システムを間に挟んでやると、回転してからtransformを更新する。
ただコンポーネントを追加して、独自のシステムを作ってあげるだけでOK。
注意点
DefaultWorld 生成時に自動でWorldに登録する処理が走ります。
この時Defaultがない場合、システムが登録されない。
こういうコードかかれるとハイブリッドは死にます
Editorで不可解な挙動
更新がロールバックされたり、選択すると処理が実行されたり(EditoModeで)する。
割とはまりポイントです。
まとめ
Entity生成が簡単なのがハイブリッドのいいとこ。
Transform操作は標準のSystemを使いつつ、独自のSystemをかませるだけ。
3. LT1: PureECSで作ったサンプルを更新した話
スライド
先程の資料を公開しました!
— かーくん (@kakunpc) October 22, 2018
PureECSで作ったサンプルを更新した話 / かーくん さん - ニコナレ https://t.co/agnQW6Lq5u #kn3550 #ecs完全に理解した
サンプルの話。このサンプルはかなり古い。
まずはUnityのアップデート(エラーでまくり
次にECSのバージョンを上げるが、上げたらいろいろエラーでます。
アップデートした結果
・TransformMatirixがいらなくなった
なんにためにあるのかわからんかったもの。
いらなくなったのでコードから消して解決。
・JobHandle.Scheduleの引数が1つ減った
JobSystemの更新でした。
まとめ
・UnityとECSの更新頻度高い
・正式版ではないので本採用はやめよう
・PureECSの前にJobSystemをしっておこうね。
5. LT2: LTでわかる!アセンブラ
きっかけ
Unityお学びグループでこんな質問ありました。
Q : ゴリゴリプログラミングをしたい
それに対して
A : アセンブラを学びましょう
・・・炎上しました
大前さんドン引き
今日する話
Burstが出力したアセンブラを詠むのに最低限必要な話
しない話。CPUの話、ARMの話
アセンブリ言語
オペコード:ソース:ディスティネーションに分かれ、
操作の内容:オペランド(操作対象)で構成される
オペランドの種類
・レジスタ 変数はないのでこれを使います
・メモリアドレス:[ ]で示すとそのレジスタが示すとこから中身をとってくる(Cのポインタ)
・即値 レジスタに数値をいれたいときに指定するもの
オペコードの種類
飛ばします
BurstInspector
クラスを選択して、アセンブリを開くとアセンブラがでます。
Instancedを押すと、
C#のコードのどこがアセンブラになったのかがわかる
アセンブラは怖くないヨ。
Unityお学びグループにきてください。
6. LT3: Memory Management of C# with Unity Native Collections
スライド
本日お話した「Memory Management of C# with Unity Native Collections」資料、公開しました。 https://t.co/zADqDL2rd1 #ECS完全に理解した
— neuecc (@neuecc) October 22, 2018
ECSの話したかったけどできてないのでツイーンエンジンの話。
メモリの話
ECS
C#はVMの上で動いています
prodotnetmemory.com
この本よさそうです。
CLR vs Unity
・Core CLR
低レベルな実行システム
・IL2CPP
Unityインストールするとソースがころがっています。
Windowの場合、projectファイルで起動できます。
ファイル名見てるだけで学べます。
VMが違えばメモリ管理も変わる
基本的なとこは一緒だが、GCなどが違う
AppDomain
基本は1つ作られる。
この上にスレッドができる。おおむね1つ。Unityでも1つ
スタックはメモリに蓄積される。
ヒープは長寿命のデータが入り、GCの管理下に入ります。
メモリの中身を見よう
おすすめ sharplab.io
見るのに便利なサイトです
x86 x64でメモリの扱い、デバック&リリースモードでも挙動がかわります。
ボックス化してうけた結果を表示したりできます。
box化とclassのダンプ結果は同じ。
NativeCollections
ECSはアナーキスト。
C#がVMが管理しているので周囲はどうもできない。
ECSはヒープをつかわない。
値型じゃないと使えない。
Entityはからっぽです。辞書のKeyのようなイメージ。
では実体はどこにある?
時間が足りないので次回にご期待ください。
タイムライン
トレンドに乗りました(定期)
設営だいたい終わりました!お待ちしておりますー! #ECS完全に理解した pic.twitter.com/znPr3n9oiD
— 青木とと\(ˊᗜˋ*)/ (@lycoris102) October 22, 2018
わからなすぎて赤ちゃんになってしまった #ecs完全に理解した
— 避雷 (@lucknknock) October 22, 2018
毎回、このシリーズの勉強会のために予習してくることが、すごく自分のためになってる感 is ある#ECS完全に理解した
— ちぇみゃ (@tyemiya82) October 22, 2018
Hybridから身体をならしていくのがいくのがいいのかな #ECS完全に理解した
— デコシ (@Ash_Yin) October 22, 2018
ECS学んでみるための一歩目にHybridがかなり良さそう #ECS完全に理解した
— カルピスたくみ (@takupisu31) October 22, 2018
#ECS完全に理解した 名雪さんによるアセンブラのお話 pic.twitter.com/DPm47pwaps
— ザバイオーネ@めぐるーま (@z_zabaglione) October 22, 2018
#ECS完全に理解した pic.twitter.com/HBNiB7KTmH
— 野生の男 WILDMAN (@yasei_no_otoko) October 22, 2018
今日はアセンブリを学ぶ会だったのかもしれない。気づいたら迷い混んでいたようだ。#ECS完全に理解した
— へりえる (@herie270714) October 22, 2018
本日の🍣はネタ毎に来ちゃったためビュッフェスタイルを予定しております #ECS完全に理解した pic.twitter.com/H0suvBF8zd
— 青木とと\(ˊᗜˋ*)/ (@lycoris102) October 22, 2018
完全撤収しました!本日は受付とか裏方のお手伝いをさせていただきました。登壇された皆さん、mixiのスタッフの皆さん、参加者の皆さん、遅くまでお疲れ様でしたー! #ECS完全に理解した pic.twitter.com/KnR2VmeLmF
— 青木とと\(ˊᗜˋ*)/ (@lycoris102) October 22, 2018
感想
完全に理解したシリーズの中でも過去最高の難易度ではなかろうか。
会場にいた人でも後でスライド見直さないと完全に理解できないかも。
ECSはまだプレビュー版ということもありこれから大分かわる可能性もあるそうです。
なので今は概要だけ理解して、本実装されてから学びなおしてもいいかも。