项目用到了lua的哪些部分
昨天有位同事跟我说,我们的手游客户端(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的哪些部分的更多相关文章
- [QuickX]xcode运行Quick-cocos2d-x项目时自动更新lua资源文件
1.项目设置 build settings ->build options ->Scan all source files and Includes = YES 2.加入script (1 ...
- 项目记录22-- tolua基于lua框架事件派发
每天晚上抽点时间写一点点就一点点,曾经不写博客可是如今.不为别的仅仅是为了告诉别人我还存在. 这几天在地铁上发现好多人都还在玩消除游戏,今天起码看到5个人,可是玩的版本号都不一样.看 ...
- lua学习项目笔记
这几天草草的浏览了一下电子版的<lua程序设计>,没有懂的地方就自动忽略了,挑拣了一些可以理解的部分一直在推进.推进至后面的时候已经浑浑噩噩的了,有种想看完这本书的强迫症的感觉.推进CAP ...
- cocos2dx 3.1.1移植安卓apk (lua交叉编译器项目 mac环境)
cocos2dx 3.1.1 lua项目安卓交叉编译 mac环境 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new t ...
- cocos2dx 3.1.1移植安卓apk (lua项目交叉编译 mac环境下)
cocos2dx 3.1.1 lua项目安卓交叉编译 mac环境下 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new te ...
- java翻译lua+c+openssl签名项目
原来项目中用openresty nginx+lua实现server,lua调用c动态链接库,来使用openss做签名,并生成130字节(128签名+2位自定义字节)长度的文件. nginx: loca ...
- 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 用Nginx+Lua(OpenResty)开发高性能Web应用
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...
- 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)
Lua作为一款轻量级的脚本语言,由标准C编写而成,可被C/C++调用,也可调用C/C++的函数. 在目前的脚本引擎中,Lua的速度是最快的... Lua可直接在EditPlus文本处理器上开发,只需搭 ...
随机推荐
- [BEC][hujiang] Lesson04 Unit1:Working life ---Reading + Listening &Grammar & Speaking
4 1.1 Working life P10 Reading----The anonymous CV Exercise 3 What should be included in the CV ...
- 【leetcode】Longest Common Prefix (easy)
Write a function to find the longest common prefix string amongst an array of strings. 思路:找最长公共前缀 常规 ...
- android 安全需要关注
1.通过签名校验保护,能有效避免应用被二次打包,杜绝盗版应用的产生2.对内存数据进行变换处理和动态跟踪,有效防止数据被获取和修改3.对代码进行加密压缩,可防止破解者还原真实代码逻辑,避免被复制4.多重 ...
- QxtFlowView(libqxt)
https://github.com/mnutt/libqxt/tree/master/examples http://libqxt.bitbucket.org/doc/0.5/class_qxt_f ...
- MySQL 5.6 安装配置
mysql 5.6.17下载安装图解_百度经验 http://jingyan.baidu.com/article/4b07be3c67853c48b380f311.html windows 8 系统将 ...
- Firefox Security Toolkit 安装
目的: 下载Firefox Security Toolkit加载到浏览器里,增强渗透测试的工具利用. 兼容性: 目前仅支持Linux/Unix环境(可在kali上安装使用). 下载安装: wget h ...
- Foreman--管理PuppetClient
一. 环境: 1. server: puppetmaster+activemq+foreman1.3 server1.xxx.com(10.8.1.201) 2. client: fedora 19 ...
- TextView设置样式的3种方式
1,直接在<TextView>中设置 <TextView android:id="@+id/tv_badge_view_count" android:layout ...
- WinAPI——钩子函数大全2
CallNextHookEx 函数功能:该函数发送挂钩信息给当前挂钩链中的下一个挂钩处理过程,一个挂钩处理过程可在对该挂钩信息进行处理之前或之后调用本函数. 函数原形:LRESULT CallNext ...
- 食物卡喉别拍背部!救了100多万人性命的“海姆立克急救法"
先讲三个事例: 一.近日,浙江金华一个17月大的小贝边玩边吃花生,被噎住.10多分钟后,奶奶发现小贝大口喘气,以为他玩累了就抱他回家,等父母赶到送医已晚.小贝大脑受损严重-父母含泪同意放弃治疗,孩子走 ...