Unity 4.x 各版本IOS IL2CPP對比


不同Unity版本IL2CPP對比

Unity版本 C++代碼總行數 泛型相關行數 Attribute相關行數 IPA大小 純64位 64位+32位 備注
4.6.4f1 約3302萬行 約2508萬行(75%) 1984行 330MB 約65MB 約130MB 正常運行,包太大
4.6.6f1 約755萬行 約156萬行 (20%) 約28萬行 292MB 約42MB 約78MB 包夠小! 泛型BUG閃退,KTDCaption.AddPart
4.6.7f1 約731萬行 約158萬行(21%) 約28萬行 293MB 約43MB 約81MB 正常運行!包大小差一點點
4.6.8f1 約589萬行 約275萬(46%) 約28萬行 295MB 約50MB 約93MB 初始化階段,一處反射BUG閃退,KLTaskSettingCallParse里的GetType(xxx, true)
4.6.9f1 約591萬行 約276萬行(46%) 約28萬行 295MB 約50MB 約93MB 初始化階段,一處反射BUG閃退,KLTaskSettingCallParse里的GetType(xxx, true)
4.7.1f1 約591萬行 約276萬行(46%) 約28萬行 295MB 約50MB 約95MB 初始化階段,一處反射BUG閃退,KLTaskSettingCallParse里的GetType(xxx, true)

 

  • 注意:

    • 64位+32位要小於80MB才能允許上傳到App Store!
    • 尚未進行代碼注入!即無熱更新功能
    • IL2CPP的BUG集中在反射和泛型!執行文件大小跟泛型的使用成正比
    • 我們的代碼風格越簡潔越不會出現問題!
    • 最新的幾個版本4.6.8-4.7.1,IL2CPP已經沒有太多變化了

 

 

  • 需要進行的優化:

    • object引用類型的泛型,4.6.6后,會進行泛型共享,但是值類型的泛型,依然會生成非常大量的代碼
    • struct改class! 數組struct[] 會生成大量代碼,數組class[]則不會
    • 修復帶有值類型的泛型: 如IList<(struct)> 改成IList<(class)>, Dict<(value), (value)> 改成Hashtable

 

以后經驗:

  • 禁止多重泛型、泛型類、泛型接口、泛型委托, 泛型方法用前斟酌
  • 盡可能避免使用反射

不同Unity版本IL2CPP的差異

從Unity 4.6.2開始,之后的所有版本主要精力幾乎都集中在IL2CPP的修復和改進。  嘗試了不同Unity版本的IL2CPP,發現生成的C++代碼有非常大的差異,連生成的策略都很不一樣。

蘋果公司對執行文件的規定

蘋果公司規定,IOS應用執行文件大小有上限限制。  只支持64位的應用,執行文件必須在60MB以下。 要求iPhone 5S或以上,iOS 8.0或以上版本。  支持32位+64位的應用,執行文件必須在80MB以下,要求iOS 6.0以上。

是怎樣評估泛型代碼占用的?

  搜索帶有“Generic”字符串的C++文件,用shell命令進行統計。

IL2CPP的重災區

數組Array

泛型 Generic

非常嚴重, 4.7.1的IL2CPP優化重點,就是對於對泛型進行共享優化。  比如Dictionary<(KItem), (KWeapon)>,會變成Dictionary<(* void), (* void)>  但是Dictionary<(KItem), (int)>,依然會生成C++代碼。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM