[Unity]ECS 學習筆記(一) 概念說明 + 實作測試
身為一個在自學C#與Unity作遊戲的企畫,沒有順便學一下最新的ECS,理解一下一般物件導向與資料導向編程的差異的話,好像就弱掉了,這邊就順便邊學,邊記錄一下自己的學習心得。
ECS 與一般物件導向最大的不同就是她把一般我們寫的 Code 的資料結構,改變為資料層與行為層。
一般我們開發遊戲時,要控制一個物件,會先創一個GameObject
然後在它上面加入各個MonoBehaviors腳本以實現控制。
旋轉物件的腳本如 :
public float Speed = 45f;
void FixedUpdate()
{
transform.Rotate(0f, Speed * Time.deltaTime, 0f);
}
在ECS我們則可以把這個Code區分為資料層與系統層來達到分批管理集中運算的目的進而加快整個運算
//資料層(Data)
public float Speed;
//行為層(Behavior)
void FixedUpdate()
{
transform.Rotate(0f, Speed * Time.deltaTime, 0f);
}
目前的ECS分成兩種
純ECS與Hybrid ECS
純ECS 就是把上述的寫法發揮到極致,連GameObject跟 MonoBehaviors 都不用了。
Hybrid ECS 則是Unity這邊創出來可以與舊系統混用的寫法,雖然無法完整的發揮ECS的極限,不過對於就專案或初學來說可能是一個比較簡單的開始。
同時我們也可以繼續延用 MonoBehaviors來分類資料。
在一般寫法我們會在物件中都存放 Data 與 Behavior。
但在Hybride ECS中,我們則在各物件只存放Data資料,Behavior則會進行集中管理運算。
如:讓系統統一管理Rotation 或 各種資料的運算等。
所以上面的Code我們可以改寫為
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities; //啟用ESC時要用這個nameSpace
public class Rotator : MonoBehaviour
{
//資料層(Data)
public float Speed;
}
//將Rotate分拆出來並創建一個 ECS ComponentSystem 的Class RotatorSystem
class RotatorSystem : ComponentSystem
{
//Behaviors
}
我們在場景中的物件都會散布著各類的資料
但假使我們控制我們的選轉的話,我們會需要
Rotator + Transform的資料
所以我們可以在我們的 RotatorSystem創建一個建構子(Struct)來涵蓋這兩個資料
class RotatorSystem : ComponentSystem
{
struct Components
{
public Rotator rotator;
public Transform transform;
}
}
之後我們可以利用
GetEntities來取得所有場上有註冊為Entity的GameObject物件()
只要簡單的對我們要控制的物件加入 Game Object Entity腳本
就可以在Entity監控視窗裡看到這物件被加入Entities裡了
最後則是在 RotatorSystem 裡實作 Rotate的運算
public class Rotator : MonoBehaviour
{
//資料層(Data)
public float Speed;
}
class RotatorSystem : ComponentSystem
{
struct Components
{
public Rotator rotator;
public Transform transform;
}
protected override void OnUpdate()
{
foreach (var _Entities in GetEntities()) //取得場上的Entities Components 資料
{
//於 _Entities.transform.Rotate 使用 資料層的 _Entities.rotator.Speed 來進行資料運算
_Entities.transform.Rotate(0f, _Entities.rotator.Speed * Time.deltaTime, 0f);
}
}
}
回到場景上,我們可以在Cube加入Rotator腳本後多創幾個不同的Cube試試看
看起來還行,在沒優化的狀況下跑 16384個物件,FPS可以到10左右
不使用ECS的狀況下,在沒優化的狀況下跑 16384個物件,FPS大概只有3左右。
果然是快了許多呢,大至的觀念就是這樣,後面則可以開始實作ECS了。
留言
張貼留言