Lua 为什么在游戏编程领域被广泛运用?

来源:互联网 发布:a5淘宝客 编辑:程序博客网 时间:2024/05/22 15:33


历史方面:

《大话西游》用的脚本语言是微软的JScript(JavaScript的一种方言),维护不便bug多,受系统IE版本的影响兼容性差。所以2002年网易开发《大话西游II》时,决定在客户端内嵌别的脚本语言。当时该项目技术负责人云风认为要挑不出名的语言,让做外挂的人搞不懂(《大话西游》一代被外挂《月光宝盒》搞死了),于是就选择了Lua 4.0。

云风在九十年代就开发游戏引擎并建设个人网站(云风工作室),在游戏开发领域声望高。网易《大话西游II》是首个在市场上取得成功的国产网络游戏。所以后来国内游戏开发行业纷纷受此影响采用Lua.

技术方面:

现在,2013年,Lua和其他流行脚本语言Python、JavaScript各分秋色:
  • 语言规范精简、运行时库小。其创始人称Lua是穿过针孔的语言(Passing a Language through the Eye of a Needle),他加入的任何语言特性都能用C API简单的调用。
  • 易于创建受限环境,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++的古怪语言来捣蛋。
编辑于 2013-10-03

Lua 被运用的领域远不止游戏。我的感觉是:游戏是一个更容易被大多数人认识到的领域。比如说 Adobe Photoshop Lightroom 的 40% - 60% 由 Lua 写成。版本 3.0 之后几乎没有新的 non-Lua 代码加入。但是大多数非专业人士连 Lightroom 这个名字都没有听到过。所以说,Lua 在游戏领域被广泛运用只是 Lua 被所有领域广泛应用的显现。

Lua 能得到广泛应用,是因为它完全符合 Richard Gabriel 关于软件如何能得到认可的理论。
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.

我曾经给 Lua 克服的问题起了一个名字:集成污染。我认为这也是 Richard Gabriel 提到了 socially acceptance 的一个重要因素。
发布于 2013-10-02
Lua 虚拟机小,嵌入方便,而且效率较高,语言也有很好的设计(个人认为比 JavaScript 好)
发布于 2013-09-28
自己用VC2008和Lua写的一个游戏框架,结构应该说比较美观吧,相信不会让大家失望,下载地址为:
百度网盘:http://pan.baidu.com/s/1sjILNrR
GitHub:GitHub - LikeUSummer/GamePainter: A repository to store my game framework
也许下面的回答还是不能说清楚lua到底哪点好,哪点适合游戏制作,但是下载查看这个具体的程序后相信会慢慢喜欢它的*_^
<img data-rawheight="658" data-rawwidth="1013" src="https://pic2.zhimg.com/88a91ac03a3ac0c096d1fd55ce952401_b.jpg" class="origin_image zh-lightbox-thumb" width="1013" data-original="https://pic2.zhimg.com/88a91ac03a3ac0c096d1fd55ce952401_r.jpg">
以前一直听别人说lua在游戏领域如何流行,但是在网上搜索许多,也只是见到一些文章介绍,于是最终决定自己来写一个,宿主引擎和脚本框架都从零开始写,在构思和动手制作了几个月后,终于完成了这个完整框架,相信下载使用的同学一定会对这个引擎,以及我已编写好的部分Lua框架模块感到满意,当然如有不足之处也只管指出哈。
这个框架的宿主程序(引擎)是用VC2008开发的,运行效率较高(极限测试可装载几百兆大地图,上百活动游戏对象等),这个宿主程序负责绘图,声音,操作消息传递等基本内容,并向lua提供接口,参数简单,函数名好记;而游戏的上层实现则全部由lua脚本完成;
对windows开发熟悉的同学肯定都知道MFC库对winAPI完善的封装,使得窗口编程中许多重复的事情不必再亲自去处理,根据共性和不同点从基类往下派生,使得结构很清晰,代码重用性很高;这里正是借鉴了这一思路,先总结游戏程序的共性,从逻辑上把游戏划分成若干模块,确定框架,再充分利用lua的表结构,模拟派生和继承等面向对象特性,然后把诸如地图,角色,怪物,动画,界面控件等写成lua模块,通过约定一些同名接口来规范协调一些有关联的模块,方便世界管理器统一管理(world.lua),这样在制作不同游戏时只需要通过搭配已有模块和派生一些新模块或写新模块,即可完成一个确定的新游戏,当然我还会不断更新lua框架模块,而大家如有新作品也欢迎分享出来哦
这是框架使用截图:
<img data-rawheight="489" data-rawwidth="700" src="https://pic3.zhimg.com/61eaab144cf0c593e406ade93895622a_b.jpg" class="origin_image zh-lightbox-thumb" width="700" data-original="https://pic3.zhimg.com/61eaab144cf0c593e406ade93895622a_r.jpg">这是用它做的游戏与小应用截图:这是用它做的游戏与小应用截图:
<img data-rawheight="650" data-rawwidth="1006" src="https://pic4.zhimg.com/428f3afa24a4e0af7568afbf1374af03_b.jpg" class="origin_image zh-lightbox-thumb" width="1006" data-original="https://pic4.zhimg.com/428f3afa24a4e0af7568afbf1374af03_r.jpg"><img data-rawheight="658" data-rawwidth="1013" src="https://pic2.zhimg.com/88a91ac03a3ac0c096d1fd55ce952401_b.jpg" class="origin_image zh-lightbox-thumb" width="1013" data-original="https://pic2.zhimg.com/88a91ac03a3ac0c096d1fd55ce952401_r.jpg">下面这个是一个网络搜索实验:下面这个是一个网络搜索实验:
<img data-rawheight="400" data-rawwidth="580" src="https://pic3.zhimg.com/af65baaa34e9bdb289191f11fdca846a_b.png" class="origin_image zh-lightbox-thumb" width="580" data-original="https://pic3.zhimg.com/af65baaa34e9bdb289191f11fdca846a_r.png">
下面是一个信息浏览工具:
<img data-rawheight="750" data-rawwidth="1288" src="https://pic3.zhimg.com/0d1c538c3786e9d44d6aae0a2c25d066_b.png" class="origin_image zh-lightbox-thumb" width="1288" data-original="https://pic3.zhimg.com/0d1c538c3786e9d44d6aae0a2c25d066_r.png">以上截图都是用这个框架开发的,希望大家能喜欢,也真的希望能有更多人了解并喜欢上lua语言以上截图都是用这个框架开发的,希望大家能喜欢,也真的希望能有更多人了解并喜欢上lua语言
--------------------------
最后在这里打个小广告吧,是一个原创的数学软件,类似matlab的simulink,个人编写和更新了十余版本,这是最新版,下载地址为:
pan.baidu.com/s/1eQEPWJ
欢迎有兴趣的朋友们试用,感谢您的支持哦(软件详情也可以看我在知乎的另一个回答) 2016年4月7日
编辑于 2016-07-22

