1. 程式人生 > >說說Mono 與 Unity 的關係(二)(V客學院知識分享)

說說Mono 與 Unity 的關係(二)(V客學院知識分享)

    在上一篇文章中,簡要說明了下 Mono 是什麼和其組成部分。這一篇文章講繼續說明 Mono 的作用,它與C#指令碼之間的關係。

    在說明 Mono 與C#指令碼的關係之前,有必要提一提各種程式語言的差別以及遊戲開發的既往史。如果以速度作為衡量語言級別的標準,語言從低階到高階大概排名如下:

1 組合語言。

2 C/C++, 編譯型靜態不安全語言。

3 C#、Java,編譯型靜態安全語言。

4 Python、JavaScript,解釋型動態安全語言。

    在以上排名中,C/C++屬於中低階語言,它們與組合語言一樣可以更加直接地與硬體打交道,因而具備更優異的效率,而如 C#以上的高階語言則不然。令人沮喪的是,如 C/C++這種高效率的低階語言雖然入門容易,但是進階難,其高階特性和高度靈活性也會帶來高風險,這樣使得開發難度高,開發效率低,開發成本也隨之增加。

    在過去在開發遊戲時,常常只會採用一種程式語言,這個時候遊戲開發者往往會面臨一個兩難的選擇,到底是使用高效率的低階語言還是低效率的高階語言來進行開發。語言選擇合適與否,可能直接關係到遊戲開發的成與敗。在以往單機遊戲流行的年代,硬體水平相對低下,為了儘可能壓榨硬體效能,多采用 C/C++來進行開發。而隨著硬體水平的提高,壓榨硬體效能的需求已經不再那麼迫切,取而代之的是:網遊的興起對開發速度以及版本迭代提出更高的要求。開發效率並不高,且投資巨大、風險很高的 C/C++慢慢不再適應市場需求。更加現實的問題是:相比難以掌握的 C/C++語言,更容易被掌握的 Java、.Net甚至是 JavaScript 被更多的程式設計師所選擇,C/C++程式設計師所佔比例越來越小。而網遊市場的不斷擴大對人才的需求也越來越大, 這樣就造成了大量的人才空缺,也就反過來提高了使用 C/C++開發遊戲的成本。面對這一困境,遊戲指令碼應運而生。在遊戲中使用指令碼,不經解決了 C/C++難以精通帶來的開發效率低的問題,也降低了使用C/C++進行專案開發的風險和成本。相比使用 C/C++,使用指令碼語言開發遊戲,具有易於學習,程式碼維護方便,開發成本低的優勢。慢慢地,使用指令碼已經成為了遊戲開發中不可或缺的一部分。Unity 使用 C#作為遊戲指令碼語言(在Unity2017版本以前,還使用了Boo 語言和 Unity 開發的一種基於 Boo的一種叫做 UnityScript 語言作為指令碼語言,在2017版本後移除了另外兩種語言的支援,只留下了 C#作為唯一的指令碼編寫語言)。

那麼使用 C/C++開發應用與使用指令碼開發應用有什麼不同呢,下圖給出了兩者應用的結構:


指令碼機制的出現,使得遊戲開發時在到底是選擇高效的低階語言還是低效的高階語言之外多了另一種平衡兩者的選擇。指令碼機制融合了兩者的優點,由經驗豐富的開發人員使用 C/C++開發應用引擎,而具體功能的實現,如 UI 、互動等則使用高階語言開發。通過使用高階指令碼語言,開發者不必擔心C/C++開發的引擎中具體實現的細節,也無需關注資源管理和記憶體管理的這些細節,提高了開發效率和風險,還能獲得不俗的執行速度。

    Mono提供了這種指令碼機制實現的可能,它將指令碼語言通過 JIT 編譯為原生程式碼,提高了指令碼語言的效率,同時還提供了很多方便呼叫原生程式碼的介面。Mono 在此充當了指令碼語言與低階語言之間互動的橋樑。要想通過Mono 實現指令碼語言與低階語言的互動,那麼就必須將 Mono 執行時嵌入應用中。因為 Unity 本身就是使用 C++寫成的,下圖以就Unity 為例進行展示:


 Mono 嵌入 Unity 的過程分為3個步驟1: 編譯 Unity 程式和連結 Mono 執行時。2:初始化 Mono 執行時。3:Unity 的 C/C++程式碼與 C#/IL的互動,其具體過程比較複雜,這裡不做具體介紹。

 當 Mono執行時嵌入 Unity 之後,Unity的 C/C++程式碼 與C#程式碼之前就可以通過控制代碼來進行互動了。C/C++可以獲取 C#方法的MonoMethod 控制代碼並呼叫該方法。而在C#指令碼檔案中呼叫 C/C++程式碼時,則是在 C#檔案中定義與 Unity 引擎的 C/C++程式碼中結構對應的類來作為介面,通過對介面的呼叫來實現對 C/C++的呼叫。在 C#的程式碼中,只提供介面,並不提供具體邏輯的實現。類的物件構建工作最終還是移交給了 C/C++程式碼。

    可以看出 C#指令碼是通過 Mono 先被編譯成 IL(中間語言),接著這些IL會在 Mono 執行時中通過 JIT進一步被編譯成原生程式碼並執行的。而指令碼機制的使用,則使得原本需要通過複雜的 C/C++編寫程式碼實現的部分功能,也能通過高階語言編寫指令碼來實現。Mono 即在這一過程中作為指令碼模組的基礎,提供了這種指令碼功能。

PHP開發、web前端、UI設計、VR開發專業培訓機構--VIT學院版權所有,轉載請註明出處,謝謝合作!