lua for循环

lua的table库

夙愿已清 提交于 2020-04-02 20:02:27
明天新功能就要上了,结果刚刚突然QA说项目抛出了错误。握草,吓得立马出了一身汗。 查了一下错误,发现可能是自己写的不稳定排序造成的。自己感觉应该就是。把排序方法写成稳定的之后,代码分离编译进手机,跑了一下木有错误了。脑残的自己为何要对服务器传过来的有序数据进行排序呢?脑抽不明。 下文为转的别人总结的lua库。(该学习的地方还太多) lua的table库 函数列表: table.insert(table,[ pos,] value) table.remove(table[, pos]) table.concat(table[, sep[, i[, j]]]) table.sort(table[, comp]) 1. insert 和 remove 只能用于数组元素的插入和移出, 进行插入和移出时,会将后面的元素对齐起来。 所以在 for 循环中进行 insert 和 remove 的时候要注意插入和移除时是否漏掉了某些项: local t = {1,2,3,3,5,3,6} for i,v in ipairs(t) do if v == 3 then table.remove(t,i) end end -- 错误,第四个 3 没有被移除,ipairs 内部会维护一个变量记录遍历的位置,remove 掉第三个数字 3 之后,ipairs 下一个返回的值是 5 而不是 3 local t

用好Lua+Unity,让万金6.0平台搭建性能飞起来——Lua与C#交互篇

谁说我不能喝 提交于 2020-03-24 12:22:13
前言万金6.0平台搭建论坛:haozbbs.com Q1446595067 在看了uwa之前发布的《Unity项目常见Lua解决方案性能比较》,决定动手写一篇关于lua+unity方案的性能优化文。 整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法。然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态。事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多。 因此,这篇文章是从一堆简单的优化建议里头,逐步挖掘出背后的原因。只有理解了原因,才能很清楚自己做的优化,到底是为了什么,有多大的效果。 从最早的lua纯反射调用c#,以及云风团队尝试的纯c#实现的lua虚拟机,一直发展到现在的各种luajit+c#静态lua导出方案,lua+unity才算达到了性能上实用的级别。 但即使这样,实际使用中我们会发现,比起cocos2dx时代luajit的发扬光大,现在lua+unity的性能依然存在着相当的瓶颈。仅从《性能比较》的test1就可以看到,iphone4s下二十万次position赋值就已经需要3000ms,如果是coc这样类型的游戏,不处理其他逻辑,一帧仅仅上千次位置赋值(比如数百的单位、特效和血条)就需要15ms,这显然有些偏高。 是什么导致lua

大体了解Lua的语法

穿精又带淫゛_ 提交于 2020-03-22 05:59:04
Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱。   在Lua中,一切都是变量,除了关键字。请记住这句话。 I. 首先是注释   写一个程序,总是少不了注释的。   在Lua中,你可以使用单行注释和多行注释。   单行注释中,连续两个减号 "--" 表示注释的开始,一直延续到行末为止。相当于C++语言中的"//"。   多行注释中,由 "--[[" 表示注释开始,并且一直延续到"]]"为止。这种注释相当于C语言中的"/*…*/"。在注释当中,"[["和"]]"是可以嵌套的。 II. Lua编程   经典的"Hello world"的程序总是被用来开始介绍一种语言。在Lua中,写一个这样的程序很简单:   print("Hello world")   在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。   Lua 有好几种程序控制语句,如:   条件控制:if 条件 then … elseif 条件 then … else … end   While循环:while 条件 do … end   Repeat循环:repeat … until 条件   For循环:for 变量 = 初值,终点值,步进 do … end   For循环:for 变量1,变量2,… ,变量N in表或枚举函数 do … end

Lua弱引用table

