易游网-易游模拟器

 找回密码
 立即注册
查看: 2934|回复: 2

[游戏开发] cocos2dx lua客户端性能优化【lua篇】

[复制链接]

3382

主题

3401

帖子

38

积分

超级版主

Rank: 8Rank: 8

积分
38

技术达人

发表于 2021-1-11 16:49:00 | 显示全部楼层 |阅读模式
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] = 1 t[2] = 2 t[3] = 3 t[4] = 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分配优化
游客,如果您要查看本帖隐藏内容请回复


0

主题

6

帖子

0

积分

普通会员LV2

Rank: 1

积分
0
发表于 2021-4-10 15:25:55 | 显示全部楼层
回复

使用道具 举报

0

主题

5

帖子

0

积分

普通会员LV2

Rank: 1

积分
0
发表于 2021-6-22 16:06:19 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|易游网-易游模拟器 Copyright @2015-2021 ( 浙ICP备15028007号-1 )

GMT+8, 2024-4-29 17:24 , Processed in 0.041994 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表