摘抄(lua)

lua腳本是如何應用到遊戲引擎中的?

簡單來說,就是把一些經常改動的代碼用腳本實現。

/////////////


首先得有這樣的需求,希望將經常變動的邏輯(或者說由策劃編寫的邏輯)在一定的C++框架下可以通過腳本簡單快速的拼出來,並且頻繁修改,不需要重新編譯出包就能快速更新,這裏包含了兩個需求:
頻繁變更的邏輯,不希望頻繁重新編譯整個遊戲
有固定的框架約束,腳本拼裝簡單到通過工具甚至腳本策劃自己就能寫完

其次,整個產品組認可這種開發模式,有適合的人做C++框架定接口、做編輯器、寫腳本,能接受引入腳本帶來的性能略有降低以及調試不便等副作用。

另外,Lua腳本由於其作爲配置型腳本的出生,很適合用來作爲配置文件或者定義文件(比如各種編輯器生成的數據文件),再往前走一步,連策劃數據(通常在Excel中編輯的那些,如果沒有專門的邏輯編輯器的話)都可以全部導出成Lua腳本,無論讀寫都很靈活,同時還保持了純文本的可檢查性。


https://www.zhihu.com/question/24387207/answer/27659369
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Lua 爲什麼在遊戲編程領域被廣泛運用?

歷史方面:
《大話西遊》用的腳本語言是微軟的JScript(JavaScript的一種方言),維護不便bug多,受系統IE版本的影響兼容性差。所以2002年網易開發《大話西遊II》時,決定在客戶端內嵌別的腳本語言。當時該項目技術負責人云風認爲要挑不出名的語言,讓做外掛的人搞不懂(《大話西遊》一代被外掛《月光寶盒》搞死了),於是就選擇了Lua 4.0。
雲風在九十年代就開發遊戲引擎並建設個人網站(雲風工作室),在遊戲開發領域聲望高。網易《大話西遊II》是首個在市場上取得成功的國產網絡遊戲。所以後來國內遊戲開發行業紛紛受此影響採用Lua
......

最後我想說,開發遊戲並不一定要腳本語言。C/C++這類低級語言寫邏輯太不方便,腳本語言能彌補這個缺陷。但如果你的項目主要語言不是C/C++,而是D、Java、Scala、Haskell、Go、C#、F#等性能接近C/C++的高級語言,那麼你就不需要額外的腳本語言。王垠寫過什麼是“腳本語言”,和我的看法基本相同。
當然還有Haxe這種既可以編譯成腳本語言,也可以編譯成C++的古怪語言來搗蛋。

https://www.zhihu.com/question/21717567/answer/19099371
///////////////////////


Language are accepted and evolved by a social process, not a technical or technological one. Successful languages must have modest or minimal computer resource request.

https://www.zhihu.com/question/21717567/answer/19156327
/////////////////////////

先放一張源碼行數對比表:



放心,我不是來說Lua有多麼簡潔多麼美妙,問題不在這裏。問題是:爲什麼Lua這麼短?
任何一種程序,它所包含的邏輯功能大致和源碼規模是相關的。任何一種實用性的語言都不可能比Lua的源碼規模更小,而且未來Lua也不會變大很多,原因是——Lua嚴格限制了自己要解決的問題,從而把語言特性限制在一個非常有限的範圍之內。

https://www.zhihu.com/question/21717567/answer/229327361

//////////////////////////////////////////////////////

找不到lua_open
        使用lua5.2發現編譯器找不到lua_open函數,最後發現這個函數在5.2中已經被遺棄,被新的函數luaL_newstate和lua_newstate替代。lua_newstate可自定義內存分配函數,luaL_newstate使用默認的內存分配方式。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  1. #ifdef lua5.1  
  2. //5.1 下直接使用luaL_register 就好  
  3.     luaL_register(L, "libname", funcs);  
  4. #else //lua5.2  
  5.     lua_newtable(L);   
  6.     //先把一個table壓入VS,然後在調用luaL_setfuncs就會把所以的func存到table中  
  7.     //注意不像luaL_register這個table是個無名table,可以在的使用只用一個變量來存入這個table。  
  8.     //e.g local clib = require "libname". 這樣就不會污染全局環境。比luaL_register更好。  
  9.     luaL_setfuncs(L, funcs, 0);  
  10. #endif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章