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

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

huatuo之AOT泛型限制及原理介紹

2022-12-22 18:50 作者:unity小能手  | 我要投稿

CLR?泛型



CLR中有兩類泛型特性:泛型類型和泛型函數(shù)。泛型是c#中使用極其廣泛的特性。即使一個沒有明顯包含泛型的用法,可能隱含了泛型相關(guān)的定義或者操作。

例如

  • int[]隱含就實(shí)現(xiàn) IEnemrable之類的接口。

  • 為async生成狀態(tài)機(jī)代碼時,也會隱含生成一些對 System.Runtime.CompilerServices.AsyncTaskMethodBuilder::AwaitUnsafeOnCompleted 之類的泛型代碼的調(diào)用。

AOT泛型的問題

泛型類型本身只是元數(shù)據(jù),內(nèi)存可以動態(tài)創(chuàng)造出任意泛型類型的實(shí)例化,無論是AOT泛型還是解釋器泛型。但泛型函數(shù)(包括泛型類的普通成員函數(shù))則情況有點(diǎn)不同。

解釋器泛型函數(shù)沒有任何限制,但AOT泛型函數(shù)則遇到一個嚴(yán)重的問題:由于泛型函數(shù)的原始函數(shù)體元數(shù)據(jù)在il2cpp翻譯后已經(jīng)丟失,理論不可能根據(jù)已有的c++泛型函數(shù)指針為一個新的泛型類型產(chǎn)生對應(yīng)泛型實(shí)例化函數(shù)。

對于一些特殊的AOT泛型,huatuo作了特殊處理,沒有限制:

  • 泛型數(shù)組,包括多維數(shù)組

  • 泛型delegate

  • 泛型Nullable類型

但顯然不可能對每個AOT泛型類特殊處理。因此,如果你在熱更新腳本里定義了個值類型:

il2cpp的泛型共享機(jī)制

il2cpp為了避免泛型代碼膨脹,節(jié)約內(nèi)存,在保證代碼邏輯正確性的情況下對于一些能夠共享代碼,只生成一份代碼。為此引入一個概念叫泛型代碼共享?Generic Sharing,此技術(shù)更早則源于mono。CLR中也有同樣的概念,CLR認(rèn)為所有引用類型實(shí)參都一樣,所以可以代碼共享,例如,為 List<string> 方法編譯的代碼可以直接用于List<Stream>方法,這是因?yàn)樗幸妙愋蛯?shí)參/變量只是指向托管堆的一個8字節(jié)指針(這里假設(shè)64位系統(tǒng)),但是對于值類型,則必須每種類型都進(jìn)行代碼生成,因?yàn)橹殿愋痛笮〔欢ā?/p>

以List<T> 舉例:

  • 可以使用AOT中使用過的任何List的實(shí)例化類型。例如你在AOT里用過List<vector3>,則熱更新里也可以用

  • 可以使用任意 List<EnumType>。 只需要你在AOT里實(shí)例化某一個List<相同underlying type的EnumType>。

  • 可以使用任意引用類型的泛型參數(shù) List<ClassType>。 只需要你在AOT里實(shí)例化過 List<object>(或任意一個引用泛型參數(shù)如 List<string>)

注意?。?!il2cpp泛型共享機(jī)制?不支持?List<熱更新值類型>。因?yàn)橹殿愋蜔o法泛型共享,而熱更新值類型不可能提前在AOT里泛型實(shí)例化。這個限制由下一節(jié)?基于補(bǔ)充元數(shù)據(jù)的泛型函數(shù)實(shí)例化技術(shù)?徹底解決。不過即使沒有這個限制,對于AOT值類型,能提前泛型實(shí)例化,可以大幅提升性能(畢竟不用解釋執(zhí)行了)。后續(xù)會有工具幫助自動收集熱更新模塊中的泛型實(shí)例,盡量讓它提前AOT實(shí)例化。

il2cpp中值類型不支持泛型共享的原因

主要有兩個原因:

  1. 值類型大小不定,且值類型對齊方式不一樣,不同對齊會導(dǎo)致所在的類的布局不同。

舉例

基于補(bǔ)充元數(shù)據(jù)的泛型函數(shù)實(shí)例化技術(shù)(huatuo的專利技術(shù))

既然AOT泛型函數(shù)無法實(shí)例化的問題本質(zhì)上是il2cpp翻譯造成的元數(shù)據(jù)缺失的問題,那解決思路也很簡單,補(bǔ)充上原始元數(shù)據(jù)那就能正常實(shí)例化了。使用?HuatuoApi.LoadMetadataForAOTAssembly?函數(shù)為AOT的assembly補(bǔ)充對應(yīng)的元數(shù)據(jù)。

注意,當(dāng)前要求補(bǔ)充的dll與打包時裁剪后的dll精確一致,因此必須使用build過程中生成的裁剪后的dll,則不能直接復(fù)制原始dll,這個限制將來可能會去掉。這些dll可以在目錄 {project}/Temp/StagingArea/Il2Cpp/Managed 下找到。另外,對于一些平臺如Win Standalone的包,在 {build}/{project}/Managed 目錄下也能找到。

你只要在使用AOT泛型前調(diào)用即可(只需要調(diào)用一次)。如果未注冊相應(yīng)的泛型元數(shù)據(jù),則退回到il2cpp的泛型共享機(jī)制。

基于補(bǔ)充元數(shù)據(jù)的泛型函數(shù)實(shí)例化技術(shù)雖然相當(dāng)完美,但畢竟實(shí)例化的函數(shù)以解釋方式執(zhí)行,如果能提前在AOT中泛型實(shí)例化,可以大幅提升性能。 所以推薦對于常用尤其是性能敏感的泛型類和函數(shù),提前在AOT中實(shí)例化。后續(xù)我們也會提供工具幫助自動掃描收集相應(yīng)的泛型實(shí)例。

以下代碼來自?huatuo_trial?。


huatuo之AOT泛型限制及原理介紹的評論 (共 條)

分享到微博請遵守國家法律
诸城市| 济宁市| 武鸣县| 大冶市| 平罗县| 儋州市| 桐庐县| 方正县| 故城县| 盐源县| 漳浦县| 娱乐| 刚察县| 石棉县| 五莲县| 奉新县| 临猗县| 措勤县| 佛坪县| 嘉义县| 苍溪县| 柳江县| 东明县| 房产| 始兴县| 疏附县| 疏勒县| 兴化市| 凤凰县| 华宁县| 古丈县| 肥西县| 罗平县| 卓尼县| 定边县| 离岛区| 巴里| 崇信县| 信丰县| 新丰县| 额敏县|