五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(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ū)別與性能分析的評論 (共 條)

分享到微博請遵守國家法律
莱芜市| 淄博市| 宝丰县| 揭阳市| 云林县| 晋宁县| 丹巴县| 祁阳县| 邹平县| 栾川县| 贵德县| 彭山县| 宜都市| 孙吴县| 南陵县| 夏邑县| 土默特左旗| 修水县| 安乡县| 大洼县| 新龙县| 上饶市| 定南县| 奉节县| 漠河县| 阿巴嘎旗| 三亚市| 广德县| 新沂市| 牙克石市| 乌拉特中旗| 汝阳县| 义马市| 盐池县| 固镇县| 明水县| 景泰县| 柘荣县| 乌海市| 玉环县| 藁城市|