是因为Lua太优秀了大家不得不用它。

我不去谈Lua一些高级特性,实际上长期以来,游戏需要的脚本,功能上要求不会太高。但是,必须方便与C/C++集成。

用过Lua的都知道,Lua无论在与C/C++数据传递,还是在封装都很方便,API非常简单。同时Lua的许可证和紧凑性(把lib编译进程序即可),都十分利于集成。这些都是Python和V8不能比的。同时,Lua编程学习难度极低。Python虽然容易学,但不简单;JavaScript学习难度不够低。

实际上,Lua进入游戏业非常早,早在1998年卢卡斯的《异域狂想曲》(Grim Fandango)中,就首次在游戏领域用到了Lua。十年之前著名的游戏博德之门、猴岛4都用了Lua。

至少从开源代码来看,云风对Lua的使用是十分重度的,比如skynet的入口是在Lua上。国内很多游戏对Lua的使用很浅,多是把一些需要经常改的运算放出来给Lua做。所以很多特性显得不那么重要,有三大结构用,能传递返回参数就成。如果嵌一个脚本机到程序里来有那么多麻烦,估计他们会自己写套命令脚本。
发布于 2014-01-10

游戏领域的核心功能往往用C++等语言编写,为了满足游戏活动中的各种功能组合,需要的是一个比C++这种语言简单的,轻量级的,容易学习和使用的,性能又不错的语言。 最好是业界有大量产品使用,得到了实际验证。

Lua 的特点:
* 可以很方便的和用C/C++编写的游戏逻辑互相调用* 很简单,不涉及任何复杂的编程概念,麻雀虽小五脏俱全,基本的编程需要全都满足了* 轻量级,库体积很小,只有几百K。* 学习很容易,甚至策划都学会了编写脚本* 性能好, 消耗的计算机资源不多
* 已经有很多游戏产品使用Lua    * 大话西游2    * 魔兽世界Wow    * 剑侠情缘3
* 除了游戏,也有其它软件使用Lua    * Adobe Lightroom
编辑于 2013-09-28
在看program in lua,第一次认真看一本英文书,不过Lua的简洁还是让我很喜欢的。我们公司另一个大型医疗软件(开发周期4年)里面也使用了lua,虽然比例不多,但是至少是游戏之外的应用。哈哈。。
发布于 2014-01-09
我不太熟悉历史。不过Lua足够轻量,API简明易懂。别的脚本语言,perl的API是一坨巨大的奇葩,python个头太大。别的脚本语言,像Tcl、JS、Lisp我都没用过。
发布于 2014-04-15
```
还常见于各种游戏外挂里
```
发布于 2016-06-06

