Unity3D實(shí)驗(yàn)室之iOS真機(jī)閃退的解決方法
問(wèn)題的產(chǎn)生
這個(gè)問(wèn)題一般發(fā)生在項(xiàng)目比較大,OO使用良好,泛型繼承用的較多的時(shí)候。第一次真機(jī)測(cè)試時(shí),項(xiàng)目終于進(jìn)入真機(jī)測(cè)試階段,之前都是在Unity編輯環(huán)境下開(kāi)發(fā)測(cè)試,運(yùn)行的都很良好,信心滿滿的打包安裝,結(jié)果閃退。。。,各種代碼調(diào)試,跟蹤都沒(méi)什么線索。這怎么辦?問(wèn)題很可能出在了AOT的設(shè)置上。
解決方案
這個(gè)通常是因?yàn)槟愕某绦蚓幾g的時(shí)候給 trampoline 分配的空間太小,而你的程序中又大量使用了泛型、泛型方法調(diào)用和接口實(shí)現(xiàn)導(dǎo)致的。具體的解決方法就是在 Unity3D 的編譯選項(xiàng) Player Setting 中有一個(gè) AOT Compilation Options 條目,在這個(gè)選項(xiàng)條目中加上以下編譯參數(shù)就好了
nrgctx-trampolines=8192,nimt-trampolines=8192,ntrampolines=4096
加上以后,重新打包測(cè)試,看還有沒(méi)有問(wèn)題
參數(shù)意思
關(guān)于上面的三個(gè)參數(shù)的意思分別如下:
nrgctx-trampolines=8192 這是留給遞歸泛型使用的空間,默認(rèn)是 1024
nimt-trampolines=8192 這是留給接口使用的空間,默認(rèn)是 128
ntrampolines=4096 這是留給泛型方法調(diào)用使用的空間,默認(rèn)是 1024
什么是trampoline
Trampoline 是一些手寫(xiě)的非常短小的用來(lái)在 Mono Runtime中執(zhí)行很多操作的Component Code。主要是通過(guò) JIT 使用到的本地代碼宏在運(yùn)行時(shí)動(dòng)態(tài)生成的。它們通常都有與之相對(duì)應(yīng)的 C 方法,在某些較為復(fù)雜的場(chǎng)景中,當(dāng) trampoline 無(wú)法勝任時(shí),mono 運(yùn)行時(shí)就會(huì)將這些復(fù)雜的操作交回給這些對(duì)應(yīng)的 C 方法來(lái)執(zhí)行。這也可以看作是將 JIT 代碼的執(zhí)行權(quán)交回給 runtime 的一種方式。
這看起來(lái)明顯是為了提高 mono runtime 在執(zhí)行 C#代碼時(shí)候的效率,但還是有點(diǎn)不明白。
再來(lái)看看官方文檔關(guān)于 JIT Trampolines 和 AOT Trampolines 的介紹:
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() 方法來(lái)編譯這個(gè) trampoline 實(shí)際指向的目標(biāo)方法,然后將編譯后的方法的指針地址返回給這個(gè)指向它的 trampoline。這個(gè)過(guò)程呢稍微有點(diǎn)慢,所以呢,mono_magic_trampoline() 方法會(huì)優(yōu)化調(diào)用 JIT 代碼的過(guò)程,它會(huì)先嘗試調(diào)用已經(jīng)通過(guò) JIT 編譯過(guò)的方法而不是立即通過(guò) trampoline 直接進(jìn)行調(diào)用。這些都是通過(guò)在 tramp-.c 文件中的 mono_patch_callsiete() 方法來(lái)完成的。
AOT Trampolines
AOT Trampolines 和 JIT Trampolines 非常相似,但是 AOT Trampolines 接受的編譯參數(shù)不是一個(gè) Mono 方法而是一個(gè) image+token 對(duì)。如果傳入的用于編譯的 image+token 對(duì)所指向的方法已經(jīng)經(jīng)過(guò) AOT 編譯過(guò)了,那么再次編譯這個(gè) image+token 對(duì)時(shí),就會(huì)直接返回這個(gè)已編譯方法的指針地址而不需要再次加載這個(gè)方法的元數(shù)據(jù)進(jìn)行再次編譯了。
IMT Trampolines也是用于優(yōu)化接口調(diào)用效率的。
Trampolines 存在的價(jià)值就是為了減少 C#代碼在 mono runtime 中運(yùn)行時(shí)的性能損耗,提高 C#代碼的執(zhí)行效率。
總結(jié)
當(dāng)遇到類(lèi)似問(wèn)題時(shí)可以試試上面的方法。
以上這篇Unity3D實(shí)驗(yàn)室之iOS真機(jī)閃退的解決方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
iOS ScrollView實(shí)現(xiàn)自動(dòng)布局的方法(適用Swift 3.0 )
傳說(shuō)中有一個(gè)美工ios開(kāi)發(fā)者在遇到這個(gè)問(wèn)題的時(shí)候特意跑到蘋(píng)果總部去咨詢?nèi)绾螌?duì)scrollview進(jìn)行自動(dòng)布局。當(dāng)然大家不用去了,下面這篇文章就來(lái)給大家介紹關(guān)于iOS ScrollView實(shí)現(xiàn)自動(dòng)布局的方法,文中的語(yǔ)法同樣也適用Swift 3.0 ,需要的朋友可以參考下。2017-12-12iOS使用xib手動(dòng)實(shí)現(xiàn)動(dòng)畫(huà)效果的方法
下面小編就為大家分享一篇iOS使用xib手動(dòng)實(shí)現(xiàn)動(dòng)畫(huà)效果的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01iOS中UIAlertController設(shè)置自定義標(biāo)題與內(nèi)容的方法
UIAlertController是iOS8推出的新概念,取代了之前的 UIAlertView和UIActionSheet(雖然現(xiàn)在仍可以使用,但是會(huì)有警告)。下面這篇文章主要給大家介紹了關(guān)于iOS中UIAlertController如何設(shè)置自定義標(biāo)題與內(nèi)容的相關(guān)資料,需要的朋友可以參考下。2017-10-10iOS中幾種定時(shí)器的實(shí)現(xiàn)小結(jié)
這篇文章主要介紹了iOS中幾種定時(shí)器的實(shí)現(xiàn)小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01iOS中修改UITextField占位符字體顏色的方法總結(jié)
這篇文章給大家分享了iOS中修改UITextField占位符字體顏色的三個(gè)方法,分別是使用attributedPlaceholder屬性、重寫(xiě)drawPlaceholderInRect方法和修改UITextField內(nèi)部placeholderLaber的顏色,下面我們一起來(lái)看看詳細(xì)的方法介紹。2016-09-09iOS中定位當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法
這篇文章主要介紹了iOS中獲取當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法,這里的火星坐標(biāo)指的是我國(guó)專(zhuān)門(mén)研制的一種加密的坐標(biāo)系統(tǒng)...需要的朋友可以參考下2016-02-02講解iOS開(kāi)發(fā)中對(duì)音效和音樂(lè)播放的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了iOS開(kāi)發(fā)中對(duì)音效和音樂(lè)播放的簡(jiǎn)單實(shí)現(xiàn),代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11iOS開(kāi)發(fā)之導(dǎo)航欄各種右滑返回失效的解決方法匯總
這篇文章主要給大家總結(jié)介紹了關(guān)于iOS開(kāi)發(fā)教程之導(dǎo)航欄各種右滑返回失效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08