

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