2014年5月26日 星期一

Unity 腳本的未來發展


【技術分享】Unity 中腳本的未來發展
2014-05-26 原文作者: 


      最近,我們談到了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 埋頭苦幹的實現新功能、優化程式轉換、修復漏洞並支援更多平台。 隨著發展我們將繼續發佈更多官方消息與您分享。


沒有留言:

張貼留言

著作人