cocos2dx lua客户端性能优化【lua篇】
cocos2dx lua客户端性能优化【lua篇】一、卡顿分析---逻辑优化-lua脚本
1.字符串合并
某一帧如果有大量的字符串合并,可以考虑使用table.concat
local start = os.clock()
local s = ""
for i = 1, 10000 do
s = s .. "," .. tostring(i)
end
--print(s) s太大了,print模拟器会崩溃
local stop = os.clock()
print("total cost:", stop - start)
start = os.clock()
s = ""
local t = {}
for i = 1, 10000 do
table.insert(t, ",")
table.insert(t, tostring(i))
end
s = table.concat(t)
stop = os.clock()
print("total cost:", stop - start)
上面脚本执行结果(相差接近20倍)
total cost: 0.196
total cost: 0.011
Cocos本身的性能问题之外,还有lua脚本计算的性能问题。Lua的使用不当,会增加性能负担;良好的lua习惯,会让我们的脚本执行毫无负担。
2.Lua的表数组大小如果可以确认,最好在声明定义的时候就把大小确认
例如:local t = {}table.insert(t, 1) table.insert(t, 2) table.insert(t, 3) table.insert(t, 4)
可以看到,我们预先知道t的大小是4,那么就不要定义的时候是个空表,否则之后的insert会导致rehash的。
优化:local t = {true,true,true,true} t = 1 t = 2 t = 3 t = 4
3.全局表
全局表,lua是不会进行gc的。也就是,如果我们不去手动清理全局表,并且会不断给他增加内容,那么内存占用会无限制的增长。还有就是要小心,lua表的key或者value也是表的时候,默认的强引用,它始终都不会被释放的。
4.大量的计算,请使用【最近】的变量
lua变量使用
让频繁使用的变量,离我们“近一些”。减少大量循环中使用全局变量,可以使用local变量代替全局变量
看如下4个例子对比结果:
local function test_func(n)
return math.sin(n)
end
--全局变量:函数调用
local start = os.clock()
local r = 0
for i = 1, 100000 do
r = r + test_func(i)
end
local stop = os.clock()
print("total cost:", stop - start)
print("r:",r)
--全局变量:局部调用
start = os.clock()
r = 0
for i = 1, 100000 do
r = r + math.sin(i)
end
stop = os.clock()
print("total cost:", stop - start)
print("r:", r)
print("")
--局部变量,函数调用
local sin_r = math.sin
local function test_func1(n)
return sin_r(n)
end
start = os.clock()
r = 0
for i = 1, 100000 do
r = r + test_func1(i)
end
stop = os.clock()
print("total cost:", stop - start)
print("r:", r)
--局部变量,局部调用
start = os.clock()
r = 0
for i = 1, 100000 do
r = r + sin_r(i)
end
stop = os.clock()
print("total cost:", stop - start)
print("r:", r)
执行结果:最后一种写法提升明显
total cost: 0.009
r: 1.8477771036303
total cost: 0.008
r: 1.8477771036303
total cost: 0.008
r: 1.8477771036303
total cost: 0.006
r: 1.8477771036303
可以见到,使用局部变量,可以对代码提升。
同样的逻辑,10W次调用,最优的方法可以提升41%性能。
5、lua表~数组Key分配优化
**** Hidden Message *****
:):):):):) :lol:lol:lol:lol:lol:lol
页:
[1]