摘要:分析并總結了腳本語言的優勢與缺點,分析了腳本語言在游戲開發中的應用,介紹了Python、Lua、等語言特點,總結了Python、Lua等語言在游戲開發方面的應用,指出了腳本語言在未來游戲開發中的趨勢。
關鍵詞:游戲開發;腳本語言
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)15-20ppp-0c
The Research of Game Scripting Language
ZHOU Cheng,CHEN Dai-Jin
(Guangzhou Kangda Vocational Technical College,Guangzhou 511363,China)
Abstract:Analyzed and summarized the scripting language superiority and the shortcoming, has analyzed the application of scripting language in the game development, introduced the feature of Python、Lua and so on, summarized the application of Python、Lua and so on in the game development, had pointed out the tendency ofscript language in the game development.
Key words:The game development;Scriptinglanguage
1 前言
隨著游戲項目規模的不斷擴大,游戲內容越來越豐富,需要編輯的東西越來越多,對數據驅動的要求也就越來越高,傳統的編譯型語言C/C++已無法滿足開發者對于語言靈活性,易用性,動態編譯的需求[5]。游戲開發趨向于將腳本語言和C/C++等語言結合起來。作為底層的游戲引擎大部分使用匯編語言、C/C++等語言來開發,而游戲本身卻用高級腳本語言來編寫,例如Quake3和Unreal等。目前,國內大多數流行游戲如騰訊的《QQgame》和搜狐的《天龍八部》等也都使用了腳本語言。另外,無論是商業的Unreal引擎還是開源的OGRE還提供了腳本接口。在游戲開發領域,比較流行的腳本包括Python、Lua、ruby和Erlang等,其中Python和Lua是網絡游戲開發的中堅力量。
2 腳本語言的優勢
1)語法簡單、易懂。腳本語言中抽象符號和古怪的語法和縮寫詞相對較少,編寫和維護容易,其結果是測試、調試和修改也變得容易。
2)動態數據類型檢查。變量不需要預先定義其類型,系統會在運行時自動檢查變量的類型。對于變量采用“后期綁定”的方式,并不像C等語言在編譯時就分配內存,而是在變量被引用時才被創建。
3)自動進行垃圾收集和內存分配。據CERT(the Computer Emergency Response Team)報告稱,軟件中80%的漏洞都是由緩沖區溢出產生的。腳本語言沒有指針,在運行時自動處理垃圾收集和內存分配,這樣可以就使得緩沖區溢出難以發生。
4)較少編程時間。如果一個軟件使用腳本語言編寫,那它花的時間要比Java縮短3倍,比C++縮短5倍[1]。這樣可以節省編程人員的時間。
5)可移植性強。腳本語言與處理器、操作系統的平臺無關,當腳本語言編寫的程序移植到不同的平臺時,只要改變它的解釋器,其它任何事情都不需要做。
6)擴展性強。腳本語言都非常容易地與C、C++、Java整合。腳本語言提供了與外界聯系的接口,其它語言的組件或庫可以擴展腳本語言功能或被腳本語言“膠”到一起。
7)模塊化,可重用性高。腳本語言支持模塊化,代碼可以被制作成容易使用的小組件。它也可以很輕松地重用到未來的項目中去。
8)其它。腳本語言都是交互式的解釋型語言,腳本程序(大部分)都可以直接解釋執行,所以在排除bug方面腳本也有先天的優勢,這使得腳本能夠更好地保證代碼質量。
3 腳本語言的缺點
雖然腳本語言有許多優勢,但它也存在許多不足。例如,雖然它能夠節省編碼的時間,但它的執行速度慢,所以它不適合開發像設備驅動程序和內核程序;源代碼解釋后的字節碼容易受到攻擊;雖然它的移植性比較好,但在一些特殊平臺上不能被有效的使用;缺乏對底層資源的控制和管理;調試器也不夠先進。
4 游戲開發中使用腳本語言
對于游戲內容的管理,游戲源代碼管理,代碼編譯,運行時腳本的編寫也都可以很方便的實現。在游戲的開發過程中,可以利用Python等腳本語言或者利用C/C++等語言獨立開發游戲。目前,一般是將腳本語言和C/C++語言結合起來,完成游戲的開發。
4.1 驅動游戲數據
游戲公司發現在可執行代碼中過多的關注游戲參數(例如:NPC的移動速度、角色的HP、MP值等)非常費時且使測試游戲變得更加難,因為任何游戲參數的變化都會導致重新編譯或重建整個游戲——從頭開始重建一個大的游戲將會要花費數小時,重新編譯或重建意味著會引入新的問題。由于腳本語言在數據驅動和動態編譯等方面的優勢,使用腳本語言來管理和處理游戲的相關參數,即使是沒有編程經驗的設計師們也可以隨意修改游戲的屬性和測試游戲,在沒有引入腳本語言之前,只有深入地了解游戲引擎才可以做到。
4.2 實現游戲引擎和游戲本身分離
由于腳本語言在GUI控制、人工智能、數據管理等方面的具有強大功能,所以,如果使用腳本語言來運行AI、處理游戲中玩家的屬性等數據,那么編寫游戲引擎的編碼人員就可以專注于游戲引擎的代碼上,從而實現游戲引擎和游戲本身進行嚴格分離。這樣用C等語言編寫的游戲引擎就可以用到多個游戲上。游戲引擎維護相對靜態狀態,而腳本語言處理游戲中的動態的數據,例如各個游戲中不同角色的屬性、游戲目標和使命。這樣有利于新游戲的開發和現有游戲版本的升級。
4.3 整合游戲中間件
在網游時代,市場競爭趨于激烈,如果延用單機時代的開發方式,那必然會被市場淘汰。在網游時代,游戲業中的主要矛盾已經由性能低下的硬件與游戲執行效率之間的矛盾轉變為快速變化的市場需要與低效的開發工具之間的矛盾[2]。網游在網絡、數據庫、圖形甚至部分邏輯等方面差異性不大。為適應這種競爭,游戲公司必然會采用大量的游戲中間件(目前比較流行的的網游中間件有Unreal等)來組合形成新網游產品。腳本語言又叫“膠”語言,它能夠較好地粘合各個游戲中間件。這樣,可以加快游戲的開發速度和質量。
5 游戲開發中常用腳本語言
5.1 Python語言
Python是一種面向對象的腳本語言。它在很早的時候就是一種游戲編程的輔助工具。在“星球之旅(Star Trek)”等超級大片中擔當特技和動畫制作的工業光魔公司(Industrial Light)就采用Python制作商業動畫。最近,Python在“自由力量”和Humungous' 后院體育系列游戲中得到應用。Pygame 是一組為編寫游戲而設計Python 模塊,Pygame 是一組為編寫游戲而設計Python 模塊,Pygame在 SDL(Simple Directmedia Library即“簡單媒體類庫”)庫的基礎上添加了許多功能。它類似于 DirectX并支持圖形硬件加速。還可以利用PyOpenGL模塊,可以非常迅速的編寫出游戲中的三維場景。Pygame具有非常好的可移植性,幾乎可以運行在任何平臺和操作系統上。因此,游戲開發人員可以利用python語言創建具有自己特色的游戲。Python通過擴展和嵌入等方式與其它語言相結合來增強它的開發能力。在Python語言中,只有極少數內置的將它與其它語言結合起來的方法。為了利用其它語言,開發人員需要開發一個包裝程序,這個包裝程序將Python中的功能參數轉化到另一個語言中,同時將返回的結果以一種Python能理解方式傳給Python。
Python語言的主要優點包括:
1)與Lua等相比,它有更多的擴展模塊。
2)語法簡單、易讀在線學習資料、案例和相關書藉相對較多。
3)與它相關的工具相對較多。
Python語言的主要缺點包括:
1)它的調試器比較古怪且速度慢,它的執行速度慢。
2)很難將Python與其它語言捆綁。
3)很多開發人員不太喜歡它對空格符敏感這一語言特點
5.2 Lua語言
Lua是一個小巧簡單、功能強大的語言,這使得Lua非常容易學習,它的完全發布版可用一張軟件裝下來。Lua有很高的執行效率,統計表明在眾多腳本語言中,Lua是平均效率最高的腳本語言[3]。Lua被設計為易于擴展的,Lua很容易與C/C++、Java,以及其它語言接口,可用其它語言代碼來擴展功能,實際上它的很多功能都是通過外部庫來擴展的。鑒于它卓越的擴展性,可以把它作為搭建領域語言的工具(如:游戲腳本)。Lua不是通過使用條件編譯來實現平臺無關的,而是完全使用ANSI(ISO)C,這樣只要是有ANSI C編譯器的系統都可以使用Lua。Lua也存在一些不足,例如學習材料和文檔非常少,自帶的功能模塊較少等。LuaSDL是Lua語言中的SDL封裝包,它類似于Python中的Pygame。
Lua在復雜游戲用戶界面控制、人工智能等方面的強大功能,使得它在游戲開發中得到重用。例如《魔獸世界》的自定義界面系統就采用了Lua,網易經典“西游系列”也使用了Lua。在游戲的開發過程中,開發人員一般將游戲引擎交由C/C++等語言完成。而在用戶界面、人工智能、游戲邏輯、動態行為等游戲中經常變動的部分交予Lua來完成。
5.3 其它語言
Ruby是一種用于迅速和簡便的面向對象編程的解釋性腳本語言。RGSS (Ruby Game Scripting System)是它的一個腳本性質的游戲編程系統。RPG Maker XP (RMXP)這款制作角色扮演類游戲開發軟件所使用的腳本語言就是Ruby。RGSS的功能有限,并不能用它完成一個完整的游戲,但隨著游戲行業對網頁游戲的看好和RoR(Ruby on Rails,即一個用于編寫網絡應用程序的框架,它基于計算機腳本語言Ruby)的流行,Ruby越來越受到重視。Erlang是用戶相對很少,但它非常適合分布式的MMOG(Massively Multiplayer Online Game)的開發。
6 總結
隨著市場對游戲的需求擴大以及網游生產組裝化,以及開發者對于語言靈活性,易用性,動態編譯的需求等,為腳本語言的發展提供了空間。但腳本語言不可能代替以C/C++為代表的其它語言。腳本語言和編譯型語言在生產效率和執行效率上各有所長,游戲的開發既需要對游戲數據驅動、游戲內容管理等方面提供很好支持的腳本語言,也要有能滿足游戲引擎快速執行特點的編譯型語言。沒有一種腳本語言適合所有類型的游戲開發,只能是根據所開發游戲的類型和特點來選擇不同的腳本語言。
參考文獻:
[1]Tom Gutschmidt.Game Programming with Python,Lua,and Ruby[M].US:Premier Press,2003.
[2]賴勇浩.游戲中的腳本語言[J].程序員:游戲創造,2007(8):16-17.
[3]Roberto Ierusalimschy.Programming in Lua[M].www.Iuachina.net,譯.2003
[4]Hal Fulton.Ruby Way[M].US:Sams Publishing,2002.
[5]封燁.游戲中的Python語言介紹[J].程序員:游戲創造,2007(8):24-26.
收稿日期:2008-03-12
作者簡介:周程(1979-),男,湖南衡山人,工程碩士,研究方向為軟件工程、游戲動畫設計;陳代進(1971-),男,湖北宜昌人,教育技術學碩士,研究方向為現代教育技術及虛擬現實技術。