lua 性能优化知识点

Posted preston

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua 性能优化知识点相关的知识,希望对你有一定的参考价值。

Time.time / time.realtimeSinceStartup 不可用


在ulua开发中, 重写了Unity的 time.time / time.realtimeSinceStartup 的函数,但是在ulua框架上却运用了 Os.Clock错误的做法

在下面可以看到 

lua 性能优化知识点


clock() 测量的是系统的CPU时间,而不是真正的时间,他会返回一个微妙的数值,在某一些平台实现clock()会有着不一样的标准,有时候会返回一个负值,从而导致游戏开发的bug



lua变量清除内存的方法


lua中的require会阻止多次加载相同的模块。所以想完全清除其变量的内存,要卸载掉响应的模块。


1. 把全局表中的对应的模块表置 nil 。同时把数据记录在专用的全局表下,并用 local 去引用它。初始化这些数据的时候,首先应该检查他们是否被初始化过了。这样来保证数据不被更新过程重置


2. 把package.loaded里对应模块名下设置为nil,  可以保证下次require重新加载

lua 性能优化知识点


lua随机数生成问题 



math.randomseed() :  接收一个整数 n 作为随机序列种子

math.random() :          无参调用,产生 (0,1) 之间的浮点随机数

                                      只有参数 n, 产生 1-n 之间的整数

                                      有两个参数 n, m, 产生 n-m 之间的随机整数


lua 性能优化知识点


但是问题出来了, 如果程序运行时间, 你又在很短的时间内多次运行这个程序,那么你得到的随机序列会是几乎不变的, 且不够精确。而 random() 还有个毛病就是如果 seed 很小或者seed 变化很小,产生的随机序列仍然很相似



time返回的数值字串倒过来(低位变高位), 再取高位6位。 这样, 即使 time变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些


使用table.concat连接大量字符串效率更高


在使用Lua的过程中,当遇到需要连接大量字符串的时候,尽量不要使用字符串连接符..进行连接,当我们创建字符串的时候,Lua首先会检查内部是否已经有相同的字符串了,如果有直接返回一个引用,如果没有才创建。这使得Lua中String的比较和赋值非常地快速,因为只要比较引用是否相等、或者直接赋值引用就可以了。而另一方面这个机制使得Lua在拼接字符串上开销比较大,因为在一些直接持有字符串buffer的语言中,往往可以直接把后者的buffer插入到前者的buffer的末尾,而Lua先要遍历查找是否有相同的字符串,然后会把后者整个拷贝然后拼接


换句话说, 用“..”来连接则每次都会产生一串新的字符串,开辟一块新的buffer


使用table.concat来代替。通过查看Lua的源码可以发现,这里的原理主要是table.concat只会创建一块buffer,然后在此拼接所有的字符串进行连接效率会高很多!


如果使用 .. 和table.concat分别对10000个字符串进行连接比较, table.concat可以快6倍速度


















以上是关于lua 性能优化知识点的主要内容,如果未能解决你的问题,请参考以下文章

Lua性能优化

Unity+Lua实测如何性能优化(Lua和C#交互篇)

lua 性能优化

使用Lua 局部变量来优化性能,同一时候比較局部变量和全局变量

Unreal引擎中Lua代码的性能瓶颈定位与优化

Unity+Lua游戏开发的性能检测!