小弟不是搞游戏的,不过我确实用了LUA,因为我在国外工作,公司里配的电脑都是英文系统,因此需要中文输入法。我使用的是谷歌拼音输入法。
由于我经常需要写技术报告,经常在开始写之前,也就是报告的最开始的两行,我经常写下日期和时间,如以下格式:
Date: 2016-October-14, Friday
Time: 10:13:45
------------------------------

那这个我后来想想,是不是让谷歌能够自动地输入当前系统的时间和日期呢?查了一下谷歌支持用户的开发扩展,但是使用的就是LUA语言。

我后来调试了一个很简短的LUA程序,在谷歌的属性设置里面,添加扩展。就可以实现上面的功能。以后在中文输入状态下,键入idt,然后空格键,则在当前的编辑器里面,自动地输入上述的三行,第一行日期,第二行是时间,第三行是一个分隔线。

代码如下。
function CurrentDateTime()
currentdate = os.date("%Y-%B-%d")
weekday = os.date("%A")
currenttime = os.date("%X")
mydt = table.concat({"\nDate: ", currentdate, ", ", weekday, "\nTime: ", currenttime, "\n------------------------------\n"}, "")
return mydt
end
ime.register_command("dt", "CurrentDateTime", "test")

在谷歌拼音输入法添加扩展的地方,如下图。
<img src="https://pic2.zhimg.com/v2-660e99ee8e0ada227f36848bc814ff5d_b.jpg" data-rawwidth="431" data-rawheight="476" class="origin_image zh-lightbox-thumb" width="431" data-original="https://pic2.zhimg.com/v2-660e99ee8e0ada227f36848bc814ff5d_r.jpg">

小弟不才,很简短的几行代码,供各位,特别是游戏编程高手一笑。不过这短短的几行代码确实解决了我的需要。

如有指点,不胜感激。

2016-Oct-14于英国
发布于 2016-10-14
游戏界的就行,不得不提魔兽世界。
发布于 2013-10-04

对于手游的话

就三个字,热更新!

须知,苹果乔布斯定下的BB规矩,弄得很多东手游都只能用 编译型的语言写

万一发现一个bug,尼玛就要重新打包,重新搞一个 安装包。

用户不爽,开发者也吐血

Lua完美解决这个问题。


可以这么说吧,未来不长的时间内,Lua在手游客户端领域的 应用的水平高低,基本直接决定了这个手游公司的水平高低!
发布于 2016-01-26
  1. 易于嵌入,这方面秒杀大部分其他的动态脚本语言
  2. 小巧,性能好
  3. 有脚本语言的大部分好处
  4. 和C/C++都容易配合使用
  5. coroutine这种并发利器适合用在游戏领域
其实我不是游戏行业的,只能揣摩下
发布于 2015-05-15

因为游戏这个行业需求变化快也变化多,经常每周都要更新版本出去.这样的话,如果使用编译型语言,开发效率慢很多.

最早发现并且引入Lua的游戏应该是WOW,其中可以使用Lua来开发插件.后来,网易也开始使用Lua来编写游戏逻辑了,见于云风的博客,基本上现在网易系的游戏都或多或少的有脚本的身影,不论是Lua还是Python.至于使用纯编译语言来开发游戏的痛苦,只有自己经历过才会知道的了,呵呵.
编辑于 2013-09-28
热更新
发布于 2016-08-09
国内用在游戏上的,必然是因为热更新,无它
编辑于 2016-04-15

体量小巧。c接口设计的很灵活。易集成,易扩展。

语言元素少,简洁,学习成本低。
字符串处理高效。 对数据结构的描述能力强。
信息密度高。适合做配置文件。
调试机制基本够用。
支持协程,闭包等简化实现的手段。开发效率高。

不足之处是缺乏编译期类型安全机制。
元数据被滥用容易引入太多语法糖。
大项目中框架设计不好的话,用起来不省心。
但这些东西都可以避免,所以总得来说还是非常优秀。
发布于 2016-02-07
说到lua,没人想到大型交换机路由器上面也在用lua实现复杂电信业务吧?
发布于 2013-10-08
除了上面那些优点,我认为还有一个很重要的因素:
lua不只是给你一个语言环境,而是给你一个语言机制,你可以在这个机制上构建你想要的东西,想面向对象,可以;想函数式编程,可以;想什么几乎都可以,而不是别人给你什么你用什么。这个特性在某些情况下是非常有力的。
编辑于 2014-07-11
把热烈奔放的巴西风情融入到游戏的每行代码中,游戏也变有趣了。
发布于 2017-01-13
阅读全文
0 0
原创粉丝点击