Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

勉強会レポ : Unity ECS完全に理解した

 

 

勉強会のレポート(メモ)です。

参加したのはこちら、「Unity ECS完全に理解した」

connpass.com

 

 

動画はこちらになります。

www.youtube.com

 

 

 

 

 

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集

スライド

 リンクが多めです、スライドを見てください。

 

話す内容:さわり始めの方に、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

スライド

 ソースコードはスライドを参照してください。

 

対象者:

難易度辛口
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更新

スライド

図解が豊富です。スライドを参照してください。

 難易度は甘口です。


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で作ったサンプルを更新した話

スライド

 

サンプルの話。このサンプルはかなり古い。

まずは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

スライド

 

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はヒープをつかわない。
値型じゃないと使えない。

ECSはC#VMを避けている。

 

 

Entityはからっぽです。辞書のKeyのようなイメージ。

では実体はどこにある?

時間が足りないので次回にご期待ください。

 

 

 

 

 

タイムライン

#ECS完全に理解した

トレンドに乗りました(定期)

 

 

 

 感想

f:id:Raspberly:20181023021239j:plain

完全に理解したシリーズの中でも過去最高の難易度ではなかろうか。

会場にいた人でも後でスライド見直さないと完全に理解できないかも。

 

 ECSはまだプレビュー版ということもありこれから大分かわる可能性もあるそうです。

なので今は概要だけ理解して、本実装されてから学びなおしてもいいかも。