lua 性能优化知识点
Posted preston
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua 性能优化知识点相关的知识,希望对你有一定的参考价值。
Time.time / time.realtimeSinceStartup 不可用
在ulua开发中, 重写了Unity的 time.time / time.realtimeSinceStartup 的函数,但是在ulua框架上却运用了 Os.Clock错误的做法
在下面可以看到
clock() 测量的是系统的CPU时间,而不是真正的时间,他会返回一个微妙的数值,在某一些平台实现clock()会有着不一样的标准,有时候会返回一个负值,从而导致游戏开发的bug
lua变量清除内存的方法
lua中的require会阻止多次加载相同的模块。所以想完全清除其变量的内存,要卸载掉响应的模块。
1. 把全局表中的对应的模块表置 nil 。同时把数据记录在专用的全局表下,并用 local 去引用它。初始化这些数据的时候,首先应该检查他们是否被初始化过了。这样来保证数据不被更新过程重置
2. 把package.loaded里对应模块名下设置为nil, 可以保证下次require重新加载
lua随机数生成问题
math.randomseed() : 接收一个整数 n 作为随机序列种子
math.random() : 无参调用,产生 (0,1) 之间的浮点随机数
只有参数 n, 产生 1-n 之间的整数
有两个参数 n, m, 产生 n-m 之间的随机整数
但是问题出来了, 如果程序运行时间, 你又在很短的时间内多次运行这个程序,那么你得到的随机序列会是几乎不变的, 且不够精确。而 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 性能优化知识点的主要内容,如果未能解决你的问题,请参考以下文章