理解ECS的概念和Unity中的ECS設計

2022-01-31 17:07:01 字數 1219 閱讀 8870

ecs的概念很早就有了,最初的主要目的應該還是為了改善設計。

e-c-s三者都有其意義,e-c是組合優於繼承,主要用以改善oo的繼承耦合過重以及多繼承菱形問題。

oop常見設計裡,每個gameobject有父類,子類繼承來實現不同型別的物件,很容易產生過多\過深的繼承以及多繼承,而這兩者理論上都不好(依賴、冗餘),

繼承更應該用來隔離介面與實現(父類提供介面,子類提供實現,呼叫方只關心父類介面,不關心具體子類實現),而不是用來重用父類的**。

e-c裡gameobject是entity,只是個類似容器的抽象概念,entity裡包含的component決定了物件是什麼

component可以給不同的gameobject重用,通過組合多種component而不是繼承來構造不同的物件。

unity一直以來都是component based,可以看成e-c,此外還有很多現代引擎也是e-c(ue、cryengine等).

對同一型別的component,通常會進行相同的操作(比如用render元件進行渲染),乙個直觀的想法就是把這些操作集中在一起,就是system。

乙個理想的設計裡,包含多種不同的system,每個system只處理乙個型別的component,每幀對所有compoent例項進行相同的操作,繼而可以做到資料和邏輯分離,component裡放純資料,邏輯在system裡。

邏輯集中在system裡,職責單一,讀\改\控制(初始化、順序依賴等等)都方便。

容易擴充套件,很容易新增e\c\s. 新增任何entity,這些entity上有各種component,這些component可以(自動)共享現有的system,不需要單獨寫。

靈活,e-c-s之間,s-s之間,e-e之間,c-c之間耦合較鬆,便於讀\改\擴充套件。理想情況下不同的system之間,不同的compoent之間沒有任何依賴,但通常很難做到。

cache friendly, system會連續對同一類component進行操作,保證了時間上的區域性性(連續性),如果這些component能保證空間上的區域性性(記憶體布局連續),則顯而易見對快取是很友好的。

simd, 如果能保證同乙個system對大量compoent例項的操作順序無關,那麼很自然的可以併發。 但實際中,component很難完全獨立,經常需要和其它component進行互動,也就是system很難做到只負責一類component,通常需要和多種component(甚至其它系統)進行互動,互動的開銷,遍歷compoent的開銷都需要考慮。

摘自:a(704757217)

Unity中Layer的概念

unity裡面每個gameobject都可以設只layer 1個int值 layer有什麼用呢?一方面相機中可以設定是否渲染某layer 另一方面可以再raycast中設定是否忽略檢測某layer。static function raycast origin vector3 direction ve...

Vue Vuex中,state的概念理解

一 vuex是什麼,官網的說法是,vuex是乙個專為vue.js應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可 的方式發生變化。二 vuex的五大核心概念之一state state,儲存資料和狀態。那麼就可以很清晰的了解到state其實就是全域性...

理解子網和CIDR的概念

1,ip位址分為5類,a,b,c,d,e,它們的字首分別是 答 0網路個數2 7,主機個數2 24,大概1千6百萬 b 10網路個數2 14,大概1萬6千,主機個數2 16,大概6萬5千 c 110網路個數2 21,大概2百萬,主機個數2 8,254個 d 1110用於多播編址 e 1111留作未來...