1. 程式人生 > >【轉】Lua 為什麼在遊戲程式設計領域被廣泛運用?

【轉】Lua 為什麼在遊戲程式設計領域被廣泛運用?

歷史方面:

《大話西遊》用的指令碼語言是微軟的JScript(JavaScript的一種方言),維護不便bug多,受系統IE版本的影響相容性差。所以2002年網易開發《大話西遊II》時,決定在客戶端內嵌別的指令碼語言。當時該專案技術負責人云風認為要挑不出名的語言,讓做外掛的人搞不懂(《大話西遊》一代被外掛《月光寶盒》搞死了),於是就選擇了Lua 4.0。

雲風在九十年代就開發遊戲引擎並建設個人網站(雲風工作室),在遊戲開發領域聲望高。網易《大話西遊II》是首個在市場上取得成功的國產網路遊戲。所以後來國內遊戲開發行業紛紛受此影響採用Lua.

技術方面:

現在,2013年,Lua和其他流行指令碼語言Python、JavaScript各分秋色:
  • 易於建立受限環境,C語言一端可以控制暴露給Lua指令碼的任何功能。我猜這也是《魔獸世界》的外掛語言選用Lua的原因。
  • 效能方面,雖然仍然比Python快,但不如V8(谷歌的JavaScript實現)。
  • 協程對於編寫並行邏輯,非常有用。而Python、JavaScript都不支援協程,只有StacklessPython、call/cc等方言支援類似功能。
  • Lua的元表很有用。不過我聽說Python也支援類似的功能。JavaScript的原型鏈則只是元表功能的十分之一左右吧。
  • Lua支援弱引用。對於上層邏輯用處不大。但對於底層引擎管理資源,超級有用。JavaScript不支援弱引用;Python支援。
  • Lua有個非官方實現,Luajit,效能不錯。
但是回到2002年,Lua和JScript相比,優勢很大。
  • 與C/C++互動方便。Lua的C API簡潔正交,而JScript的COM介面臃腫繁雜。
  • 高效能。Lua虛擬機器實現簡單高效,比起JScript,又快又省記憶體。
  • 開源。雲風為了防外掛,後來修改了《大話西遊II》的Lua位元組碼格式,讓官方的Lua虛擬機器無法相容《大話西遊II》的Lua位元組碼。如果採用不開源的JScript,就不可能自己修改虛擬機器和編譯器了。

不過很遺憾,《大話西遊II》的Lua 4.0並不支援協程。

------------------------------------------------------------------------

最後我想說,開發遊戲並不一定要指令碼語言。C/C++這類低階語言寫邏輯太不方便,指令碼語言能彌補這個缺陷。但如果你的專案主要語言不是C/C++,而是D、Java、Scala、Haskell、Go、C#、F#等效能接近C/C++的高階語言

,那麼你就不需要額外的指令碼語言。王垠寫過什麼是“指令碼語言”,和我的看法基本相同。

當然還有Haxe這種既可以編譯成指令碼語言,也可以編譯成C++的古怪語言來搗蛋。