今天跟同學(xué)們分享一下我找到的關(guān)于ECS相關(guān)的理論知識(shí)文章,可能比較枯燥,如果想看實(shí)操的請(qǐng)看我下方寫(xiě)的一些案例解析。
- Unity之淺析 Entity Component System (ECS)
- Unity 之 Pure版Entity Component System (ECS) 官方Rotation示例解析
- Unity 之 Pure版Entity Component System【ECS】 案例【GalacticConquest】解析【上】
- Unity 之 Pure版Entity Component System【ECS】 案例【GalacticConquest】解析【下】
有說(shuō)的不正確或者不準(zhǔn)確的地方歡迎留言指正
如果你有感覺(jué)不錯(cuò)的相關(guān)文章也可以留言推送給我走贪,不勝感謝~
有什么有趣的寫(xiě)作技巧或者想法歡迎大家給我留言浪讳,大家的幫助是我寫(xiě)下去最有效的動(dòng)力
參考資料 【有時(shí)間強(qiáng)力建議看一下】缰盏。。淹遵。口猜。。
- 詳解實(shí)體組件系統(tǒng)ECS
- 深入解讀Job System(1)
- 深入解讀Job System(2)
- 使用Unity ECS開(kāi)發(fā)《我的世界》
- WIKI----Entity–component–system
- WIKI----面向數(shù)據(jù)的設(shè)計(jì)
- SIMD----單指令流多數(shù)據(jù)流
- 為實(shí)現(xiàn)極限性能的面向數(shù)據(jù)編程范式
- 面向數(shù)據(jù)的設(shè)計(jì)----Noel(漢化版)
- 面向數(shù)據(jù)的設(shè)計(jì)----Noel(原文需要科學(xué)上網(wǎng))
- 游戲設(shè)計(jì)模式——面向數(shù)據(jù)編程思想
- 2018/11/03更新 Job System介紹
- 2018/11/03更新 ECS 真的是「未來(lái)主流」的架構(gòu)嗎透揣?
- 2018/12/01更新 ECS 與面向數(shù)據(jù)的設(shè)計(jì)
- 2018/12/13更新 Unity* 實(shí)體組件系統(tǒng) (ECS)济炎、C# 作業(yè)系統(tǒng)和突發(fā)編譯器入門(mén)
- 2019/04/12更新 使用Unity的ECS和Job System實(shí)現(xiàn)流體模擬效果
- 2019/04/12更新 面向數(shù)據(jù)技術(shù)棧DOTS的C++和C#
- 2019/04/12更新 面向數(shù)據(jù)技術(shù)棧DOTS之ECS實(shí)體組件系統(tǒng)
下面是筆者看完這些參考文章后對(duì)ECS的理解或引用其中文章的部分解釋
一:在Unity中筆者對(duì)ECS的理解
- Entity:實(shí)體,筆者更喜歡說(shuō)數(shù)據(jù)的小集合辐真,例如transform中的须尚、Position、Roitation侍咱、Scale耐床,這三個(gè)數(shù)據(jù)組成的集合就可以稱為實(shí)體。而且實(shí)體可以自由的組裝拆分楔脯,例如可以拆分為Position與Roitation撩轰、Position與Scale、Roitation與Scale甚至自己編寫(xiě)的數(shù)據(jù)集合。
- Component:組件钧敞。這里提到的組件與傳統(tǒng)組件可不一樣蜡豹,傳統(tǒng)的組件有點(diǎn)Entity+業(yè)務(wù)邏輯的意思,里面包含很多數(shù)據(jù)溉苛,但是在ECS中的Component 只是一條單一的數(shù)據(jù)镜廉,例如Position單一的數(shù)據(jù)是一個(gè)Component,Roitation單一的數(shù)據(jù)也是一個(gè)Component愚战,不包含任何的業(yè)務(wù)邏輯娇唯,有點(diǎn)像傳統(tǒng)類中的字段,僅僅就是一個(gè)數(shù)據(jù)寂玲。
- System:系統(tǒng)塔插,這里的作用就是做行為邏輯操作的地方了,通過(guò)對(duì)Component自由的組裝成Entity拓哟,然后根據(jù)規(guī)則篩選出Entity獲取到對(duì)應(yīng)的對(duì)象想许,之后進(jìn)行邏輯操作。而且在ECS中的System是不分場(chǎng)景的断序,例如有一個(gè)負(fù)責(zé)移動(dòng)的System流纹,他真的是負(fù)責(zé)所有場(chǎng)景中對(duì)應(yīng)的移動(dòng),不像以往僅僅負(fù)責(zé)一個(gè)場(chǎng)景中一個(gè)物體或者子彈單類的移動(dòng)违诗。
二:一個(gè)有關(guān)CPU處理數(shù)據(jù)的概念:CPU多級(jí)緩存
什么是CPU緩存???
- 更詳細(xì)來(lái)說(shuō)漱凝,結(jié)構(gòu)應(yīng)該是:CPU<---->寄存器<---->CPU緩存<---->內(nèi)存
- 可以看到CPU緩存是介于內(nèi)存和寄存器之間的一個(gè)存儲(chǔ)區(qū)域,此外它存儲(chǔ)空間比內(nèi)存小诸迟,比寄存器大茸炒。
為什么需要CPU多級(jí)緩存:
- CPU的運(yùn)行頻率太快了,而CPU訪問(wèn)內(nèi)存的速度很慢阵苇,這樣在處理器時(shí)鐘周期內(nèi)壁公,CPU常常需要等待寄存器讀取內(nèi)存,浪費(fèi)時(shí)間慎玖。
- 而CPU訪問(wèn)CPU緩存則速度快很多贮尖。為了緩解CPU和內(nèi)存之間速度的不匹配問(wèn)題笛粘,CPU緩存則預(yù)先存儲(chǔ)好潛在可能會(huì)訪問(wèn)的內(nèi)存數(shù)據(jù)趁怔。
CPU多級(jí)緩存預(yù)先存的是什么:
- 時(shí)間局部性:如果某個(gè)數(shù)據(jù)被訪問(wèn),那么在不久的將來(lái)它很可能再次被訪問(wèn)薪前。
- 空間局部性:如果某個(gè)數(shù)據(jù)被訪問(wèn)润努,那么與它相鄰的數(shù)據(jù)很快也能被訪問(wèn)。
- CPU多級(jí)緩存根據(jù)這兩個(gè)特點(diǎn)示括,一般存儲(chǔ)的是訪問(wèn)過(guò)的數(shù)據(jù)+訪問(wèn)數(shù)據(jù)的相鄰數(shù)據(jù)铺浇。
CPU緩存命中/未命中:
- CPU把待處理的數(shù)據(jù)或已處理的數(shù)據(jù)存入緩存指定的地址中,如果即將要處理的數(shù)據(jù)已經(jīng)存在此地址了垛膝,就叫作CPU緩存命中鳍侣。
- 如果CPU緩存未命中丁稀,就轉(zhuǎn)到內(nèi)存地址訪問(wèn)。
提高CPU緩存命中率
- 要盡可能提高CPU緩存命中率倚聚,就是要盡量讓使用的數(shù)據(jù)連續(xù)在一起线衫。
冷數(shù)據(jù)/熱數(shù)據(jù)分割
有人可能認(rèn)為這樣能最大程度利用CPU緩存:把一個(gè)對(duì)象所有要用的數(shù)據(jù)(包括組件數(shù)據(jù))都塞進(jìn)一個(gè)類里,而沒(méi)有任何用指針或引用的形式間接存儲(chǔ)數(shù)據(jù)惑折。
實(shí)際上這個(gè)想法是錯(cuò)誤的授账,我們不能忽視一個(gè)問(wèn)題:CPU緩存的存儲(chǔ)空間是有限的
于是我們希望CPU緩存存儲(chǔ)的是經(jīng)常使用的數(shù)據(jù),而不是那些少用的數(shù)據(jù)惨驶。這就引入了冷數(shù)據(jù)/熱數(shù)據(jù)分割的概念了白热。
熱數(shù)據(jù):經(jīng)常要操作使用的數(shù)據(jù),我們一般可以直接作為可直接訪問(wèn)的成員變量粗卜。
冷數(shù)據(jù):比較少用的數(shù)據(jù)屋确,我們一般以引用/指針來(lái)間接訪問(wèn)(即存儲(chǔ)的是指針或者引用)。
三:原來(lái)的OOP模式為什么越來(lái)越慢了续扔?
oop模式的主要的思想就是萬(wàn)物皆對(duì)象乍恐,調(diào)用的方式幾乎都是以對(duì)象為基礎(chǔ),以模塊化編程的帶來(lái)優(yōu)勢(shì)的同時(shí)测砂,也有他的負(fù)面效果:冗余數(shù)據(jù)過(guò)多茵烈,包袱過(guò)重。舉個(gè)例子:在旅行時(shí)是一個(gè)人帶一張信用卡去還是帶一堆的生活用品去會(huì)更方便呢砌些?答案當(dāng)然是前者呜投,只需要帶著有用的東西就可以了,無(wú)用的都可以丟掉存璃。oop其實(shí)也是這個(gè)樣子仑荐,在進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候(數(shù)據(jù)讀取)總會(huì)帶著一些無(wú)用的數(shù)據(jù)纵东,不僅僅零零散散(傳統(tǒng)方式的內(nèi)存管理是離散式的)粘招,而且還占用空間(上文提到的CPU多級(jí)緩存),隨著現(xiàn)在游戲的規(guī)模越來(lái)越大偎球,摩爾定律的失效洒扎,單純的提高主頻達(dá)到好的計(jì)算效果變得越來(lái)越力不從心。
四:ECS為什么快衰絮?
傳統(tǒng)方式的內(nèi)存管理是離散式的袍冷,即物體和它的組件(Component)并非在同一個(gè)內(nèi)存區(qū)段,每次存取都非常耗時(shí)猫牡。而ECS會(huì)確保遍歷時(shí)所有的組件資料(Component Data)都緊密的連接再一起胡诗,稱為Archetype,這樣就能確保存取內(nèi)存資料時(shí)以最快的速度存取(也提高命中率)煌恢。
數(shù)據(jù)量身定制化骇陈,不會(huì)有多余的數(shù)據(jù),例如Position原有的Vector3換成了現(xiàn)在Float3瑰抵,列表等換成了unity重新定的Native開(kāi)頭的數(shù)據(jù)結(jié)構(gòu)缩歪,分為并發(fā)和非并發(fā)執(zhí)行。IJob谍憔、IJobParallelFor或 IJobParallelForTransform會(huì)根據(jù)是否單核還是多核分別選擇接口匪蝙,SharedComponentData和ComponentData等等。這種量身定制或數(shù)據(jù)也帶來(lái)了更多的選擇性和靈活性习贫,隨之通用性也就降低逛球。
這種多核心并行計(jì)算也符合現(xiàn)在硬件的發(fā)展趨勢(shì),摩爾定律的失效苫昌,以增加核心數(shù)量帶來(lái)的計(jì)算力不斷的提升是現(xiàn)在主流的現(xiàn)象颤绕。
五:ECS目前能做多好
Unity 特大城市Demo展示
官方相關(guān)地址
根據(jù)官方介紹,此項(xiàng)目包含450萬(wàn)網(wǎng)格渲染祟身,5000輛動(dòng)態(tài)汽車奥务,10萬(wàn)種獨(dú)特的聲音效果,每棟建筑的零件達(dá)到20萬(wàn)個(gè)袜硫,并且還能以60fps的幀率穩(wěn)定運(yùn)行氯葬。另外,視頻的結(jié)尾部分還公開(kāi)了一段手機(jī)平臺(tái)的演示婉陷,官方特別指出這絕不是使用手機(jī)播放了一段視頻帚称,而是真正用Unity生成APP,再在手機(jī)上運(yùn)行的畫(huà)面秽澳。這款demo和所有資源將于2019年發(fā)布闯睹。