加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Lua系列(一)

(2018-03-22 08:58:26)
标签:

lua

热更新

分类: Lua系列
写在前面:
为什么要写lua的系列呢?因为lua作为一款脚本语言,可以嵌入到宿主程序中进行扩展。最为重要的是对于让开发移动产品的程序爸爸们,它提供了一种热更新的方案,解决了ios平台上热更新的问题(妈妈在也不用担心我的热更新啦http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif)。这篇先讲下相关的基本概念。
  • Lua是什么?
  • Lua特点?
  • Lua能做什么?
  • Lua应用的游戏?
  • Lua的版本?
  • Lua与其他语言之间相互调用原理?
一.  Lua是什么?
Lua是一个脚本语言,诞生于1993年巴西里约热内卢天主教大学的一个研究小组(看来耶稣想要在码农中发展信徒了http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif)。设计目的是为了嵌入到应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua是用标准c编写的,几乎可以在所有的系统和平台上都可以编译、运行。而且一个完整的lua解释器不过200k(想想也就是一个不负责的美术出了个不负责的图的大小),在目前的所有脚本引擎中,lua的速度是最快的,这就决定了lua是作为嵌入式脚本的最佳选择。另外lua语言支持面向对象编程和函数式编程,提供了一个通用类型的table,可以实现数组、哈希表、集合、对象的功能。lua支持协同进程机制,并提供了简单而且稳定的交互接口,比如lua和c程序可通过一个堆栈交换数据,这使得lua可以快速的和其他语言实现整合。

二.  Lua的特点?
通过以上的概念,我们总结出lua语言具备以下优点:
1.语言优美、小巧
2.性能优良、快速
3.可扩展性强

三.  Lua能做什么?
1.编辑游戏的用户界面
2.定义、存储、管理基础游戏数据
3.管理实时游戏事件
4.创建和维护开发者友好的游戏存储和载入系统
5.编写游戏的人工智能系统
6.创建功能原型,之后用高性能语言移植

四. Lua的应用?
1.魔兽世界
2.大话西哟2
3.古剑奇谭
4.仙剑奇侠传

五.  Lua的版本?

luainterface、nlua、ulua、unilua、cstolua、slua

目前用的比较多而且比较稳定的是ULua

luainterface:LuaInterface是开源的C#的lua桥接库,配合开源库luanet,能轻松实现Lua,C#相互调用和参数事件传递。但作者仅完成了windows程序的功能实现,跨平台并没有完成,作者于2013年4月30日停止更新luainterface,并推荐大家关注luainterface的一个分支Nlua。Nlua是实现跨平台的Luainterface的升级版,uLua和NLua都是基于此库升级编写

nlua:是LuaInterface的一个分支,继承了Luainterface的所有优点,并将Luanet库功能集成到代码中,实现跨平台(Windows, Linux, Mac, iOS , Android, Windows Phone 7 and 8),对ios平台做了特殊处理,如支持了委托的桥接。
配合NLua有2种Lua实现,第一种是KeraLua,基于原生Lua,将C API 进行简单的包装,使C# 可以方便使用 Lua C API,第二种是KopiLua,C#实现的Lua vm(对,和UniLua一样也是纯C#实现的Lua vm)。以下为关于两种方案的比较。
使用KeraLua,必须将lua 编译成 Unity3D Plugin,并将编译好的文件放到Plugins文件夹下相应的平台文件夹中。并定义#define USE_KERALUA
使用KopiLua,定义#define USE_KERALUA即可

ulua:基于luainterface升级版,uLua = Lua + LuaJIT + LuaInterface,全平台支持。在原生C的基础上使用LuaJit进行加速,如果uLua效率高,LuaJit有很大功劳,作者仅仅提供了uLua插件包,并未提供整套插件源码。此外,作者重写了loadfile、print等api,使用非常简单,导入package,就可以开始编写代码了。

unilua:是云风团队阿南的作品,是lua5.2的C#版,

纯C#的Lua 5.2实现,是不是感觉似曾相识,对的,KopiLua也是纯C#实现的Lua vm,虽然Unilua出名,但是没有KopiLua的配套库好用,其自身同的Ffi库,是实验性质的库,不完善,作者不推荐使用,虽然作者在其商业项目中使用,但是这只是其中一部分代码,Unilua和C#中间层的代码作者并没有开源。UniLua仅仅提供了Lua原生的接口,如果要在Lua代码中调用C#,使用就需要把Luanet 移植到Unilua代码中,总的来说很蛋疼,据推测Unilua方法都是使用Lua标准的命名方式,所以将luanet源码中所有C接口全部手动改写成Unilua 的接口,就可以使用,这个工作量,等闲的时候把玩比较好。

cstolua:cstolua是作者对ulua的扩展,提高了效率

slua:也是从ulua扩展而来,官方说效率比cstolua还高


六.  Lua与其它语言的调用?

1. 首先我们先来说下Lua的堆栈,这就是lua语言和其他语言交互的实质,在lua中,存在一个无处不在的虚拟栈,而栈的特点是先进后出,Lua堆栈是一种索引可以是正数或者负数的结构,正数索引1永远表示栈底,负数索引-1永远表示栈顶。所以在不知道栈大小的情况下,可以通过索引-1来获取栈顶元素,通过1来获取栈底元素。

2. 因为平时用的都是Unity,所以我们来看c#是如何和lua进行交互的,目前c#与lua的交互已经有了很好的解决方案,我们就介绍下LuaInterface这个开源项目:
LuaInterface的核心就是c#通过PInvoke对 Lua c库的调用的封装,所以在Unity中,LuaInterface就是c#与Lua进行交互的接口,其中LuaInterface.Lua是CLR(Common Language Runtime)访问lua解释器的主要接口,一个LuaInterace.Lua类就代表了一个Lua解释器(Lua执行环境),Lua解释器可以同时存在多个,且他们之间相互独立存在。

上面我们提到的快速和稳定的ULUA就是基于luainterface的升级版,Ulua = Lua +LuaJIt +LuaInterface,
Ulua在原生c的基础上使用luaJIT进行加速,Ulua的高效率,LuaJIT功不可没。

3.总结要点:

如果一个C#方法要被Lua调用,则首先要将其注册到Lua虚拟机中(LuaState.RegisterFunction)。之后,在Lua中就可以通过注册的名称来调用这个C#方法。

如果C#要调用Lua中的函数,则

(1)首先要在Lua虚拟机中加载该函数(LuaState.DoFile)。

(2)拿到目标函数(LuaState.GetFunction)。  

(3)执行目标函数(LuaFunction.Call)。    


下一节,我们将通过一个实例阐释c#与lua之间的调用。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有