Unity Entity Component System 理論知識(shí)總結(jié)

今天跟同學(xué)們分享一下我找到的關(guān)于ECS相關(guān)的理論知識(shí)文章,可能比較枯燥,如果想看實(shí)操的請(qǐng)看我下方寫(xiě)的一些案例解析。



有說(shuō)的不正確或者不準(zhǔn)確的地方歡迎留言指正


如果你有感覺(jué)不錯(cuò)的相關(guān)文章也可以留言推送給我走贪,不勝感謝~

有什么有趣的寫(xiě)作技巧或者想法歡迎大家給我留言浪讳,大家的幫助是我寫(xiě)下去最有效的動(dòng)力


參考資料 【有時(shí)間強(qiá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ā)布闯睹。


> 個(gè)人觀點(diǎn)的補(bǔ)充,看過(guò)這兩天Unite對(duì)ECS的介紹担神,筆者相信楼吃,現(xiàn)有的unity與oop結(jié)合的這種結(jié)構(gòu),最多存在2個(gè)大版本(2019妄讯、2020),隨著2019年5G從試點(diǎn)到商用孩锡、硬件性能的加速提升、游戲的越來(lái)越重度化捞挥,以ECS這種面向數(shù)據(jù)編程為主導(dǎo)的模式勢(shì)必成為主流浮创,【立帖為證】。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砌函,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讹俊,老刑警劉巖垦沉,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仍劈,居然都是意外死亡厕倍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)贩疙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讹弯,“玉大人,你說(shuō)我怎么就攤上這事这溅∽槊瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵悲靴,是天一觀的道長(zhǎng)臭胜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)癞尚,這世上最難降的妖魔是什么耸三? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮浇揩,結(jié)果婚禮上仪壮,老公的妹妹穿的比我還像新娘。我一直安慰自己胳徽,他們只是感情好睛驳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著膜廊,像睡著了一般乏沸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爪瓜,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天蹬跃,我揣著相機(jī)與錄音,去河邊找鬼铆铆。 笑死蝶缀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薄货。 我是一名探鬼主播翁都,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谅猾!你這毒婦竟也來(lái)了柄慰?” 一聲冷哼從身側(cè)響起鳍悠,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坐搔,沒(méi)想到半個(gè)月后藏研,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡概行,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蠢挡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凳忙。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡业踏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涧卵,到底是詐尸還是另有隱情勤家,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布艺演,位于F島的核電站却紧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胎撤。R本人自食惡果不足惜晓殊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伤提。 院中可真熱鬧巫俺,春花似錦、人聲如沸肿男。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舶沛。三九已至嘹承,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間如庭,已是汗流浹背叹卷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坪它,地道東北人骤竹。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像往毡,于是被迫代替她去往敵國(guó)和親蒙揣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容