--[[ 对比两种方案: 方案一:C#使用C API获取lua数据。是目前项目中使用的方案。 方案二:C#通过指针获取lua数据。 * 测试环境:两部Android手机 Redmi K40 Gaming、Huawei mate9 (MHA-AL00) * 测试用例: 对一个整数lua数组遍历执行"读"、"写"、"读和写"三种操作。 执行次数分为3档:100、1000、10000。 * 结果:可以看出方案二耗时确实少于方案一,但是在100 ~ 10000数量级上优化较小,执行10000次读写耗时仅减少1ms左右。 * 结论:游戏中常见的操作执行次数在100 ~ 10000的数量级上,当前情况下方案二的优势并不明显,因此目前不采用。以后如果有执行10万次以上的操作可以考虑。 时间单位(ms) RunByLuaDLL:方案一 RunByAccess:方案二 | | Redmi | Huawei | |--------------------------|----------|-----------| | 100 | | | | RunByLuaDLL - Write | 0.02 | 0.01 | | RunByLuaDLL - Read | 0.03 | 0.02 | | RunByLuaDLL - Read&Write | 0.04 | 0.02 | | RunByAccess - Write | 0.00 | 0.00 | | RunByAccess - Read | 0.01 | 0.01 | | RunByAccess - Read&Write | 0.01 | 0.01 | |--------------------------|----------|-----------| | 1000 | | | | RunByLuaDLL - Write | 0.08 | 0.08 | | RunByLuaDLL - Read | 0.14 | 0.12 | | RunByLuaDLL - Read&Write | 0.22 | 0.19 | | RunByAccess - Write | 0.02 | 0.02 | | RunByAccess - Read | 0.06 | 0.05 | | RunByAccess - Read&Write | 0.09 | 0.06 | |--------------------------|----------|-----------| | 10000 | | | | RunByLuaDLL - Write | 0.74 | 0.76 | | RunByLuaDLL - Read | 1.05 | 1.18 | | RunByLuaDLL - Read&Write | 1.65 | 1.85 | | RunByAccess - Write | 0.19 | 0.18 | | RunByAccess - Read | 0.57 | 0.48 | | RunByAccess - Read&Write | 0.75 | 0.67 | --]] local InitAccess = CSExt.InitArrAccess local CreateAccess = CSExt.CreateArrAccess local DisposeAccess = CSExt.DisposeArrAccess local LuaArrAccess = {} local _arr2AccMap = {} InitAccess(_G["jit"] ~= nil) function LuaArrAccess.GetAccess(array) local accId = _arr2AccMap[array] if not accId then accId = CreateAccess(array) _arr2AccMap[array] = accId end return accId end function LuaArrAccess.DisposeAccess(array) local accId = _arr2AccMap[array] if accId then DisposeAccess(accId) _arr2AccMap[array] = nil end end return LuaArrAccess