
lua学习日志
文章平均质量分 85
cbbbc
这个作者很懒,什么都没留下…
展开
-
Lua非常有用的工具——递归打印表数据
摘要: 展示了Lua库table_lib.lua源码,并说明如何使用。 Lua是一种非常小巧的语言。虽小,但五脏俱全。在Lua中,我认为最最核心的数据结构就是表。表不仅可用作数组,还可以用作字典。Lua面向对象的实现也是用表实现的。表对于Lua实在是太重要了!所以,在开发与调试过程中,让表可视化是非常迫切的需求。可Lua标准库里没有递归显示表中所有数据的函数。于是,凭着对L转载 2016-12-29 17:32:59 · 1198 阅读 · 0 评论 -
深入理解Lua的闭包一:概念和应用
本文首先通过具体的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理。闭包的概念在Lua中,闭包(closure)是由一个函数和该函数会访问到的非局部变量(或者是upvalue)组成的,其中非局部变量(non-local variable)是指不是在局部作用范围内定义的一个变量,但同时又不是一个全局变量,主要应用在嵌套函数和匿名函数里,因此若一个闭包没转载 2016-03-16 19:45:26 · 432 阅读 · 0 评论 -
Lua中的闭包小结
这篇文章主要介绍了Lua中的闭包小结,本文对闭包的概念做了讲解,同时给出闭包代码示例,需要的朋友可以参考下前言在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结。希望对大家学习Lua有帮助。什么是闭包?闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体。我们再来看一段代码:function newCount转载 2016-03-16 19:39:41 · 347 阅读 · 0 评论 -
Lua中的函数(function)、可变参数、局部函数、尾递归优化等实例讲解
这篇文章主要介绍了Lua中的函数(function)、可变参数、局部函数、尾递归优化等实例讲解,需要的朋友可以参考下一、函数在Lua中,函数是作为"第一类值"(First-Class Value),这表示函数可以存储在变量中,可以通过参数传递给其他函数,或者作为函数的返回值(类比C/C++中的函数指针),这种特性使Lua具有极大的灵活性。 Lua对函数式编程提供了良好的支持,转载 2016-03-16 15:37:40 · 1555 阅读 · 0 评论 -
Lua中的metatable详解
这篇文章主要介绍了Lua中的metatable详解,本文详细讲解了metatable的作用、定义操作符行为、为 Lua 函数库提供支持等内容,需要的朋友可以参考下Lua 中 metatable 是一个普通的 table,但其主要有以下几个功能:1.定义算术操作符和关系操作符的行为2.为 Lua 函数库提供支持3.控制对 table 的访问Metatables 定义操作符行为转载 2016-03-15 20:24:23 · 3916 阅读 · 0 评论 -
lua调试器与编辑器开源项目luacode(源自decoda)
目前项目开发一直是用decoda进行调试,使用sublime编辑,本没有太大问题,都用了大半年。一直都比较忙,这段时间有空在decoda的源码基础上进行修改,就是想将调试器与编辑器融合起来,改成我期望中的理想的lua开发工具。国人写了一个luastudio,共享软件,之前试用过,很糟糕,还不如用decoda(至少能保证稳定性)。luacode主要用于解决lua调试与编辑两大问题,统一l转载 2015-09-05 10:43:32 · 603 阅读 · 0 评论 -
LUA获取utf8字符串长度
--- 获取utf8编码字符串正确长度的方法-- @param str-- @return numberfunction utfstrlen(str)local len = #str;local left = len;local cnt = 0;local arr={0,0xc0,0xe0,0xf0,0xf8,0xfc};while left ~= 0 dolo转载 2015-08-07 20:29:28 · 1347 阅读 · 0 评论 -
lua gc和weaktable
如果你对lus语言的中weak table不明白的话,那这篇文章应该对你有帮助。所有脚本语言几乎都有垃圾回收器(GC),当然lua也有。不明白GC不要紧,下面让我来解释:这一切要先从现代编程语言的鼻祖 — C语言开始。如果你在C中要使用变量,可以这样定义变量,如:void hello(){int a = 0; // 局部变量声明}局部变量a的生与死是已经确定的,就是{括号和}括转载 2015-05-01 11:02:20 · 744 阅读 · 0 评论 -
lua gc
Lua 提供了一个自动的内存管理。这就是说你不需要关心创建新对象的分配内存操作,也不需要在这些对象不再需要时的主动释放内存。 Lua 通过运行一个垃圾收集器来自动管理内存,以此一遍又一遍的回收死掉的对象(这是指 Lua 中不再访问的到的对象)占用的内存。 Lua 中所有对象都被自动管理,包括: table, userdata、 函数、线程、和字符串。Lua 实现了一个增量标记清除的收集器。它用转载 2015-05-01 11:42:18 · 611 阅读 · 0 评论 -
Tolua++技术文档
1.简介Tolua++是一个编程语言文本转换工具,主要用来将C/C++文件转化成lua需要的接口形式。即把大量的函数转成static int XXX(lua_State* tolua_S)形式,以供注册到lua里面。Tolua++通过pkg文件来导出需要的类型,函数,对象。Tolua –o test.c tarray.pkgtarray.pkg里面是对应的要导出的内容,通常是用相应转载 2015-05-01 00:22:03 · 983 阅读 · 0 评论 -
tolua++参考手册
原文地址: http://www.codenix.com/~tolua/tolua++.html 译者注:在网上貌似没有对应的tolua中文版文档,故心血来潮,翻译了第一部分:tolua使用。第一次翻译,出了很多错误。可能还潜在很多的错误,建议和原版一起阅读。如果有错误,希望各位看官指出,谢谢。 tolua++是tolua的升级版,是把C/C++和lua代码结合使用的一种转载 2015-04-30 18:18:50 · 2464 阅读 · 0 评论 -
Cocos2d-x+Lua游戏的优化总结
近期游戏准备出安卓版本,在安卓上的性能表现不佳。经过一周多的优化,在性能上取得了较大的提升。游戏采用 Cocos2d-x 3.2 + Lua 进行开发,以下将在渲染效率,CPU效率,包大小等方面进行总结。渲染效率纹理格式 – 运行效率 内存 包大小所有的图片都通过一个python脚本(调用TexturePacker的命令行工具)自动转换为RGBA4444编码的格式。然后判断转载 2015-05-08 21:10:58 · 2040 阅读 · 0 评论 -
tolua++中暴露对象给lua时,一定要把析构函数暴露给lua
题目不知道怎么取才好,但是意思很简单:如果你暴露一个复杂对象给Lua,实现类似于OO编程的话,那么也要把析构函数暴露给Lua.否则的话,lua gc的时候,回收垃圾对象,没有找到回收函数,就直接free掉了,这在C++中,是相当致命的. tolua++中的tolua_cclass函数,用来注册lua对象TOLUA_API void tolua_cclass (lua_State转载 2015-05-02 21:36:22 · 1048 阅读 · 0 评论 -
C++中malloc/free与new/delete的区别及内存分配失败错误处理
首先谈谈C/C++内存分配失败错误处理一、C语言中的malloc/calloc/realloc/valloc/alloca/memalign函数:这样的内存分配函数在内存分配失败时都返回空指针,因此,在调用返回时,检查返回值的方法比较简单,只需要与空指针比较即可;如:char* p = (char*)malloc(1204);if(p == NULL){ //e转载 2015-05-02 23:42:42 · 763 阅读 · 0 评论 -
cocos2dx-lua绑定之代码编辑器
享受脚本语言灵活、更新方便、免于编译的好处,但也不能忍受离开那些方便的IDE特性(跳转、自动完成)。搜集整理了一些使用Sublime Text编辑cocos2dx-lua工程的资料,希望能给大家带来帮助。一、自动完成(auto-completion)A.输入过的单词本文件内输入过的单词,ST(sublime text)均会给出补全提示。这点甚至比大多数IDE都要强(一般只给转载 2015-04-29 21:05:11 · 972 阅读 · 0 评论 -
lua调用C++函数崩溃时,查看lua的调用栈信息(特别适用于tolua++)
cocos2d-x这个开源引擎目前在移动开发领域挺火,我用了一阵子,非常喜欢它的lua绑定,一旦理解了其工作机制,用起来相比C++有不同的感受。 但是想要用好lua脚本,实在不是件容易的事情。要让lua绑定变得非常好用,可能依然需要大量工作。 这里记录一个很实用的技巧:在lua调用cocos2d-x的接口而导致崩溃时,无法直接看到lua的调用栈,也就无法知道目前转载 2015-04-29 16:23:30 · 2013 阅读 · 0 评论 -
tolua++实现分析
项目正在使用cocos2dx的lua绑定,绑定的方式是tolua++。对大规模使用lua代码信心不是很足,花了一些时间阅读tolua++的代码,希望对绑定实现的了解,有助于项目对lua代码的把控。从阅读结果上来看,起码在内存管理上,帮助还是很大的。1.tolua++如何将c++对象导入到lua里tolua++为每一个传入lua的对象建立一个userdata,userdata的值,是转载 2015-04-29 21:00:56 · 757 阅读 · 0 评论 -
Lua和C++交互总结
一不小心又标题党了?不好意思哈~翻看了以前的博客,发下废话太多了自己都看不下去啊,恩,以后尽量写得简洁一些。本文不涉及lua语法学习,如果有需要,请移步:http://book.luaer.cn/一.lua堆栈要理解lua和c++交互,首先要理解lua堆栈。简单来说,Lua和C/c++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。转载 2015-04-17 20:39:48 · 544 阅读 · 0 评论 -
lua编程 全局变量 环境 模块
1.全局变量与环境lua中真正存储全局变量的地方不是在_G里面,而是在setfenv(i,table)的table中,所有当前的全局变量都在这里面找,只不过在程序开始时lua会默认先设置一个变量_G=这个里面的table而已。所以在新设置环境后,如果还想找到之前的全局变量,通常需要附加上为新的table设置元表{_index=_G}下面的几个例子:a=1print(a)pr转载 2016-03-17 20:31:40 · 468 阅读 · 0 评论 -
Lua中的模块(module)和包(package)详解
这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数、写一个模块、package.loaded、module函数等内容,需要的朋友可以参考下前言从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包。require用于使用模块,module用于创建模块。简单的说,一个模块就是一转载 2016-03-17 20:40:05 · 8326 阅读 · 0 评论 -
Lua中的异常处理pcall、xpcall、debug使用实例
这篇文章主要介绍了Lua中的异常处理pcall、xpcall、debug使用实例,这3个函数是Lua中的异常处理必须用到的,需要的朋友可以参考下如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码。pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo转载 2016-03-22 12:05:07 · 9232 阅读 · 1 评论 -
Lua 调试(Debug)
Lua 提供了 debug 库用于提供创建我们自定义调速器的功能。Lua 本身并未有内置的调速器,但很多开发者共享了他们的 Lua 调速器代码。Lua 中 debug 库包含以下函数:sethook ([thread,] hook, mask [, count]):序号方法 & 用途1.debug(): 进入一个用户交互模式,运行用户输入的每个字符串转载 2017-01-03 16:55:53 · 866 阅读 · 0 评论 -
Lua脚本语言中字符匹配模式详解
你还可以在模式串中使用字符类。字符类指可以匹配一个特定字符集合内任何字符的模式项。比如,字符类 %d匹配任意数字. 所以你可以使用模式串'%d%d/%d%d/%d%d%d%d'搜索dd/mm/yyyy 格式的日期: s = "Deadline is 30/05/1999,firm" date ="%d%d/%d%d/%d%d%d%d" print(string.sub转载 2016-09-20 19:59:25 · 2240 阅读 · 0 评论 -
lua的table排序
实例:(原理就是LUA集成的冒泡算法)--排序的算法function comps(a,b)return a.id end--应用table.sort(table_name,comps);table_name 已经被修改一、数值数组排序(字符串跟数值混在一起的数组是不能sort的) local test_table = {2,1,3} table.转载 2016-07-30 12:28:04 · 614 阅读 · 0 评论 -
lua and or not 逻辑运算符
and or not逻辑运算符认为false 和nil 是假(false),其他为真,0 也是true.and 和or 的运算结果不是true 和false,而是和它的两个操作数相关。注:下面的和其他语法有区别a and b -- 如果a 为false,则返回a,否则返回ba or b -- 如果a 为true,则返回a,否则返回b例如:print(4 and 5) -转载 2016-06-22 15:14:43 · 2246 阅读 · 0 评论 -
Lua中的string库(字符串函数库)总结
Lua解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在Lua中操纵字符串的功能基本来自于string库。字符串库中的一些函数是非常简单的:string.len(s) 返回字符串s的长度;string.rep(s, n) 返回重复n次字符串s的串;你使用string.rep("a", 2^2转载 2016-03-15 11:26:19 · 945 阅读 · 0 评论 -
LUA string库详解
1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,...2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.byte(string [,pos]):返回第pos个字符的整数表示形式.如a为97.string.char(i1,i2...):i1,i2为整型,将i1,i2..等转化为对应的字符然后连接成字符转载 2016-03-15 11:18:36 · 405 阅读 · 0 评论 -
lua Date和Time
time和date两个函数在Lua中实现所有的时钟查询功能。函数time在没有参数时返回当前时钟的数值。(在许多系统中该数值是当前距离某个特定时间的秒数。)当为函数调用附加一个特殊的时间表时,该函数就是返回距该表描述的时间的数值。这样的时间表有如下的区间:yeara full yearmonth01-12day转载 2016-03-14 15:06:43 · 422 阅读 · 0 评论 -
Lua垃圾回收
Lua 通过特定算法的垃圾回收机制实现自动内存管理。由于自动内存管理机制的存在,作为程序开发人员:不需要关心对象的内存分配问题。不再使用对象时,除了将引用它的变量设为 nil,不需要主动释放对象。Lua 的垃圾回收器会不断运行去收集不再被 Lua 程序访问的对象。所有的对象,包括表、userdata、函数、线程、字符串等都由自动内存管理机制管理它们空间的分配和释放。Lua 实现了一转载 2016-03-24 11:03:20 · 1533 阅读 · 0 评论 -
Dorothy Lua开发建议
1.禁用全局变量可以在zbstudio中使用Analyze(Shift+F7)功能检查全局变量的使用。但是可以通过模块做数据的共享,但是只能共享基本数据类型包括string, number, boolean, table, 没有俘获userdata类型变量的function等,共享的table中也不能存有userdata。共享数据的模块写法如下:-- file SharedModule.l转载 2016-03-23 15:36:37 · 514 阅读 · 0 评论 -
基于 lua 的热更新系统设计要点
很久没写 blog 了,主要是忙。项目排的很紧,一个小项目上线,发现不少问题,所以把多余精力都投进去了。最后人手不够,亲自上场写代码。在不动大体的情况下,最大能力的修改了一些设计,并把能重写的代码重新写过了。这一周,写了三天半程序(其中通宵了一次)。平均每天写了千多行程序。基本上把原来项目里用的几万行东西替换下来了。重构总是能比老的设计更好,不是么? :) 不过这事不能老干,个人精力再充沛。故转载 2016-03-23 11:31:49 · 873 阅读 · 0 评论 -
Lua的文件操作自定义上传头像
先简单介绍一下被迫使用Lua的IO的情境:游戏支持玩家自定义上传头像,在排行榜中会显示玩家列表(包括本服、跨服),原有的做法是先检测CCUserDefault中是否存在指定图片的key以及它的状态。然后在下载头像、下载完成后设置对应的状态。这样导致的一个问题就是CCUserDefault的读写完全失效了。整个游戏下载的补丁包判断和其它判断就完全失效了,不得卸载游戏后重装。个人目前的推测是由转载 2016-03-22 17:15:31 · 2513 阅读 · 0 评论 -
Lua 中使用面向对象(续)--newproxy生成userdata使用__gc
上一篇文章给了一个面向对象的方案,美中不足的是没有析构函数 Destructor,那么这一次就给它加上。 既然是析构,那么就是在对象被销毁之前做该做的事情,lua 5.1 的 userdata 可以给其 metatable 增加一个 __gc 域,指定一个函数,将会在被回收时调用,这个 __gc 只能用于 userdata,普遍的 table 不支持;到了 lua 5.2 以后,官方支持了给转载 2016-03-22 23:34:13 · 2190 阅读 · 1 评论 -
lua gc 优化方案
此文章至少适合lua5.1在我的项目中,变量增减多了,就会在某轮lua gc中可能会大量调用alloc函数(特别指free,可以高达8万次当发生gc的时候,这将占用几十、几百毫秒的时间)造成cpu曲线不平滑,很容易给人卡顿的感觉解决方案有两种,一种是云风给出的多线程gc还有一种则是我正在用的,在不能修改lua引擎代码的情况(比如使用Bolt界面引擎)能很好发挥作用的方案:我称此转载 2016-03-22 23:00:56 · 3248 阅读 · 0 评论 -
编写高性能的Lua代码
前言Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏。像《魔兽世界》的插件,手机游戏《大掌门》《神曲》《迷失之地》等都是用Lua来写的逻辑。所以大部分时候我们不需要去考虑性能问题。Knuth有句名言:“过早优化是万恶之源”。其意思就是过早优化是不必要的,会浪费大量时间,而且容易导致代码混乱。所以一个好的程序员在考虑优化性能前必须问自己两个问题:“我的程序真的需要转载 2016-03-22 19:49:49 · 620 阅读 · 0 评论 -
Lua标准库 - 输入输出处理(input and output facilities)
1、io表调用方式:使用io表,io.open将返回指定文件的描述,并且所有的操作将围绕这个文件描述 io表同样提供三种预定义的文件描述io.stdin,io.stdout,io.stderr2、文件句柄直接调用方式,即使用file:XXX()函数方式进行操作,其中file为io.open()返回的文件句柄 多数I/O函数调用失败时返回nil加错误信息,有些函数成功时返回n转载 2016-03-22 17:06:09 · 1146 阅读 · 0 评论 -
调试lua代码
lua没有调试器,但是它提供了很强的调试功能(debug 库), 所以其实一些常用的调试功能都能很方便的使用,就像使用一个命令行调试器一样:-- debug.luagvar1 = 100function foo() local var2 = 10 function bar() debug.debug()转载 2016-03-22 14:13:54 · 1385 阅读 · 0 评论 -
lua的Debug库
debug库并不给你一个可用的Lua调试器,而是给你提供一些为Lua写一个调试器的方便。出于性能方面的考虑,关于这方面官方的接口是通过C API实现的。Lua中的debug库就是一种在Lua代码中直接访问这些C函数的方法。Debug库在一个debug表内声明了他所有的函数。与其他的标准库不同的是,你应该尽可能少的是有debug库。首先,debug库中的一些函数性能比较低;第二,它破坏了语言的一转载 2016-03-22 14:08:23 · 596 阅读 · 0 评论 -
Lua教程(4):Lua调用C/C++函数
读后感悟:这篇文章讲解了静态的lua调用c/c++函数,所谓静态就是先运行c/c++代码来lua_register注册函数,而不是直接把函数写入库dll或so,然后在lua中require(lib),这也是本篇文章的不够好的地方,可以从这篇文章中看到两个详细的调用,地址链接:http://blog.youkuaiyun.com/shun_fzll/article/details/39120965。而且这篇转载 2015-04-17 20:29:01 · 1097 阅读 · 0 评论 -
Lua教程(3):C/C++调用Lua的Table
读后感悟:这篇文章介绍了Lua栈的基本概念,如果想更深入了解,可以阅读更详细的资源和阅读调试lua源码。还讲了赋值和取值函数,这些函数你都可以查看手册,看看英文是如何介绍的,这里需要的注意的是lua_pushvalue、lua_remove、lua_insert函数,这些函数会改变栈顶元素或栈的位置。 lua_pushvalue:Pushes a copy of the element转载 2015-04-16 20:50:39 · 1116 阅读 · 0 评论