馋奶兔 提交于 2020-03-04 06:13:23
弱引用table 与python等脚本语言类似地,Lua也采用了自动内存管理(Garbage Collection),一个程序只需创建对象,而无需删除对象。通过使用垃圾收集机制,Lua会自动删除过期对象。垃圾回收机制可以将程序员从C语言中常出现的内存泄漏、引用无效指针等底层bug中解放出来。 我们知道Python的垃圾回收机制使用了引用计数算法,当指向一个对象的所有名字都失效(超出生存期或程序员显式del了)了,会将该对象占用的内存回收。但对于 循环引用 是一个特例,垃圾收集器通常无法识别,这样会导致存在循环引用的对象上的引用计数器永远不会变为零,也就没有机会被回收。 一个在python中使用循环引用的例子: class main1: def __init__(self): print('The main1 constructor is calling...') def __del__(self): print('The main1 destructor is calling....') class main2: def __init__(self, m3, m1): self.m1 = m1 self.m3 = m3 print('The main2 constructor is calling...') def __del__(self): print('The main2

Lua 笔记--迭代器与泛型for

岁酱吖の 提交于 2020-02-29 01:53:35
所谓“迭代器”就是一种可以遍历一种集合中所有元素的机制。在Lua中,通常将迭代器表示为函数。每调用一次函数,即返回集合中的“下一个”元素。 function values(t) local i = 0 return function() i = i + 1 return t[i] end end 在上例中,values就是一个工厂。每当调用这个工厂时,它就创建一个新的closure(即迭代器本身)。这closure 将它的状态保存在其外部变量t 和i 中。每当调用这个迭代器时,它就从列表t 中返回下一个值。直到最后一个元素返回后,迭代器就会返回nil,以此表示迭代的结束。 泛型for语法: for <var-list> in <exp-list> do <body> end 其中,<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式只有一个元素,即一句对迭代器工厂的调用。 for 做的第一件事是对in 后面的表达式求值。 简单示例: function values(t) local i = 0 return function() i = i + 1 return t[i] end end t = {1, 2, 3} for element in values(t) do print(element)

Lua性能优化技巧[三 关于表]

本秂侑毒 提交于 2020-01-28 00:27:18
原作者 Roberto Ierusalimschy 翻译 hillin 翻译版权所有©2011 hillinworks,转载需征得译者允许。 目录 一 前言 二 基本事实 三 关于表 四 关于字符串 五 削减、重用与回收 六 最后的提示 一般情况下,你不需要知道Lua实现表的细节,就可以使用它。实际上,Lua花了很多功夫来隐藏内部的实现细节。但是,实现细节揭示了表操作的性能开销情况。因此,要优化使用表的程序(这里特指Lua程序),了解一些表的实现细节是很有好处的。 Lua的表的实现使用了一些很聪明的算法。每个Lua表的内部包含两个部分:数组部分和哈希部分。数组部分以从1到一个特定的n之间的整数作为键来保存元素(我们稍后即将讨论这个n是如何计算出来的)。所有其他元素(包括在上述范围之外的整数键)都被存放在哈希部分里。 正如其名,哈希部分使用哈希算法来保存和查找键。它使用被称为开放地址表的实现方式,意思是说所有的元素都保存在哈希数组中。用一个哈希函数来获取一个键对应的索引;如果存在冲突的话(意即,如果两个键产生了同一个哈希值),这些键将会被放入一个链表,其中每个元素对应一个数组项。当Lua需要向表中添加一个新的键,但哈希数组已满时,Lua将会重新哈希。重新哈希的第一步是决定新的数组部分和哈希部分的大小。因此,Lua遍历所有的元素,计数并对其进行归类,然后为数组部分选择一个大小

Lua学习笔记(二):基本语法

放肆的年华 提交于 2020-01-21 05:47:51
Lua学习指南: http://www.lua.org/manual/ 首先我们要明确的一点是: 在Lua中,除了关键字外一切都是变量。 Lua关键字 可以查看这个地址: http://www.lua.org/manual/5.1/manual.html#2.1 关于分号 语句的最后可以用分号";"表示结束,也可以不写。 而对于一行有多个语句的情况下,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,建议总是用分号隔开。 使用注释 单行注释使用“--”即可,以后的内容都会被当做注释; 多行注释以“--[[”开始,以“]]”结束。 变量 声明 由于是动态类型,所以变量声明时不需要声明类型,但是一定要进行赋值,如果希望是空类型,可以赋值nil,如下: 1 num = 100--数字100 2 str = "abc"--字符串abc 3 obj = nil--空类型 注意在Lua中所有的变量和关键字都是大小写敏感的。 赋值 可以一次对多个变量赋值,规则:如果等号(“=”)右边多了,则舍弃,左边多了,则赋值为空(nil) 。 表达式 a,b=b,a表示a和b的值交换,类型不一样照样可以交换。 1 a, b, c = 100, "abc" 2 print(a, b, c)--100 abc nil 3 4 a, b = b, a 5 print(a, b, c)--abc 100

lua基础部分(变量,数据类型, 运算符, 语句)

空扰寡人 提交于 2020-01-18 02:51:13
这里重点总结一下lua基础,几个简单的点,记录下来,方便以后查看,不是很详细,稍微概括了一下。也希望可以帮到lua初学者。 Lua简介: Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的 函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本, 也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解 和维护。 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上 都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引 擎中,Lua的速度是最快的。这一切 都决定了Lua是作为嵌入式脚本的最 佳选择。 一、变量 lua中变量的命名规则和C语言中一样:字母数字下划线,不能以数字开头,区分大小写,不能是关键字。(这估计都顺嘴就出来了) 变量的赋值规则和C语言,C++里不是很一样,需要注意以下两点: 如果变量的个数小于值的个数,用nil补充。 (下面的数据类型中会详细介绍) 如果变量的个数大于值的个数,则多余的值则将被忽略。 Lua中的变量也分为全局变量和局部变量 全局变量:a = 5; 局部变量:local a = 5; 二、数据类型 lua中的数据类型和C语言中的数据类型不太一样,C语言中有多种数据类型,比如数字就有int,short,long,float,double还有枚举类型等等好多,但是在Lua语言里

Lua脚本学习笔记

前提是你 提交于 2019-12-25 15:52:21
1.脚本不要大写大写字母或者下划线开头做变量,因为它们被用来做保留字(环境变量啥的)。 2.变量的创建,直接使用一个变量即可,不存在就创建,没有赋值就认为变量的值为nil。删除一个全局变量,将其值赋值为nil,即一个变量是否存在看其值是否为nil。nil在用来作比较时,应该加上双引号”nil”如 type(x)==”nil”, type(type(X))==string 3.对一个数字字符串进行算数操作,lua会将其转化为数字 例: > print ( "2" + 6 ) 8.0 > print ( "2 + 6" ) 2 + 6 4.数字和字符串可以使用连接符号“..”连接起来 例 > print ( "a" .. 'b' ) ab > print ( 157 .. 428 ) 157428 5.在字符串或者字符串变量前面使用#表示计算字符串长度,不包括\0。 例 > len = "www.runoob.com" > print (# len ) 14 > print (# "www.runoob.com" ) 14 6.lua里面的数组没有固定长度,下标可以是数字也可以是字符串,当下标不存就直接在数组中开辟创建,没有赋值,其值为nil。7.for循环除开用来循环递增,还用来遍历数组。 8.lua里面有线程即协同程序( coroutine ),和线程区别在于线程可以同时多个运行

Lua学习(1)——table

允我心安 提交于 2019-12-20 11:41:28
table类型实现了“关联数组”。“关联数组”是一种具有特殊索引方式的数组。不仅可以通过证书来索引它,还可以使用字符串或其他类型(除了nil)来索引它。table是Lua中主要的数据结构机制(事实也是仅有的),具有强大的功能。基于table可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列和其他数据结构。 table的特性: table是一个“关联数组”,数组的索引可以是数字或者是字符串 table 的默认初始索引一般以 1 开始 table 的变量只是一个地址引用,对 table 的操作不会产生数据影响 table 不会固定长度大小,有新数据插入时长度会自动增长 先看table的简单的例子: > a={} //空table > k="x" > a[k]=10 > print(a[k]) 10 > a["x"]=a["x"]+1 //自增 > print(a["x"]) 11 Lua提供了更简单的”语法糖“(syntactic sugar) a.x=10 --print(a["x"]=10) print(a.x) --等于print(a["x"]) table循环读入 for i=1,5 do a[i]=io.read() end table循环输出 for i=1,#a do print(a[i]) end #a表示table a最后一个索引 table