如何抓住ECS的命門,讓我們的學習事半功倍


導讀

這是一篇老文寫與2019年5月

我們說如何提高我們的學習效率,有人說一本書一般只會講一個知識點,那我們學習ECS 如何抓住學習的重點,提高學習效率。經過本人一段時間的學習總結,總於找到了一個便捷的方法。當然如果只是入門,完全可以繞道,不用看這篇文章了,因為入門的教程unity3d的document以及sample中已經覆蓋了。我們要解決的問題不是如何使用ECS ,而是為什么要這么用,內在原因以及unity3d 為何要這么設計。在開始之前我們還是按照老習慣拋出幾個問題
1、ECS的數據組件類型有那些?
2、他們的區別是什么,都用於什么場景?
3、這些數據類型都是怎么獲取的(access)的,或者說IComponentData 都是怎么獲取的
4、EntityQuery 進行數據查詢是如何實現的
5、如何優化和設計ECS系統的性能

1,2問題我們發現基本是概念的問題,但是3,4 問題擺在你的面前,你會發現使用我們學習的基礎入門知識,我們是解釋不了得,如果我們沒有理論知識作為支撐,我們無法理解這些問題的本質,無法讓我們在ECS學習的路上走的更遠更深入。
      言歸正傳,我們進入本系列的主題,我們知道ECS是基於一種基於面向數據的開發模式,最主要的特點是數據的線性連續存放。我想看這篇文章的同學,也有一定ECS的基礎知識了,應該耳熟能詳了。我們換個思路來想想,光知道這句話的實際意義又是什么呢,只是一個概念而已,就像我們中國的it人要開發自己的操作系統,我們在大學里面已經學習了“操作系統原理”這們課程,但是為什么我們弄了這么多年也沒有開發出操作系統呢? 當你真正的進入unity ecs的開發你會發現一個問題,我們光知道這個數據連續存放的概念,並不能幫助我們深入學習ecs,也不能幫我們回答以上提出的幾個深入的問題,更談不上讓我們游刃有余的在實際項目中應用ecs了。最后呢,才能引出我們本篇的主題 ”unity ecs的數據存儲結構到底是什么樣子的呢?“
這個問題又能分成好幾個子的主題來說明,本篇,解決的第一個問題是 Normal IComponentData 也就是最簡單的數據組件是如何存儲的ECS進行數據存儲的物理單位是chunk,而邏輯單位是ComponentData,所以要搞明白本章主題我們又要回答以下幾個問題
1、什么事chunk
2、chunk的數據結構式什么樣的
3、chunk與ComponentData的組織關系式是什么?


1、什么是chunk chunk是ECS進行內存存儲的單元,具有固定的大小,目前是什么16kb(將來可能進行調節),其中包含的內容有EnityArchetype,EnityIndex ComponentData 和SharecomponentData。分為兩種情況,如果entity 實體只包含IcomponentData 普通數據那么,一種實體對象數組對應(1,n)個chunk
chunk的結構是,chunk頭,數據區和sharedata區 。其中數據去IComponentData的存儲方式是按component type 分組進行分組進行排列。
2、ShareComponent 的保存比較特殊
a、如果實體只有一個Sharecomponent數據,或者多個,他們保存在component的數據區后面,保存的是指向真正數據的指針
b、sharecomponent value 與chunk 是 oen pre chunk的關系,也就是一種sharecomponent value 保存在一個chunk中,舉例就是,student 實體,其中保存‘男’的實體數組在一個chunk中,保存‘女’的實體的數組在另一個chunk中,所以應用這個特性我們可以通過查詢sharecomponent 的具體value (data)來過濾 chunk,提供組件access的速度
c、tag component的存儲,由於其實不包含任何實質的數據,其實只具有entityarchetype,那么我們知道 entiy 與chunk 是1對多的關系,也就是 如果知道entity的具體archeype(componnet type的組成)也就知道了enity,知道了entity也就知道了它所占用的chunk,所以同過tag component 可以方便的進行具有多種componenttype 數據的篩選和過濾

以上內容只是個人的一個終結,需要學習一定程度后才能正真領會,大家加油。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM