嘗試在Unity中將 Player Setting->Other->AOT Compilation Options 設(shè)置為 nrgctx-trampolines=8192,nimt-trampolines=8192,ntrampolines=4096
nrgctx-trampolines=8192,nimt-trampolines=8192,ntrampolines=4096
因?yàn)闆]有設(shè)置這個(gè)而導(dǎo)致奔潰閃退的原因是默認(rèn) Mono Runtime 在 AOT 編譯的時(shí)候給的 trampoline 配置太小,不適合我們這種設(shè)計(jì)優(yōu)良孤个,大量使用 interface,設(shè)計(jì)絕對(duì)遵照 OO 思想的稍大一些的項(xiàng)目烹困。
AOT 就是區(qū)別于 JIT(Just In Time) 的另一個(gè)編譯機(jī)制择卦,全稱是 Ahead Of Time,就是預(yù)先編譯好,而不是在代碼執(zhí)行到了某個(gè)方法再進(jìn)行編譯畜眨,這樣的話會(huì)有一些好處昼牛。
使用 AOT 編譯的有點(diǎn)有以下優(yōu)點(diǎn):
- 加快程序啟動(dòng)速度
- 更強(qiáng)的內(nèi)存共享機(jī)制
- 潛在的性能提升
AOT 默認(rèn)編譯時(shí)給 Trampolines 的參數(shù)有點(diǎn)低:
nrgctx-trampolines 默認(rèn)為 1024
nimt-trampolines 默認(rèn)為 128
ntrampolines 默認(rèn)為 1024
這對(duì)于小一些的項(xiàng)目可能是夠用的,因?yàn)檎w項(xiàng)目的結(jié)構(gòu)不會(huì)太復(fù)雜康聂,使用到的接口贰健、泛型、遞歸相對(duì)也不會(huì)太多恬汁,但是對(duì)于一個(gè)稍大一些的項(xiàng)目來說伶椿,特別是采用了某些設(shè)計(jì)良好的第三方庫的項(xiàng)目來說,這就可能不夠用了氓侧。
大概解釋一下相關(guān)的幾個(gè)名詞:
Trampoline 是一些手寫的非常短小的用來在 mono 運(yùn)行時(shí)中執(zhí)行很多操作的組件代碼脊另。主要是通過 JIT 使用到的本地代碼宏在運(yùn)行時(shí)動(dòng)態(tài)生成的。它們通常都有與之相對(duì)應(yīng)的 C 方法约巷,在某些較為復(fù)雜的場景中偎痛,當(dāng) trampoline 無法勝任時(shí),mono 運(yùn)行時(shí)就會(huì)將這些復(fù)雜的操作交回給這些對(duì)應(yīng)的 C 方法來執(zhí)行载庭。這也可以看作是將 JIT 代碼的執(zhí)行權(quán)交回給 runtime 的一種方式看彼。
JIT Trampolines 這些 Trampoline 主要是 JIT 在首次調(diào)用某個(gè)方法的時(shí)候編譯方法用的。當(dāng) JIT 在編譯一個(gè)方法調(diào)用指令時(shí)囚聚,它并不會(huì)立刻就編譯這個(gè)被調(diào)用到的方法靖榕。實(shí)際上,它會(huì)先創(chuàng)建一個(gè) JIT Trampoline顽铸,同時(shí)創(chuàng)建一個(gè)指向這個(gè) trampoline 的調(diào)用指令茁计。當(dāng)這個(gè) JIT Trampoline 在調(diào)用到的時(shí)候,它會(huì)再調(diào)用 mono_magic_trampoline() 方法來編譯這個(gè) trampoline 實(shí)際指向的目標(biāo)方法谓松,然后將編譯后的方法的指針地址返回給這個(gè)指向它的 trampoline星压。這個(gè)過程呢稍微有點(diǎn)慢,所以呢鬼譬,mono_magic_trampoline() 方法會(huì)優(yōu)化調(diào)用 JIT 代碼的過程娜膘,它會(huì)先嘗試調(diào)用已經(jīng)通過 JIT 編譯過的方法而不是立即通過 trampoline 直接進(jìn)行調(diào)用。這些都是通過在 tramp-.c 文件中的 mono_patch_callsiete() 方法來完成的优质。
AOT Trampolines AOT Trampolines 和 JIT Trampolines 非常相似竣贪,但是 AOT Trampolines 接受的編譯參數(shù)不是一個(gè) Mono 方法而是一個(gè) image+token 對(duì)。如果傳入的用于編譯的 image+token 對(duì)所指向的方法已經(jīng)經(jīng)過 AOT 編譯過了巩螃,那么再次編譯這個(gè) image+token 對(duì)時(shí)演怎,就會(huì)直接返回這個(gè)已編譯方法的指針地址而不需要再次加載這個(gè)方法的元數(shù)據(jù)進(jìn)行再次編譯了。