最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity DOTS系列之托管/非托管Component的區(qū)別與性能分析

2023-11-09 10:03 作者:游戲開發(fā)RAIN  | 我要投稿

最近DOTS發(fā)布了正式的版本, 我們來分享一下DOTS里面托管與非托管Component的區(qū)別與性能分析,方便大家上手學習掌握Unity DOTS開發(fā)。托管與非托管的區(qū)別在于是不是基于自動垃圾回收的。托管是由垃圾回收器來負責自動回收,非托管需要我們手動來做相關內(nèi)存管理,不被垃圾回收系統(tǒng)來處理。

Unmanaged Component(非托管)

??先來看下Unmanaged Component,它是我們在DOTS開發(fā)中使用最多的,性能最好的Component的類型。它的數(shù)據(jù)成員的類型會有一些限制: ??(1)?Blittable types: 這些類型可以在托管與非托管都有通用的表現(xiàn)形勢,不需要額外的轉(zhuǎn)換,如System.Byte,System.Int32等,具體可以參考Blittable types的詳細解釋(https://learn.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types); ??(2)bool與char類型; ??(3)BlobAssetReference類型:Blob asset 的對象的引用; ??(4)Collections.FixedString類型:?一個固定大小的character buffer; ??(5)Collections.FilxedList 類型:?一個固定大小的List; ??(6)FixedArray類型:?固定大小的一個數(shù)組類型,只能在unsafe環(huán)境中使用; ??(7)數(shù)據(jù)成員滿足上面類型條件的其它結(jié)構(gòu)體, 創(chuàng)建一個Unmanaged Component除了有上面數(shù)據(jù)成員類型的限制以外,你還要定義一個struct繼承自 IComponentData。代碼如下: ??public?struct?ExampleChunkComponent?:?IComponentData ??{ ????public?int?Value; ??} ? 如果你定義了一個struct 繼承自 IComponentData?但是里面沒有加任何的數(shù)據(jù),那么這種Component被稱為Tag Component,在開發(fā)中用來做特定標記某些Entity。??Unmanaged Component的內(nèi)存是基于ArchType分配在Chunk中的。它與所在Entity的其它Unmanaged Component基于ArchType排列在一起,這樣可以獲得很好的性能,因此Unmanaged Component在ECS開發(fā)中是最常用的一種組件數(shù)據(jù)類型。擁有很好的性能。 Managed Component(托管)

??與Unmanaged Component相比,Managed Component可以使用任意類型的數(shù)據(jù)成員。但是在存儲與訪問中性能會不如Unmanaged Component。它更靈活方便,但是性能不及Unmanaged Component。同時它也由一些使用方面的限制: (1)?不能夠在jobs工作線程里面來使用Managed Component。 (2)?在使用Burst編譯器編譯的代碼中不能使用Managed Component。 (3)?他們需要基于垃圾回收; (4)?為了序列化,他們必須要定義一個沒有參數(shù)的構(gòu)造函數(shù); 如果Managed Component中使用了托管的數(shù)據(jù)類型,可能需要手動添加序列化,Clone,比較等功能。定義一個Managed Component也非常簡單,你只要定義一個class,繼承自IComponentData,這樣就定義好了一個Managed Component(注意非托管的是定義struct)。要么就不要構(gòu)造函數(shù),要么就定義一個沒有參數(shù)的構(gòu)造函數(shù)。參考代碼如下: ??public?class?ExampleManagedComponent?:?IComponentData ??{ ????public?int?Value; ??} 當我們的Managed Component引用了其它的一些引用而外資源的時候,我們最好實現(xiàn)ICloneable與IDisposable。例如,一個Managed Component有一個數(shù)據(jù)成員ParticleSystem,指向了一個粒子對象。當我們復制這個組件所在的Entity的時候。如果你實現(xiàn)了Icloneable,你就可以把這個ParticalSystem的引用復制給另外一個Component。如果你實現(xiàn)了IDisposable,這樣你也可以基于這個機制來釋放你的資源。 托管與非托管Component的性能比較

??Managed?Component的數(shù)據(jù)不直接存放在Chunk中,World會有一個很大的”數(shù)組”,專門來存放Managed Component,而我們Entity的基于ArchType的Component數(shù)據(jù)塊中存放的是Managed Component的在數(shù)組中的偏移地址。這樣當我們訪問Managed Component的時候,需要查找,同時內(nèi)存會跳開到別的地方,這樣會導致Cache失效,所以性能會差一些。 ??Unmanaged Component的數(shù)據(jù)直接一起存放到Chunk中,這樣訪問的時候會非常高效,同時Cache命中率也會很高。同時UnmangedComponent可以直接在Burst Code中使用,能獲得很好的執(zhí)行性能。Unmanged Component的性能要比Managed Component的性能要好,這樣大多數(shù)情況下我們盡可能用Unmanaged來代替Managed。

Unity DOTS系列之托管/非托管Component的區(qū)別與性能分析的評論 (共 條)

分享到微博請遵守國家法律
洛宁县| 临潭县| 龙游县| 曲松县| 青龙| 象州县| 蒙自县| 聂拉木县| 称多县| 莱芜市| 望谟县| 恩施市| 东阿县| 长海县| 商洛市| 石门县| 九江市| 辽源市| 黑龙江省| 视频| 曲靖市| 平和县| 武强县| 韩城市| 新建县| 专栏| 五大连池市| 泰安市| 宝坻区| 海原县| 远安县| 车险| 中江县| 广平县| 新邵县| 崇文区| 枝江市| 蓝山县| 宜兰县| 营口市| 云梦县|