ECS的核心概念,關(guān)于ecs使用規(guī)范正確的是ECS的核心概念ECS架構(gòu)的核心是數(shù)據(jù),這也是Unity將這項(xiàng)技術(shù)命名為stack DOTS的原因。系統(tǒng)讀取實(shí)體上方組件的數(shù)據(jù)流并處理數(shù)據(jù)。在這里,實(shí)體實(shí)際上更像一個(gè)索引,它不包含任何數(shù)據(jù)或邏輯。EC由三部分組成:實(shí)體、組件和行為。見下圖:在此圖中,系統(tǒng)讀取多個(gè)實(shí)體的平移和旋......
ECS架構(gòu)的核心是數(shù)據(jù),這也是Unity將這項(xiàng)技術(shù)命名為stack DOTS的原因。系統(tǒng)讀取實(shí)體上方組件的數(shù)據(jù)流并處理數(shù)據(jù)。在這里,實(shí)體實(shí)際上更像一個(gè)索引,它不包含任何數(shù)據(jù)或邏輯。
EC由三部分組成:實(shí)體、組件和行為。見下圖:
在此圖中,系統(tǒng)讀取多個(gè)實(shí)體的平移和旋轉(zhuǎn)組件,然后在計(jì)算和處理后將結(jié)果更新到LocalToWorld組件。
如圖所示,實(shí)體A和B仍然有渲染器組件,但C沒有。但是,這不會(huì)影響系統(tǒng)的計(jì)算邏輯,因?yàn)檫@個(gè)系統(tǒng)不關(guān)心渲染器組件。
也可以寫一個(gè)需要處理渲染器組件的系統(tǒng),讓系統(tǒng)忽略實(shí)體c,也可以寫一個(gè)排除包含渲染器組件的實(shí)體的系統(tǒng),讓系統(tǒng)忽略實(shí)體A和實(shí)體b。
以下是ECS中一些重要的核心概念:
原型原型
多個(gè)組件的組合稱為原型。
例如,3D對(duì)象可以包含用于變換的組件,包括移動(dòng)、旋轉(zhuǎn)和渲染。每個(gè)3D對(duì)象對(duì)應(yīng)一個(gè)實(shí)體,但它們都有相同的組件,因此ECS會(huì)將它們歸類為一種原型。
上圖中,實(shí)體A和實(shí)體B的原型都是M,實(shí)體C的原型是n。
您還可以通過在運(yùn)行時(shí)添加或刪除組件來更改實(shí)體的原型。例如,如果實(shí)體B的渲染器組件被移除,則實(shí)體B的原型將變成n。
內(nèi)存塊
為什么先說原型的概念?因?yàn)閷?shí)體的原型是什么決定了ECS將實(shí)體的組件即數(shù)據(jù)存儲(chǔ)在哪里。Ec以塊為單位分配內(nèi)存,每個(gè)塊由一個(gè)原型塊對(duì)象表示。
一個(gè)塊只包含一個(gè)原型,原型可以包含多個(gè)實(shí)體的數(shù)據(jù)。如果一個(gè)塊的內(nèi)存已滿,ECS將分配一個(gè)新的塊來存儲(chǔ)新實(shí)體的組件。
如果修改了實(shí)體的組件,就相當(dāng)于修改了實(shí)體的原型。此時(shí),ECS會(huì)將實(shí)體的組件數(shù)據(jù)移動(dòng)到另一個(gè)塊。
原型和內(nèi)存塊的關(guān)系是一對(duì)多的關(guān)系。這意味著,如果您想要查詢一組給定組件類型的所有實(shí)體,您只需要在這些原型中進(jìn)行搜索。這將比在所有實(shí)體中搜索高效得多。
ECS在存儲(chǔ)實(shí)體到內(nèi)存塊中沒有特殊的順序。當(dāng)一個(gè)實(shí)體被創(chuàng)建或者一個(gè)實(shí)體的原型發(fā)生變化時(shí),ECS會(huì)把它放到對(duì)應(yīng)原型中第一個(gè)有空間的內(nèi)存塊中。塊中的數(shù)據(jù)將緊密排列。如果要將一個(gè)實(shí)體移出當(dāng)前原型的內(nèi)存塊,此時(shí)會(huì)有一個(gè)空位,ECS會(huì)將這個(gè)內(nèi)存塊的最后一個(gè)實(shí)體數(shù)據(jù)移到這個(gè)空位上。
注意:原型中共享組件的數(shù)據(jù)(后面會(huì)詳細(xì)描述)也會(huì)影響實(shí)體將存儲(chǔ)在哪個(gè)內(nèi)存塊中。同一內(nèi)存塊中所有實(shí)體的共享組件中的數(shù)據(jù)值是相同的。如果修改共享組件中的數(shù)據(jù),實(shí)體將被移動(dòng)到另一個(gè)塊中,這有點(diǎn)類似于修改實(shí)體的原型。
將共享組件的實(shí)體劃分到一個(gè)內(nèi)存塊中將提高處理它們的速度。例如,Hybird Renderer定義了RenderMesh組件來實(shí)現(xiàn)這一目標(biāo)。
實(shí)體查詢
系統(tǒng)在什么基礎(chǔ)上決定處理哪些實(shí)體?這將使用稱為實(shí)體查詢的東西。實(shí)體查詢首先需要一些組件類型,然后根據(jù)你傳入的組件類型組合,在包含這些組件的原型中查詢符合要求的實(shí)體。查詢時(shí)可以指定以下三種類型:
All必須包含所有組件類型。
任何必須在任何中包含至少一個(gè)組件類型。
None中不能包含任何組件類型。
實(shí)體查詢的結(jié)果將返回滿足查詢要求的所有內(nèi)存塊。您可以使用IJobChunk遍歷所有組件。(IJobChunk后面會(huì)講到。)
作業(yè)作業(yè)
如前所述,ECS只有在與Job一起使用時(shí)才能發(fā)揮多線程的威力。ECS提供了包含實(shí)體的SystemBase類。ForEach方法,還包含IJobChunk的Schedule()和ScheduleParallel()方法,可以處理子線程中的數(shù)據(jù)。實(shí)體。ForEach是最簡單的方法,只需幾行代碼就可以實(shí)現(xiàn)。IJobChunk可以用來處理更復(fù)雜的情況。
ECS將根據(jù)系統(tǒng)的順序在主線程中調(diào)度作業(yè)。當(dāng)調(diào)度作業(yè)時(shí),ECS將跟蹤哪些作業(yè)正在讀取和寫入哪些組件。需要讀權(quán)限的作業(yè)需要等到上一個(gè)具有寫權(quán)限的作業(yè)完成執(zhí)行,反之亦然。作業(yè)調(diào)度器將使用作業(yè)相關(guān)性來決定哪些作業(yè)可以并行,哪些作業(yè)必須串行。
系統(tǒng)的組織
歐共體通過世界和集團(tuán)組織系統(tǒng)。默認(rèn)情況下,ECS將使用一些預(yù)定義的組創(chuàng)建一個(gè)默認(rèn)世界。它將找到項(xiàng)目中的所有系統(tǒng),實(shí)例化它們,并將它們添加到預(yù)定義的組中。
您可以在同一組中指定系統(tǒng)更新的執(zhí)行順序。組也是一個(gè)系統(tǒng),所以您可以將一個(gè)組添加到另一個(gè)組中。如果不指定順序,系統(tǒng)的執(zhí)行順序?qū)⑹遣淮_定的,它不會(huì)遵循它們被創(chuàng)建的順序。但是,同一組中的所有系統(tǒng)將在下一組中的系統(tǒng)之前執(zhí)行。
系統(tǒng)的更新是在主線程中執(zhí)行的,但是您可以使用Job將工作分配給子線程。
ECS世界的視覺創(chuàng)作(創(chuàng)作)
在Unity中,沒有辦法直接在視覺上創(chuàng)建DOTS世界。不過可以先用GameOjbect和MonoBehaviour創(chuàng)建,然后通過轉(zhuǎn)換系統(tǒng)把GameObject轉(zhuǎn)換成實(shí)體和組件。我們以后再談這個(gè)。
來源:Unity官方平臺(tái)
原文:https://mp.weixin.qq.com/s/Tvtqz51Np7vWeYwKcQtHdQ
特別聲明:以上文章內(nèi)容僅代表作者本人觀點(diǎn),不代表ESG跨境電商觀點(diǎn)或立場(chǎng)。如有關(guān)于作品內(nèi)容、版權(quán)或其它問題請(qǐng)于作品發(fā)表后的30日內(nèi)與ESG跨境電商聯(lián)系。
二維碼加載中...
使用微信掃一掃登錄
使用賬號(hào)密碼登錄
平臺(tái)顧問
微信掃一掃
馬上聯(lián)系在線顧問
小程序
ESG跨境小程序
手機(jī)入駐更便捷
返回頂部