導讀
這是一篇老文寫與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 資料的篩選和過濾
以上內容只是個人的一個終結,需要學習一定程度后才能正真領會,大家加油,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14598.html
標籤:其他
