在xlua的框架下通过对一个Vector3进行简单的赋值操作
local function profile()
local t = CS.UnityEngine.Time.realtimeSinceStartup
local v = CS.UnityEngine.Vector3(0, 0, 0)
for i=1,10000000 do
v.x = i
v.y=i
end
local t2 = CS.UnityEngine.Time.realtimeSinceStartup
print('profile0', t2 - t)
end
profile()
输出profile0 8.709219455719
2.Vector3原来的映射方案Vector3 -> userdata,但是把Vector3的方法实现改为lua实现,通过xlua.genaccessor实现不经过C#直接操作内存
(仍然沿用映射方案的好处是userdata比table更省内存,但操作字段比table性能稍低,一个vector3的结构体userdata(size=12Byte)比table(64位空table size ~= 80Byte)更省内存)
local function profile()
local t = CS.UnityEngine.Time.realtimeSinceStartup
local v = CS.UnityEngine.Vector3(0, 0, 0)
for i=1,10000000 do
--v:Set(i,i,i)
v.x=i
v.y=i
end
local t2 = CS.UnityEngine.Time.realtimeSinceStartup
print('profile', t2 - t)
end
profile()
输出profile 1.851414680481
3.将struct映射到table
[GCOptimize(OptimizeFlag.PackAsTable)]
public struct PushAsTableStruct
{
public int x;
public int y;
}
local function profile()
local t = CS.UnityEngine.Time.realtimeSinceStartup
local v = CS.XLuaTest.PushAsTableStruct(4, 5)
for i=1,10000000 do
v.x = i
v.y = i
end
local t2 = CS.UnityEngine.Time.realtimeSinceStartup
print('profile2', t2 - t)
end
profile()
输出profile2 0.181227684021
从结果来看默认的映射方式最慢,消耗是改造成table直接操作内存的4倍,是结构体映射的40倍,差距还是比较明显的