歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 從游戲腳本語言說起,剖析Mono搭建的腳本基礎

從游戲腳本語言說起,剖析Mono搭建的腳本基礎

日期:2017/3/1 9:26:56   编辑:Linux編程

前言

在日常的工作中,我偶爾能遇到這樣的問題:“為何游戲腳本在現在的游戲開發中變得不可或缺?”。那麼這周我就寫篇文章從游戲腳本聊起,分析一下游戲腳本因何出現,而Mono又能提供怎樣的腳本基礎。最後會通過模擬Unity3D游戲引擎中的腳本功能,將Mono運行時嵌入到一個非托管(C/C++)程序中,實現腳本語言和“引擎”之間的分離。

Why?從為何需要游戲腳本說起

首先聊聊為何現在的游戲開發需要使用游戲腳本這個話題。

為何需要有腳本系統呢?腳本系統又是因何而出現的呢?其實游戲腳本並非一個新的名詞或者技術,早在暴雪的《魔獸世界》開始火爆的年代,人們便熟知了一個叫做Lua的腳本語言。而當時其實有很多網游都不約而同地使用了Lua作為腳本語言,比如網易的大話西游系列。但是在單機游戲流行的年代,我們卻很少聽說有什麼單機游戲使用了腳本技術。這又是為什麼呢?因為當時的硬件水平不高,所以需要使用C/C++這樣的語言盡量壓搾硬件的性能,同時,單機游戲的更新換代並不如網游那麼迅速,所以開發時間、版本迭代速度並非其考慮的第一要素,因而可以使用C/C++這樣開發效率不高的語言來開發游戲。

但是隨著時間的推移,硬件水平逐年提升,壓搾硬件性能的需求已經不再迫切。相反,此時網游的興起卻對開發速度、版本更迭提出了更高的要求。所以開發效率並不高效,且投資、巨大風險很高的C/C++便不再適應市場的需求了。更加現實的問題是,隨著Java、.Net甚至是JavaScript等語言的流行,程序員可以選擇的語言越來越多,這更加導致了優秀的C/C++程序員所占比例越來越小。而網游市場的不斷擴大,對人才的需求也越來越大,這就造成了大量的人才空缺,也就反過來提高了使用C/C++開發游戲的成本。而由於C/C++是門入門容易進階難的語言,其高級特性和高度靈活性帶來的高風險也是每個項目使用C/C++進行開發時所不得不考慮的問題。

一個可以解決這種困境的舉措便是在游戲中使用腳本。可以說游戲腳本的出現,不僅解決了由於C/C++難以精通而帶來的開發效率問題,而且還降低了使用C/C++進行開發的項目風險和成本。從此,腳本與游戲開發相得益彰,互相促進,逐漸成為了游戲開發中不可或缺的一個部分。

而到了如今手游興起的年代,市場的需求變得更加龐大且變化更加頻繁。這就更加需要用腳本語言來提高項目的開發效率、降低項目的成本。
而作為游戲腳本,它具體的優勢都包括哪些呢?

  1. 易於學習,代碼方便維護。適合快速開發。
  2. 開發成本低。因為易於學習,所以可以啟用新人,同時開發速度快,這些都是降低成本的方法。

因此,包括Unity3D在內的眾多游戲引擎,都提供了腳本接口,讓開發者在開發項目時能夠擺脫C/C++(注:Unity3D本身是用C/C++寫的)的束縛,這其實是變相降低了游戲開發的門檻,吸引了很多獨立開發者和游戲制作愛好者。

What? Mono提供的腳本機制

首先一個問題:Mono是什麼?

Mono是一個由Xamarin公司贊助的開源項目。它基於通用語言架構(Common Language Infrastructure ,縮寫為CLI)和C#的ECMA 標准(Ecma-335、Ecam-334),提供了微軟的.Net框架的另一種實現。與微軟的.Net框架不同的是,Mono具備了跨平台的能力,也就是說它不僅能運行在Windows系統上,而且還可以運行在Mac OSX、Linux甚至是一些游戲平台上。

所以把Mono作為跨平台的方案是一個不錯的選擇。但Mono又是如何提供這種腳本功能的呢?

如果需要利用Mono為應用開發提供腳本功能,那麼其中一個前提就是需要將Mono的運行時嵌入到應用中,因為只有這樣才有可能使托管代碼和腳本能夠在原生應用中使用。我們可以發現,將Mono運行時嵌入應用中是多麼的重要。但在討論如何將Mono運行時嵌入原生應用中去之前,我們首先要搞清楚Mono是如何提供腳本功能的,以及Mono提供的到底是怎樣的腳本機制。

Mono和腳本

本小節將會討論如何利用Mono來提高我們的開發效率以及拓展性而無需將已經寫好的C/C++代碼重新用C#寫一遍,也就是Mono是如何提供腳本功能的。

使用一種編程語言開發游戲是比較常見的一種情況。因而游戲開發者往往需要在高效率的低級語言和低效率的高級語言之間抉擇。例如一個用C/C++開發的應用的結構如下圖:

可以看到低級語言和硬件打交道的方式更加直接,所以其效率更高。

可以看到高級語言並沒有和硬件直接打交道,所以效率較低。

如果以速度作為衡量語言的標准,那麼語言從低級到高級的大體排名如下:

  • 匯編語言;
  • C/C++,編譯型靜態不安全語言;
  • C#、Java,編譯型靜態安全語言;
  • Python, Perl, JavaScript,解釋型動態安全語言。

開發者在選擇適合自己的開發語言時,的確面臨著很多現實的問題。

高級語言對開發者而言效率更高,也更加容易掌握,但高級語言並不具備低級語言的那種運行速度,甚至對硬件的要求更高,這在某種程度上的確也決定了一個項目到底是成功還是失敗。

因此,如何平衡兩者,或者說如何融合兩者的優點,便變得十分重要和迫切。腳本機制便在此時應運而生。游戲引擎由富有經驗的開發人員使用C/C++開發,而一些具體項目中功能的實現,例如UI、交互等等則使用高級語言開發。

通過使用高級腳本語言,開發者便融合了低級語言和高級語言的優點。同時提高了開發效率,如同第一節中所講的,引入腳本機制之後開發效率提升了,可以快速開發原型,而不必把大量的時間浪費在C/C++上。

腳本語言同時提供了安全的開發沙盒模式,也就是說開發者無需擔心C/C++引擎中的具體實現細節,也無需關注例如資源管理和內存管理這些事情的細節,這在很大程度上簡化了應用的開發流程。

而Mono則提供了這種腳本機制實現的可能性。即允許開發者使用JIT編譯的代碼作為腳本語言為他們的應用提供拓展。

目前很多腳本語言趨向於選擇解釋型語言,例如cocos2d-js使用的JavaScript,因此效率無法與原生代碼相比。而Mono則提供了一種將腳本語言通過JIT編譯為原生代碼的方式,提高了腳本語言的效率。例如,Mono提供了一個原生代碼生成器,可以提高應用的運行效率。它同時提供了很多方便的調用原生代碼的接口。

在為一個應用提供腳本機制時,往往需要和低級語言交互。這便不得不提到將Mono的運行時嵌入到應用中的必要性了。那麼接下來,我將會討論一下如何將Mono運行時嵌入到應用中。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-07/120651p2.htm

Copyright © Linux教程網 All Rights Reserved