新技術之IL2CPP
最近,我們談到了Unity 的WebGL 。 在那篇文中我們簡要談論到腳本在 WebGL 中的運行的新技術稱為“IL2CPP” 。然而IL2CPP 所代表的不只是適用於WebGL 的腳本解決方案,同時也是我們自己為了在更多平台上執行 .NET時能有高效能的方案。
Unity 中腳本的現狀
在深入探究未來之前,讓我們先談談現在吧。
我們利用Mono (以及在 Windows Store App 和Windows Phone 上的WinRT )讓C#變得容易使用,存取第三方資料庫並最接近原生平台的效能。但是仍然有些挑戰必須要解決:
• C# 運行時效能仍不如C/C++
• Unity 的當前版本Mono 不支援最新的.NET版本功能。
•同時要維持約 23 個平台轉換結構,在移植、維護以及保證功能與效能都達到最好需要投入大量精神。
•執行時,垃圾回收可能會導致暫停。
在過去幾年中我們試圖解決這些問題,但是進展不大。 同時針對WebGL 支援腳本的研究開始。 隨着這兩項研究的深入,我們將這兩條路徑合二為一。
問題范圍明確,我們為了解決這問題嘗試了各種不同實驗。有些方法有希望解決問題,有些則否。最終我們發現了一個創新的解決方案,這正確方向就是 IL2CPP 。
IL2CPP: 簡單介紹
IL2CPP 由兩部分組成: 一個預先編譯器( Ahead of Time (AOT) compiler) 和一台虛擬機( Virtual Machine (VM) )。
這兩部分意味着我們對通用語言基礎結構( Common Language Infrastructure) 的實現,類似於.NET 或Mono 。 它與Unity 中目前的腳本相容。
從根本上來說它不同於及時編譯,因為IL2CPP 編譯器會將程式轉換成C++ 源始碼,然后再利用標准 C++ 編譯器來產生原生二進制文件。
在執行時也會把 IL2CPP 虛擬機所提供的其它服務帶過去(如GC 、中繼資料、平台資源)。
IL2CPP 的優勢
我們再來談談前面所提到的每個問題,看看IL2CPP 如何一一解決。
性能
IL2CPP會在基於 C# 的易用性和高效性的同時,帶來C++ 的卓越性能。
目前有效率的腳本工作流保持不變,同時提升性能。 我們已經測試過在一些腳本很多的程式中性能提升了2 至3 倍。這種性能提升要歸功於幾個因素。
• C++ 編譯器和連結器提供了大量之前沒有的進階優化功能。
• 靜態分析是用於優化大小和速度的程式上執行的。
• 以Unity 為中心的腳本執行時優化。
雖然IL2CPP 還處於發展階段,但初期的測試已經可預期未來的發展很棒。
.NET 升級
我們經常收到希望我們升級.NET版本的請求。 盡管.NET 在過去幾年取得了一些進步,Unity 對C # 編譯器和類別庫目前仍支持.NET 2.0/3.5 時代的功能。 許多用戶要求要把新功能加入好讓他們的程式和第三方資源庫使用。
隨着IL2CPP 的日益成熟,我們會將升級 Mono C# 編譯器、類別庫和編輯器(由於版本開發快速取代,編輯器不會轉換到IL2CPP )到最新版本。 這將為Unity 帶來一個現代版的.NET 。
同樣值得一提的是,我們正與微軟合作將現有和未來的.NET 功能放入Unity ,以確保相容性和效能。
可移植性和維護
雖然這個部分聽起來像是一個應由Unity 處理的問題,但它也會對開發者產生影響。Mono 虛擬機擁有大量的平台和結構相關的程式碼。 當我們把Unity發布到一個新的平台時,我們將為該平台投入大量的精力來移植和維護Mono 虛擬機。
不同的功能(以及Bug)可能存在於不同平台。 這將會影響到Unity想要為開發者創造的價值,就是我們希望開發者可以輕松地將相同內容部署到不同平台。
IL2CPP 以多種方式解決這些問題:
• 所有的程式都改為轉換 C++ ,而非結構不同機器的代碼。 移植和維護所產生的成本就可以得到更清楚的數據。
•新功能開發和Bug維護的速度會更快。 對我們而言,本來要花幾天時間處理不同平台的結構轉換變為花數分鍾更改C++轉換流程。 功能及Bug修復可立即用於所有平台。
照目前情況來看,如果支援IL2CPP可以在很短的時間內移植到新平台。
此外,統一化編譯器的性能優化絕對遠遠優於一個一個維護不同的程式轉換器。 這使我們能夠重復利用已經導入 C++ 編譯器的功能,而不需要重新做一個。
垃圾回收
IL2CPP 並沒有連接任何一個垃圾回收器,而是開了一個API接口。 目前的版本中,IL2CPP 使用的是libgc 的升級版。除了GC 本身,我們也正在研究通過IL2CPP 編譯器中完成的分析來減少GC 壓力。
雖然此刻只有這些資料與開發者分享,但研究仍在持續在進行。 我們知道會有很多人關心這個發展,所以我們不會松懈並會保持提供最新消息。
與IL2CPP 無關,但偷偷地透露在垃圾回收的情況,Unity 5 .x 將會有越來越多無需分配的API 。
什么是IL2CPP不做的?
IL2CPP 並不是對整個.NET 或Mono 工具進行重新改寫。我們將繼續使用Mono C# 編譯器(之后可能還會用到Roslyn )。 也會繼續使用Mono 類別庫。 目前對Mono 預編譯器有效的所有功能和第三方資源庫也會對IL2CPP相容。我們只是嘗試提供一個虛擬機和預編譯器的替代產品,我們還將繼續利用性能卓越的Mono專案。
何時才能體驗IL2CPP ?
現在我們希望您也像我們一樣,對即將來臨的 IL2CPP 感到興奮,迫切地想知道何時才能使用 IL2CPP !
IL2CPP 的最初版本將在 Unity 5 中WebGL 發布的部分看到。
除了WebGL 之外,我們還在繼續為Unity其他發布平台開發IL2CPP 。 事實上,我們已經在許多我們支援的平台上進行了一些工作。 預計將在年末至少再推出一個平台。 目前的計划是讓iOS 成為下一個載有IL2CPP 支持的平台。
等到IL2CPP 可在多個平台上使用並且成熟之時,計划的Mono 工具升級將會接踵而來。
有一個平台永遠不會受IL2CPP 支援,那就是WebPlayer,這是因為安全隱憂。 所以如前面所提的,Webplayer編譯器仍將繼續使用Mono 。
現在就可以看到IL2CPP執行時的效果。我們之前發布的兩個WebGL Demo就是支援了 IL2CPP 。
接下來?
我們仍在為IL2CPP 埋頭苦干的實現新功能、優化程式轉換、修復漏洞並支援更多平台。 隨着發展我們將繼續發布更多官方消息與您分享。
資料
轉自(牆外):Unity 腳本的未來發展
