一、unity原來(lái)的MC的缺陷
MonoBehaviour画拾、Component和GameObject是unity最基礎(chǔ)的單元啥繁。
通過創(chuàng)建GameObject,添加Component青抛,然后再添加MonoBehaviour腳本是Unity的基礎(chǔ)使用方式旗闽。其中MonoBehaviour承載了游戲邏輯和數(shù)據(jù)兩部分功能,Component繼承自MonoBehaviour蜜另,大部分時(shí)候Component的作用就是提供數(shù)據(jù)适室。
問題點(diǎn)
- 1、通過Component組織的數(shù)組是對(duì)CPU cache不夠友好的蚕钦,原因是并沒有把需要多次重復(fù)計(jì)算更新的數(shù)據(jù)組織到一起亭病,使得CPU在做計(jì)算時(shí)可能cache miss,如果游戲邏輯需要大量對(duì)象需要更新數(shù)據(jù)嘶居,可能這部分消耗是非常大的。
- 2、如果游戲中存在大量的GameObject邮屁,上面綁定大量的Component整袁,那么執(zhí)行大量的Update是非常耗時(shí)的,而且這些Update只能運(yùn)行在主線程佑吝,無(wú)法并行坐昙。
- 3、MB不能很好的解決執(zhí)行順序問題芋忿,對(duì)于動(dòng)態(tài)創(chuàng)建的GameObject炸客,MonoBehaviour的更新順序是不確定。
二戈钢、ECS解決了什么問題
1痹仙、將數(shù)據(jù)更有效的組織,提高CPU cache利用率
按照ECS設(shè)計(jì)規(guī)范殉了,會(huì)把數(shù)據(jù)在內(nèi)存中連續(xù)排列开仰,從而在cache預(yù)讀中能夠?qū)⒑罄m(xù)的數(shù)據(jù)一次性讀取進(jìn)來(lái),提高cpu操作的效率薪铜。2众弓、并行化。
眾所周知隔箍,unity是單線程的谓娃,幾乎所有邏輯代碼都跑在主線程上,當(dāng)然有時(shí)也會(huì)將一些和顯示無(wú)關(guān)的邏輯放入多線程中去執(zhí)行蜒滩,比如讀取文件之類的傻粘。CS開放了底層的job system系統(tǒng),在上層提供了c# job system帮掉,它是一套多線程調(diào)度系統(tǒng)弦悉。
三、ECS的缺陷或問題
- 1蟆炊、目前的狀況之下稽莉,CPU計(jì)算可能并不是重點(diǎn)。
絕大部分的unity項(xiàng)目涩搓,首要的性能熱點(diǎn)都不是游戲邏輯本身污秆,而是unity引擎本身的各種坑帶來(lái)的性能消耗。比如mmo類游戲普遍的ui性能問題(ugui主要背鍋)昧甘、GC(遙遙無(wú)期的mono SGEN垃圾回收機(jī)制)良拼、渲染、移動(dòng)(transform update的性能問題)充边、尋路庸推、物理這些計(jì)算密集的大戶常侦,不少項(xiàng)目用的又是Unity內(nèi)部的方案。手游現(xiàn)在普遍為了熱更新而重度使用lua等方案去寫邏輯贬媒,本身就是對(duì)cache不友好的聋亡。 - 2、ECS能很好解決數(shù)據(jù)單一而密集的問題际乘,而很多情況下坡倔,無(wú)法對(duì)數(shù)據(jù)精心設(shè)計(jì)和拆分來(lái)達(dá)到這個(gè)條件。
- 3脖含、ECS實(shí)現(xiàn)多態(tài)罪塔,需要通過為entity裝配不同的component來(lái)實(shí)現(xiàn),在實(shí)現(xiàn)類似很多技能效果這種節(jié)點(diǎn)的時(shí)候养葵,不同邏輯其實(shí)使用的數(shù)據(jù)往往不相同征堪,這樣做本身就會(huì)對(duì)Cache不友好。
[cache知識(shí)]
https://www.zhihu.com/search?type=content&q=Cache