昨天有位同事跟我说,我们的手游客户端(cocos2d-x lua binding)代码没有看到lua的特殊技巧,用起来跟其他语言差不多。《Programming in lua》毕竟有将近400多页,他想知道lua的语言特性都用在哪了。当其时回答不上来,现在来思考一下。

要解答他的疑问首先要解答的却是另外两个问题:

1.为什么我们的项目选用了lua?

lua官网是这样介绍lua的:fast, portable, embeddable, powerful(but simple), small, free。这些是选择lua的一部分原因,特别是fast和small,而另一个重要的原因是游戏版本迭代快,lua脚本更新方便。我想这也是cocos2dx官方提供了lua绑定的原因。

而结合到项目组本身的情况,由于客户端的同事之前都是页游出身,使用as3多,接触c++少,都是新学的话,lua的学习成本比c++低。

2.lua有什么语言特性?

自动gc,使用动态类型,function作为first-class value,闭包,万能的table,协程,和c/c++简洁的交互接口。暂时想到这么多,其中前四个比较常见,一般的动态语言都会有,这里的“特性”是相对于c++之类的静态语言而言。

结合项目逐个来看:

自动gc自然是无条件用上了,要考虑的是gc的时机,默认情况下lua是分步gc,而我们选择了在每一帧执行一次完整的gc流程。为什么这样做我倒是没有去问主程,可能是对手机来说内存比较珍贵,例如iphone过了200M就立马kill进程。

动态类型同样也是无条件用上,功效最明显的就是声明变量不需要写冗长的类型了,但有些时候你会发现,写的时候很爽,但看的时候就坑了,所以我的lua代码注释比c/c++多得多。

function作为第一类值,实际上lua的funcion就是没有绑定upvalue的闭包,所以其实是闭包作为第一类值。设置闭包作为回调很是简单明了:

btn.onClick(function () textField.setText(txt))

而c++大概会写出这样的东西:

void SetText(UITextField *text_field, std::string &txt) {
text_field->setText(txt);
}
btn->onClick(std::bind(SetText, text_field, txt))

而且这是c++11的写法,更不用说那繁琐的函数类了。

万能的table。lua的table的实现是一个哈希表,可以用除了nil之外的任何值作key,以及用任何值作value。由此可以模拟c/c++的struct,实际上table就是lua自定义数据结构的机制。另外table具有数组部分和散列表两部分,所以通常无需自己去实现数组。

table自然是大量在项目中使用,但的确metatable以及弱表少有用到。

协程是一样好东西,但项目没有用到过。

c/c++简洁的交互接口,最明显的例子就是协议包的打包及发送,都是调用c模块。cocos2dx使用了tolua++,但显然tolua++用的也是lua.h里的接口。

总的来说,作为应用层的开发者,的确不需要用到lua里太过高深的东西,但这实际上就是lua的优势,也达到了项目组原先的目标——让初学者能快速工作。另一方便,如果想看高深的东西,直接去看底层啊,看一看lua源码的实现,看一看lua层设置的回调c++是怎么保持的。

反正,一个程序员的能力并不体现在使用复杂的语言。

项目用到了lua的哪些部分的更多相关文章

  1. [QuickX]xcode运行Quick-cocos2d-x项目时自动更新lua资源文件

    1.项目设置 build settings ->build options ->Scan all source files and Includes = YES 2.加入script (1 ...

  2. 项目记录22-- tolua基于lua框架事件派发

     每天晚上抽点时间写一点点就一点点,曾经不写博客可是如今.不为别的仅仅是为了告诉别人我还存在.         这几天在地铁上发现好多人都还在玩消除游戏,今天起码看到5个人,可是玩的版本号都不一样.看 ...

  3. lua学习项目笔记

    这几天草草的浏览了一下电子版的<lua程序设计>,没有懂的地方就自动忽略了,挑拣了一些可以理解的部分一直在推进.推进至后面的时候已经浑浑噩噩的了,有种想看完这本书的强迫症的感觉.推进CAP ...

  4. cocos2dx 3.1.1移植安卓apk (lua交叉编译器项目 mac环境)

    cocos2dx 3.1.1   lua项目安卓交叉编译 mac环境 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new t ...

  5. cocos2dx 3.1.1移植安卓apk (lua项目交叉编译 mac环境下)

    cocos2dx 3.1.1 lua项目安卓交叉编译 mac环境下 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new te ...

  6. java翻译lua+c+openssl签名项目

    原来项目中用openresty nginx+lua实现server,lua调用c动态链接库,来使用openss做签名,并生成130字节(128签名+2位自定义字节)长度的文件. nginx: loca ...

  7. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. 用Nginx+Lua(OpenResty)开发高性能Web应用

    在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...

  9. 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)

    Lua作为一款轻量级的脚本语言,由标准C编写而成,可被C/C++调用,也可调用C/C++的函数. 在目前的脚本引擎中,Lua的速度是最快的... Lua可直接在EditPlus文本处理器上开发,只需搭 ...

随机推荐

  1. hibernate中session

    hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果 ...

  2. <转>struts2中Convention中的basePackage与locators配置种种

    用了Convention插件来实现所谓的0配置, 1. struts.convention.package.locators.basePackage=com.ZTest.web.action 这个属性 ...

  3. 在非MFC程序中引用CString

    CString在当今软件设计界里还是小有名气的,说它是MFC中使用的最多的类一点也不过,然而在使用sdk编windows程序的时候,确不能利用CString类,只能用sdk的运行时库,比如strlen ...

  4. seek和tell的用法--获取文件内容大小(字节)

    /*获取文件中存取的数据内容的大小(字节数) ellg() 和 tellp() 这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get ...

  5. 基于http.sys来开发的,真的是非常稳定

    真正的WEB服务器是不会用Indy写的.因为它是基于每连接每线程的. 其实真正的服务器需要下很多功夫,无法快速开发的.比如说,字符串处理.玩服务器基本上就是玩内存.举个例子: var str:Ansi ...

  6. Java web 项目搭建

    Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...

  7. Android应用启动画面

    原文地址: [Android]应用启动画面 - 空客的日志 - 网易博客 http://blog.163.com/da7_1@126/blog/static/104072678201291921028 ...

  8. SGU 101 修改

    感谢这里. test4确实是个不连通的case,奇怪的是我用check函数跟if (check() == false)来判断这个case,当不连通时就死循环,得到的结果是不一样的,前者得到WA,后者得 ...

  9. Extension Method[上篇]

    在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object i ...

  10. chrome插件background.js 和 popup.js 交互

    要实现background.js 和 popup.js 之间的交互,首先需要先配置好 manifest.json文件,如: "background":{ //"page& ...