Lua 为什么在游戏编程领域被广泛运用?
来源:互联网 发布:崩坏学园3外传知返 编辑:程序博客网 时间:2024/05/22 13:23
历史方面:
《大话西游》用的脚本语言是微软的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,性能不错。
- 与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++的高级语言,那么你就不需要额外的脚本语言。
王垠写过什么是“脚本语言”,和我的看法基本相同。
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 的一个重要因素。
以前一直听别人说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语言
------------------------
是因为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做。所以很多特性显得不那么重要,有三大结构用,能传递返回参数就成。如果嵌一个脚本机到程序里来有那么多麻烦,估计他们会自己写套命令脚本。游戏领域的核心功能往往用C++等语言编写,为了满足游戏活动中的各种功能组合,需要的是一个比C++这种语言简单的,轻量级的,容易学习和使用的,性能又不错的语言。 最好是业界有大量产品使用,得到了实际验证。
Lua 的特点:* 可以很方便的和用C/C++编写的游戏逻辑互相调用* 很简单,不涉及任何复杂的编程概念,麻雀虽小五脏俱全,基本的编程需要全都满足了* 轻量级,库体积很小,只有几百K。* 学习很容易,甚至策划都学会了编写脚本* 性能好, 消耗的计算机资源不多
* 已经有很多游戏产品使用Lua * 大话西游2 * 魔兽世界Wow * 剑侠情缘3
* 除了游戏,也有其它软件使用Lua * Adobe Lightroom
还常见于各种游戏外挂里
```
小弟不是搞游戏的,不过我确实用了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">
- Lua 为什么在游戏编程领域被广泛运用?
- Lua 为什么在游戏编程领域被广泛运用?
- 51.Scala中链式调用风格的实现代码实战及其在Spark编程中的广泛运用
- android手机应用在物联网领域的广泛应用
- 漫谈C#编程语言在游戏领域的应用
- 漫谈C#编程语言在游戏领域的应用
- 漫谈C#编程语言在游戏领域的应用
- 为什么Docker没有在生产环境取得广泛成功
- 第51讲:Scala中链式调用风格的实现代码实战及其在Spark编程中的广泛运用学习笔记
- Scala深入浅出进阶经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark编程中的广泛运用
- js语言能够更好的被广泛运用吗
- 运用在公共安全领域的WiFi探针
- 为什么面向对象的编程会在软件开发领域造成如此震憾的影响?
- MySQL被广泛应用在Web应用程序
- 堆 在游戏中的运用
- 关于java桌面应用程序在现在的领域中有何广泛的前景?
- lua在游戏中的使用
- 漫谈 C# 在游戏领域的应用
- Java复习笔记——Map运用(检测Random特性,多维集合,二叉树实现)
- I
- Oracle排序取第一条
- 3346--数据结构实验之二叉树五:层序遍历
- malloc、calloc、realloc的区别
- Lua 为什么在游戏编程领域被广泛运用?
- js 模拟get获取数据
- H5 FormData对象的作用及用法
- Oracle 分区索引
- equals和==理解
- 欢迎使用CSDN-markdown编辑器
- kindeditor上传目录不存在问题解决方法
- Android视频录制命令screenrecord
- POJ