怎麼調試lua性能
我們的遊戲使用的是Cocos2dx-lua 3.9的項目,最近發現我們的遊戲。運行比較緩慢。想做一次性能優化了。其實主要分爲GPU、CPU的分別優化。GPU部分的優化。網上有很多優化措施。但是CPU因爲是每個項目都不一樣所以也沒有什麼特別的通用的優化手段。軟件運行的速度畢竟跟你的代碼質量是直接掛鉤的。常規的Lua優化方式。也就是很多地方在提的公共函數的本地化。比如說`local type = type`這種。不過在後來的調查中發現這種方式對於lua5.1效果比較明顯。至於5.3或者luaJIT則效果不是很明顯。調查中發現3.9是使用luaJIT的(想知道自己的項目解釋器是不是Jit應該可以print(jit and jit.version))。所以這部分我們就暫時不做了。只能從項目中設計不合理的部分改起了。但是從什麼地方開始改。那些函數調用的時間比較長,就需要來統計函數的運行次數與時間了。
怎麼統計每個函數的運行時間和次數
網上找了找相關資料,就這篇文章寫的還算明白。lua性能分析。不過我並沒有找到他的代碼,因爲Github上的這個項目好像是丟了,不知道爲什麼。不過大體意思是明白怎麼回事了。簡單點說就是在C++層面上通過兩個回調(函數進入時、退出時)然後統計時間,然後根據執行的先後順序來一層一層的打印對應的對戰,達到遊戲中所有的函數運行時間心中有數的目的。因爲沒有找到他的源碼。不過好在讀懂他是什麼意思了。不過我對於Lua C++部分的代碼並不是很熟,所以我決定在Lua方面做手腳,統計函數的執行時間究竟有多長,畢竟可以打到同樣的目的,不過Lua統計時間看看就好。不要太當真。
怎樣給Lua的函數添加上統計代碼
或許對於其他語言來說這件事情沒有那麼容易,不過對於lua語言來說這就簡單多了。最簡單的手段就是讓原來的函數等於一個新的函數。在新的函數中計時並且調用原來的函數就可以了。廢話不多說了。直接上相關代碼可能更容易看懂
local function PerformanceStatisticsFunction(key, func)
-- print("PerformanceStatisticsFunction", key)
return function( ... )
local current_stack = nil
local parent_stack = PerformanceStatistics:getInstance()._stack_parent
local call_stack = PerformanceStatistics:getInstance()._call_stack
if not parent_stack then
if not call_stack[key] then
call_stack[key] = kunpo.TreeNode.new()
end
current_stack = call_stack[key]
else
current_stack = parent_stack:getChildByName(key)
if not current_stack then
current_stack = kunpo.TreeNode.new()
parent_stack:addChild(current_stack)
end
end
current_stack:setName(key)
local data = current_stack:getData()
if data == nil then
data = {Count = 0, Time = 0}
current_stack:setData(data)
end
PerformanceStatistics:getInstance()._stack_parent = current_stack
local t0 = GetTimeNow()
local res = {func(...)}
local t1 = GetTimeNow()
PerformanceStatistics.getInstance():statisticsTime(key, t1 - t0)
PerformanceStatistics.getInstance():statisticsCount(key)
data.Count = data.Count + 1
data.Time = data.Time + (t1 - t0)
PerformanceStatistics:getInstance()._stack_parent = parent_stack
return unpack(res)
end
end
然後就是準備需要監控的數據了
因爲項目中的代碼多是寫到一個類似於類概念的地方所以我們這邊準備的都是相關內容的類內容
-- 初始化項目中的函數
local WatchItem =
{
["Manager.ArchiveManager"] = kunpo.ArchiveManager,
["Manager.BasicDataManager"] = kunpo.BasicDataManager,
["Manager.BuffManager"] = kunpo.BuffManager,
["Manager.BuffTypeManager"] = kunpo.BuffTypeManager,
["Manager.ConfigDataManager"] = kunpo.ConfigDataManager,
["Manager.EffectsManager"] = EffectsManager,
["Manager.GameManager"] = GameManager,
["Manager.LevelManager"] = LevelManager,
["Manager.MachineManager"] = MachineManager,
["Manager.MapManager"] = MapManager,
["Manager.ObjectManager"] = ObjectManager,
["Manager.PerCreateManager"] = kunpo.PerCreateManager,
["Manager.PerLoadingManager"] = kunpo.PerLoadingManager,
["Manager.PortalManager"] = PortalManager,
["Manager.RecycleManager"] = RecycleManager,
["Manager.RuntimeDataManager"] = kunpo.RuntimeDataManager,
["Manager.ShadowManager"] = ShadowManager,
["Manager.TaskManager"] = kunpo.TaskManager,
["Manager.TaskUIManager"] = TaskUIManager,
["Manager.TCDataManager"] = kunpo.TCDataManager,
["Manager.UpdateManager"] = kunpo.UpdateManager,
["Manager.UpdateWeightManager"] = kunpo.UpdateWeightManager,
}
-- 添加監控內容
local table_list =
{
["kunpo.Components"] = kunpo.Components,
["kunpo.DataPool"] = kunpo.DataPool,
["kunpo.Effects"] = kunpo.Effects,
["kunpo.GameData"] = kunpo.GameData,
["kunpo.map"] = kunpo.map,
["kunpo.ObjectBarrier"] = kunpo.ObjectBarrier,
["kunpo"] =
{
["Bullet"] = kunpo.Bullet,
["Character"] = kunpo.Character,
["DropItem"] = kunpo.DropItem,
["Enemy"] = kunpo.Enemy,
["MachineBase"] = kunpo.MachineBase,
["Task"] = kunpo.Task,
["LimitCondition"] = kunpo.LimitCondition,
["LimitCurrentPlayer"] = kunpo.LimitCurrentPlayer,
["LimitCurrentPlayerHP"] = kunpo.LimitCurrentPlayerHP,
["LimitLevel"] = kunpo.LimitLevel,
["LimitSourceChildType"] = kunpo.LimitSourceChildType,
["LimitSourceItemId"] = kunpo.LimitSourceItemId,
["LimitSourceType"] = kunpo.LimitSourceType,
["LimitTargetChildType"] = kunpo.LimitTargetChildType,
["LimitTargetItemId"] = kunpo.LimitTargetItemId,
["LimitTargetType"] = kunpo.LimitTargetType,
["PreConditionLossBlood"] = kunpo.PreConditionLossBlood,
["AStar"] = kunpo.AStar,
["CommonsLogics"] = kunpo.CommonsLogics,
["EventTools"] = kunpo.EventTools,
["functions"] = kunpo.functions,
["RouteData"] = kunpo.RouteData,
["SafeCall"] = kunpo.SafeCall,
["SDKHelper"] = kunpo.SDKHelper,
["SpriteHelper"] = kunpo.SpriteHelper,
["TimeRecord"] = kunpo.TimeRecord,
},
["_G"] =
{
["Joystick"] = Joystick,
["JoystickShot"] = JoystickShot,
["Linq"] = Linq,
},
["kunpo.BarrierTools"] = kunpo.BarrierTools,
["kunpo.Random"] = kunpo.Random,
}
for key, list in pairs(table_list) do
for k,v in pairs(list) do
WatchItem[key.."."..k] = v
end
end
for k, item in pairs(WatchItem) do
PerformanceStatisticsTable(k, GetSourceClass(item))
end
不過在添加的時候可能會加載不上,因爲Cocos2dx-lua中的類中的函數,並不是在他的類上。而是在他的類似於父類的地方。所以需要想辦法獲取到他的原始父類,將監控代碼加載到他的原始父類中去纔可以
local function GetSourceClass(t)
local data = t
while true do
if not t then
break
end
if rawget(t, "__cname") then
break
end
local class = rawget(t, "class")
if class then
data = class
break
end
local mtable = getmetatable(t)
if mtable == nil then
break
end
local index = rawget(mtable, "__index")
if type(index) ~= "table" then
break
end
data = GetSourceClass(index)
break
end
return data
end
類的初始化實際上就是替換類中的函數爲統計函數
local function PerformanceStatisticsTable(tname, t)
-- print("PerformanceStatisticsTable", tname)
-- local PrintName = "Manager.ObjectManager"
-- if tname == PrintName then
-- print("PerformanceStatisticsTable", tname, t, t.__is_performance_statistics)
-- end
local ignore_list = {"ctor", "new", "create"}
while true do
if t.__is_performance_statistics then
break
end
t.__is_performance_statistics = true
for k,v in pairs(t) do
-- if tname == PrintName then
-- print(PrintName, k, v)
-- end
local item_type = type(v)
if item_type == "function" and not table.contain(ignore_list, k) then
t[k] = PerformanceStatisticsFunction(table.concat({tname, k}, "."), v)
end
end
break
end
end
這些東西都做好了之後。就差統計相關的信息。需要有地方將這一幀中的所有性能調試相關的信息保存起來
local function GetTimeNow()
return os.clock()
end
local output_path = device.writablePath.."Debug"
local lfs = lfs
for file in lfs.dir(output_path) do
if file ~= "." and file ~= ".." and file ~= ".DS_Store" then
-- print("DebugOutput", file)
local file_name = output_path.."/"..file
os.remove(file_name)
end
end
local PerformanceStatistics = class("PerformanceStatistics")
local instance = nil
function PerformanceStatistics:getInstance()
return instance
end
function PerformanceStatistics:ctor( ... )
self._statistics_time = {}
self._statistics_count = {}
self._all_time = 0
self._print_index = 1000000
self._call_stack = {}
self._stack_parent = nil
-- self._all_time_label = nil
end
-- function PerformanceStatistics:setAllTimeLabel(label)
-- self._all_time_label = label
-- end
function PerformanceStatistics:statisticsTime(name, time)
self._statistics_time[name] = (self._statistics_time[name] or 0) + time
end
function PerformanceStatistics:statisticsCount(name)
self._statistics_count[name] = (self._statistics_count[name] or 0) + 1
end
function PerformanceStatistics:clearLastInfo()
-- if self._all_time_label then
-- self._all_time_label:setString(self._all_time)
-- end
self._statistics_time = {}
self._statistics_count = {}
-- for k,v in pairs(self._statistics_time) do
-- self._statistics_time[k] = 0
-- end
-- for k,v in pairs(self._statistics_count) do
-- self._statistics_count[k] = 0
-- end
self._call_stack = {}
self._stack_parent = nil
self._all_time = 0
end
function PerformanceStatistics:setAllTime(t)
self._all_time = t
end
function PerformanceStatistics:getAllTime()
return self._all_time
end
local HeadTab = 3
local function WriteTreeToFile(node, parenttime, deep)
deep = deep or 0
local heads = {}
for i = 1, deep do
table.insert(heads, "\t")
end
local alltime = PerformanceStatistics:getInstance()._all_time
local data = node:getData()
io.write(table.concat(heads)..table.concat({string.format("%.3f\t%.3f", data.Time / parenttime, data.Time / alltime), data.Count, node:getName()}, "\t").."\n")
local childs = node:getChilds()
table.sort(childs, function(a, b) return a:getData().Time > b:getData().Time end)
for _, item in ipairs(childs) do
WriteTreeToFile(item, data.Time, deep + 1)
end
end
function PerformanceStatistics:writeAllInfoToFile()
self._print_index = self._print_index + 1
local file_path = device.writablePath.."Debug/"..self._print_index..".txt"
io.output(file_path)
io.write("self._all_time "..self._all_time.."\n")
-- 瀑布式打印
local alltime = PerformanceStatistics:getInstance()._all_time
for _, item in pairs(self._call_stack) do
WriteTreeToFile(item, alltime)
io.write("\n")
end
-- 普通打印
io.write("\nself._statistics_time \n")
local output_list = {}
for k,v in pairs(self._statistics_time) do
table.insert(output_list, {key = k, value = v})
end
table.sort(output_list, function(a, b) return a.value > b.value end)
for i, item in ipairs(output_list) do
local k, v = item.key, item.value
io.write(table.concat({v / self._all_time, v, k}, "\t") .. "\n")
end
io.write("\nself._statistics_count \n")
output_list = {}
for k,v in pairs(self._statistics_count) do
table.insert(output_list, {key = k, value = v})
end
table.sort(output_list, function(a, b) return a.value > b.value end)
for i, item in ipairs(output_list) do
local k, v = item.key, item.value
io.write(table.concat({v, k}, "\t") .. "\n")
end
end
instance = PerformanceStatistics.new()
cc.exports.PerformanceStatistics = PerformanceStatistics
重寫主循環
最後重寫掉主循環,讓主循環每幀統計信息,並且在當前幀超時之後輸出當前幀的所有信息。
local kunpo_components_battlestate_runingupdate = kunpo.Components.BattleState.RuningUpdate
kunpo.Components.BattleState.RuningUpdate = function( ... )
PerformanceStatistics.getInstance():clearLastInfo()
local t0 = GetTimeNow()
kunpo_components_battlestate_runingupdate(...)
local t1 = GetTimeNow()
PerformanceStatistics.getInstance():setAllTime(t1 - t0)
if t1 - t0 > 0.008 then
PerformanceStatistics.getInstance():writeAllInfoToFile()
end
end
怎麼查看最後的輸出信息
我想最好還是先來一個範本最好
self._all_time 0.0092289999999995
0.997 0.997 1 kunpo.Components.BattleState.RuningUpdate
0.954 0.952 1 Manager.ObjectManager.update
0.990 0.943 1 Manager.UpdateManager.update
0.380 0.358 11 kunpo.Components.Movement.update
0.692 0.248 11 kunpo.Components.LimitMove.limitMove
0.729 0.181 14 Manager.MapManager.isValidMovement
0.358 0.065 14 Manager.MapManager.getTileInRect
0.548 0.036 28 Manager.MapManager.getCoordByPosition
0.198 0.036 78 Manager.MapManager.getHeightByCoord
0.279 0.010 78 Manager.MapManager.isOutOfMapByCoord
0.074 0.013 78 Manager.MapManager.isValidMovementByHeight
0.059 0.011 14 Manager.MapManager.isOutOfMap
0.049 0.009 14 kunpo.Components.Collide.isFloating
0.123 0.001 14 kunpo.Components.Buff.getAttribute
0.017 0.003 14 kunpo.Components.Collide.getCollide
0.068 0.017 14 kunpo.Components.Height.getHeight
0.774 0.013 14 kunpo.Components.Height.getFlyHeight
0.067 0.001 14 kunpo.Components.Buff.getAttribute
0.059 0.015 4 kunpo.Components.MessagePack.addMessage
0.324 0.005 4 kunpo.Components.MessagePack.sortMessages
0.044 0.001 4 kunpo.Components.MessagePack.addMessageeOnly
0.015 0.000 4 kunpo.Components.MessagePack.regetSleepTo
0.025 0.006 4 kunpo.Components.Movement.addExtraForce
0.018 0.004 11 kunpo.Components.Transformation.getPosition
0.010 0.003 11 kunpo.Components.Buff.getAttribute
0.002 0.001 4 kunpo.Components.MessagePack.removeMessage
0.002 0.001 5 kunpo.Components.Movement.getExtraForce
0.000 0.000 1 kunpo.Components.LimitMove.setNeedExtrusion
0.087 0.031 11 kunpo.Components.LimitMove.relieveLimit
0.587 0.018 1 Manager.MapManager.isValidMovement
0.160 0.003 1 Manager.MapManager.getTileInRect
0.815 0.002 2 Manager.MapManager.getCoordByPosition
0.154 0.003 1 kunpo.Components.Collide.isFloating
0.038 0.000 1 kunpo.Components.Buff.getAttribute
0.118 0.002 1 Manager.MapManager.isOutOfMap
0.018 0.000 1 Manager.MapManager.getHeightByCoord
0.000 0.000 1 Manager.MapManager.isOutOfMapByCoord
0.006 0.000 1 kunpo.Components.Collide.getCollide
0.000 0.000 1 Manager.MapManager.isValidMovementByHeight
0.174 0.005 1 Manager.MapManager.getHeightByPosition
0.460 0.002 1 Manager.MapManager.getCoordByPosition
0.420 0.002 1 Manager.MapManager.getHeightByCoord
0.048 0.000 1 Manager.MapManager.isOutOfMapByCoord
0.097 0.003 1 kunpo.Components.Height.getHeight
0.929 0.003 1 kunpo.Components.Height.getFlyHeight
0.000 0.000 1 kunpo.Components.Buff.getAttribute
0.007 0.000 1 kunpo.Components.Buff.getAttribute
0.007 0.000 1 kunpo.Components.LimitMove.setNeedExtrusion
0.054 0.020 11 kunpo.Components.Transformation.setPosition
0.544 0.011 11 kunpo.Components.Collide.setPositionAndDir
0.150 0.003 11 kunpo.Components.Transformation.getDirection
0.050 0.001 11 kunpo.Components.Transformation.getPosition
0.043 0.015 11 kunpo.Components.Movement.getMoveSpeed
0.355 0.005 11 kunpo.Components.Movement.getTemporarySpeedChange
0.184 0.003 11 kunpo.Components.Buff.getAttribute
0.016 0.006 11 kunpo.Components.Movement.clearReactionForceList
0.002 0.001 11 kunpo.Components.Transformation.getPosition
0.002 0.001 11 kunpo.Components.Buff.getAttribute
0.002 0.001 11 kunpo.Components.Movement.updateTemporarySpeedChanges
0.164 0.154 1 kunpo.Components.Health.hurt
0.998 0.154 1 kunpo.Components.Health.reduceHp
0.003 0.000 1 kunpo.Components.DamageReduction.getDamageReduction
0.002 0.000 1 kunpo.Components.Health.callChangeFuncs
0.001 0.000 1 kunpo.Components.DamageReduction.getDamageReductionPercentage
0.058 0.055 73 kunpo.Components.EffectContainer.update
0.132 0.007 12 kunpo.Components.Transformation.getPosition
0.040 0.038 1 kunpo.Components.EnemyRangeDamage.update
0.679 0.026 1 Manager.ObjectManager.damageInRange
0.485 0.013 1 Manager.MapManager.damageWallInRange
0.379 0.005 6 kunpo.map.BarrierLayer.getBarrierByCoord
0.343 0.009 1 Manager.ObjectManager.getObjectsInRange
0.049 0.000 1 kunpo.Components.Collide.getPhysicPosition
0.000 0.000 1 kunpo.Components.Transformation.getPosition
0.012 0.000 1 Manager.ObjectManager.getInstance
0.012 0.000 1 Manager.ObjectManager.getPlayers
0.000 0.000 1 kunpo.Components.Collide.getPhysicRadius
0.004 0.000 1 Manager.MapManager.getInstance
0.099 0.004 1 kunpo.Components.Height.getHeight
0.914 0.003 1 kunpo.Components.Height.getFlyHeight
0.062 0.000 1 kunpo.Components.Buff.getAttribute
0.014 0.001 1 kunpo.Components.Collide.getPhysicPosition
0.400 0.000 1 kunpo.Components.Transformation.getPosition
0.006 0.000 1 kunpo.Components.Collide.getPhysicRadius
0.003 0.000 1 Manager.ObjectManager.getInstance
0.034 0.032 11 kunpo.Components.AutoZOrder.update
0.652 0.021 11 kunpo.Components.Height.getHeight
0.534 0.011 11 kunpo.Components.Height.getFlyHeight
0.382 0.004 11 kunpo.Components.Buff.getAttribute
0.024 0.001 11 kunpo.Components.Transformation.getPosition
0.024 0.001 11 Manager.MapManager.getMapSizeInPixel
0.028 0.026 12 kunpo.Components.DistanceWithNearPlay.update
0.131 0.003 11 kunpo.Components.DistanceWithNearPlay.setDistanceWithNearPlayerSQ
0.123 0.003 11 Manager.ObjectManager.getNearPlayer
0.123 0.003 22 kunpo.Components.Transformation.getPosition
0.102 0.003 11 kunpo.Components.DistanceWithNearPlay.setNearPlayer
0.029 0.001 11 Manager.ObjectManager.getInstance
0.027 0.025 11 kunpo.Components.Shadow.update
0.026 0.001 11 kunpo.Components.Transformation.getPosition
0.022 0.001 11 kunpo.Components.Transformation.getHeight
0.026 0.024 11 kunpo.Components.Buff.update
0.422 0.010 11 Manager.BuffManager.postUpdate
0.064 0.001 11 Manager.BuffManager.getBuffComponent
0.126 0.003 11 Manager.BuffManager.perUpdate
0.018 0.000 11 Manager.BuffManager.update
0.018 0.017 12 kunpo.Components.RootNode.update
0.065 0.001 12 kunpo.Components.Transformation.getScale
0.039 0.001 12 kunpo.Components.Transformation.getPosition
0.006 0.000 1 kunpo.Components.Transformation.getDirectionDegree
0.014 0.013 11 kunpo.Components.Health.update
0.269 0.003 11 kunpo.Components.Health.updateAttackSource
0.235 0.003 11 kunpo.Components.Health.updateInvincible
0.011 0.010 2 kunpo.Components.Surface.update
0.874 0.009 2 kunpo.map.SurfaceLayer.getTypeByPosition
0.349 0.003 2 Manager.MapManager.getCoordByPosition
0.024 0.000 2 kunpo.map.SurfaceLayer.getTypeByCoord
0.012 0.000 2 Manager.MapManager.getInstance
0.000 0.000 2 kunpo.Components.Transformation.getPosition
0.000 0.000 2 kunpo.Components.Surface.isValid
0.011 0.010 2 kunpo.Components.AutoAdjustOrientation.update
0.284 0.003 2 kunpo.CommonsLogics.getNearPlayer
0.037 0.000 2 kunpo.Components.DistanceWithNearPlay.getNearPlayer
0.021 0.000 2 kunpo.Components.Transformation.getScale
0.021 0.000 4 kunpo.Components.Transformation.getPosition
0.011 0.000 2 kunpo.Components.MessagePack.haveMessage
0.011 0.000 2 kunpo.Components.RootNode.getRootNode
0.010 0.010 10 kunpo.Components.Animation.update
0.068 0.001 10 kunpo.Components.Transformation.getHeight
0.045 0.000 9 kunpo.Components.Buff.getAttribute
0.009 0.009 1 kunpo.Components.WeaponLocalZOrderUpdate.update
0.402 0.004 1 kunpo.Components.SkillBase.update
0.030 0.000 1 kunpo.Components.SkillBase.getSkillCd
0.012 0.000 1 kunpo.Components.Transformation.getDirection
0.012 0.000 1 kunpo.Components.SkillBase.getDestroyMe
0.009 0.009 1 kunpo.Components.Streak.update
0.025 0.000 4 kunpo.Components.Transformation.getPosition
0.000 0.000 1 kunpo.Components.Movement.getSpeed
0.009 0.008 3 kunpo.CommonsLogics.getCustomKey
0.008 0.007 8 kunpo.Components.BTFullFrame.update
0.060 0.000 8 kunpo.Components.Buff.getAttribute
0.004 0.004 1 kunpo.map.BarrierLayer.getBarrierByPosition
0.162 0.001 1 Manager.MapManager.getCoordByPosition
0.054 0.000 1 Manager.MapManager.getInstance
0.027 0.000 1 kunpo.map.BarrierLayer.getBarrierByCoord
0.004 0.004 1 kunpo.Components.WeaponLogic.updateHolderDead
0.057 0.000 1 kunpo.Components.StateMachine.getCurrentStateId
0.004 0.004 12 kunpo.Components.FullFrameLogicalHosting.update
0.003 0.003 7 kunpo.Components.MessagePack.haveMessage
0.003 0.003 1 kunpo.CommonsLogics.getNearPlayer
0.037 0.000 1 kunpo.Components.DistanceWithNearPlay.getNearPlayer
0.003 0.003 1 Manager.MapManager.getBarrierLayer
0.003 0.002 2 kunpo.Components.LogicalHosting.update
0.002 0.002 1 Manager.ObjectManager.getInstance
0.002 0.002 1 kunpo.Components.Transformation.setPosition
0.002 0.002 1 kunpo.Components.Transformation.getDirection
0.001 0.001 1 kunpo.Components.TailSmog.update
0.000 0.000 1 kunpo.Components.Movement.getSpeed
0.001 0.001 1 kunpo.Components.WeaponLogic.isAmmoEnough
0.400 0.000 1 kunpo.Components.Ammunition.getAmmunition
0.001 0.001 1 kunpo.Components.Animation.setTimeScale
0.000 0.000 2 kunpo.Components.MessagePack.update
0.000 0.000 1 kunpo.Components.MessagePack.removeMessage
0.000 0.000 1 kunpo.Components.StateList.update
0.000 0.000 1 kunpo.Components.WeaponLogic.getSuspendFire
0.000 0.000 1 kunpo.Components.Movement.setSpeedDirection
0.000 0.000 1 kunpo.Components.Animation.playAnimation
0.000 0.000 3 kunpo.Components.Transformation.getPosition
0.000 0.000 1 kunpo.Components.MessagePack.getLastMessage
0.000 0.000 2 kunpo.Components.WeaponLogic.getIsFiring
0.000 0.000 1 kunpo.Components.BTFullFrame.removeBTNode
0.000 0.000 1 kunpo.Components.Transformation.setDirection
0.000 0.000 1 kunpo.Components.Health.getIsDead
0.000 0.000 2 kunpo.Components.Buff.getAttribute
0.000 0.000 1 kunpo.Components.Transformation.getScale
0.000 0.000 1 Manager.ObjectManager.getPlayerCount
0.000 0.000 1 kunpo.Components.LimitMove.getLimitType
0.000 0.000 1 Manager.MapManager.getInstance
0.002 0.002 8 kunpo.Enemy.getIgnore
0.011 0.011 1 Manager.ObjectManager.postUpdate
0.673 0.007 1 Manager.UpdateManager.updateDestroy
0.003 0.003 6 Manager.ObjectManager.getInstance
0.002 0.002 2 Manager.ObjectManager.getWorld
0.001 0.001 12 kunpo.Components.Transformation.getPosition
0.001 0.001 1 kunpo.Components.DistanceWithNearPlay.updateSee
0.200 0.000 1 kunpo.Components.DistanceWithNearPlay.update
0.001 0.001 1 Manager.ObjectManager.pushIndexToNext
0.400 0.000 1 Manager.UpdateManager.pushIndexToNext
0.000 0.000 1 kunpo.Components.MessagePack.update
0.000 0.000 1 Manager.ObjectManager.preUpdate
0.000 0.000 1 kunpo.Components.LogicalHosting.update
0.000 0.000 1 Manager.TaskUIManager.getInstance
0.000 0.000 1 Manager.MachineManager.getInstance
0.000 0.000 1 kunpo.Components.FullFrameLogicalHosting.update
0.000 0.000 1 Manager.MachineManager.update
0.000 0.000 1 Manager.TaskUIManager.update
self._statistics_time
0.99739950157116 0.0092049999999997 kunpo.Components.BattleState.RuningUpdate
0.95178242496468 0.0087839999999986 Manager.ObjectManager.update
0.94268068046373 0.0086999999999993 Manager.UpdateManager.update
0.35843536677871 0.0033080000000005 kunpo.Components.Movement.update
0.24813089175392 0.0022899999999968 kunpo.Components.LimitMove.limitMove
0.19915483801114 0.0018380000000047 Manager.MapManager.isValidMovement
0.15429624011271 0.0014240000000001 kunpo.Components.Health.hurt
0.15397117780915 0.0014210000000006 kunpo.Components.Health.reduceHp
0.067721313251264 0.00062499999999588 Manager.MapManager.getTileInRect
0.054935529309863 0.0005070000000007 kunpo.Components.EffectContainer.update
0.044316827392243 0.00040900000000299 kunpo.Components.Height.getHeight
0.044208473290929 0.00040800000000196 Manager.MapManager.getCoordByPosition
0.038357351826511 0.00035400000000685 Manager.MapManager.getHeightByCoord
0.038140643623498 0.00035200000000124 kunpo.Components.EnemyRangeDamage.update
0.031747751652701 0.00029300000000276 kunpo.Components.AutoZOrder.update
0.031205981146131 0.00028799999999762 kunpo.Components.LimitMove.relieveLimit
0.030339148336965 0.00028000000000183 kunpo.Components.Height.getFlyHeight
0.026546754794628 0.00024499999999961 kunpo.Components.DistanceWithNearPlay.update
0.025896630187321 0.00023899999999877 Manager.ObjectManager.damageInRange
0.025138151479084 0.00023200000000045 kunpo.Components.Shadow.update
0.024162964567834 0.00022299999999653 kunpo.Components.Buff.update
0.021454112038061 0.00019799999999925 kunpo.Components.Transformation.setPosition
0.020695633328862 0.00019099999999206 kunpo.Components.Transformation.getPosition
0.016686531585244 0.00015400000000021 kunpo.Components.RootNode.update
0.015277928269508 0.00014099999999928 kunpo.Components.Movement.getMoveSpeed
0.014736157763707 0.00013600000000125 kunpo.Components.MessagePack.addMessage
0.013977679054701 0.00012899999999583 kunpo.Components.Buff.getAttribute
0.013327554448548 0.00012300000000565 Manager.MapManager.isValidMovementByHeight
0.012894138043099 0.00011899999999976 kunpo.Components.Health.update
0.01278578394217 0.00011800000000228 Manager.MapManager.isOutOfMap
0.012569075739542 0.00011600000000023 Manager.MapManager.damageWallInRange
0.011593888829255 0.00010700000000519 kunpo.Components.Collide.isFloating
0.010618701917813 9.7999999999487e-05 Manager.ObjectManager.postUpdate
0.010618701917813 9.7999999999487e-05 kunpo.Components.Collide.setPositionAndDir
0.010293639614255 9.4999999999956e-05 kunpo.Components.Surface.update
0.010293639614063 9.499999999818e-05 kunpo.Components.AutoAdjustOrientation.update
0.010185285512941 9.3999999998928e-05 Manager.BuffManager.postUpdate
0.010076931411819 9.2999999999677e-05 Manager.MapManager.isOutOfMapByCoord
0.0095351609058263 8.7999999999866e-05 kunpo.Components.Animation.update
0.0089933903998331 8.3000000000055e-05 kunpo.map.SurfaceLayer.getTypeByPosition
0.0088850362987115 8.2000000000804e-05 kunpo.Components.WeaponLocalZOrderUpdate.update
0.0088850362987115 8.2000000000804e-05 Manager.ObjectManager.getObjectsInRange
0.0087766821973974 8.0999999999776e-05 kunpo.Components.Streak.update
0.0082349116915967 7.6000000001741e-05 kunpo.CommonsLogics.getCustomKey
0.0072597247805395 6.6999999999595e-05 kunpo.Components.BTFullFrame.update
0.0071513706794178 6.6000000000344e-05 Manager.UpdateManager.updateDestroy
0.0062845378694823 5.7999999997449e-05 kunpo.Components.Movement.addExtraForce
0.0059594755661174 5.4999999999694e-05 Manager.ObjectManager.getInstance
0.0058511214649957 5.4000000000443e-05 kunpo.CommonsLogics.getNearPlayer
0.0056344132623675 5.1999999998387e-05 kunpo.Components.Movement.clearReactionForceList
0.0054177050601242 4.9999999999883e-05 Manager.MapManager.getHeightByPosition
0.0054177050601242 4.9999999999883e-05 kunpo.Components.Movement.getTemporarySpeedChange
0.0049842886550602 4.5999999997548e-05 kunpo.Components.Transformation.getDirection
0.0048759345543235 4.5000000001849e-05 kunpo.map.BarrierLayer.getBarrierByCoord
0.0047675804528169 4.3999999999045e-05 kunpo.Components.MessagePack.sortMessages
0.004009101744388 3.6999999998955e-05 kunpo.map.BarrierLayer.getBarrierByPosition
0.0037923935421447 3.5000000000451e-05 kunpo.Components.WeaponLogic.updateHolderDead
0.0036840394408306 3.3999999999423e-05 kunpo.Components.FullFrameLogicalHosting.update
0.0035756853397089 3.3000000000172e-05 kunpo.Components.SkillBase.update
0.0034673312382023 3.1999999997367e-05 kunpo.Components.DistanceWithNearPlay.setDistanceWithNearPlayerSQ
0.0034673312382023 3.1999999997367e-05 kunpo.Components.Health.updateAttackSource
0.0033589771374656 3.1000000001669e-05 kunpo.Components.MessagePack.haveMessage
0.0032506230361515 3.0000000000641e-05 Manager.ObjectManager.getNearPlayer
0.0031422689350299 2.9000000001389e-05 kunpo.Components.Collide.getCollide
0.0030339148339082 2.8000000002137e-05 Manager.BuffManager.perUpdate
0.0030339148335233 2.7999999998585e-05 kunpo.Components.Health.updateInvincible
0.0027088525301583 2.500000000083e-05 Manager.MapManager.getBarrierLayer
0.0027088525299659 2.4999999999054e-05 kunpo.Components.DistanceWithNearPlay.setNearPlayer
0.0026004984286517 2.3999999998026e-05 kunpo.Components.LogicalHosting.update
0.0023837902266009 2.2000000001299e-05 Manager.ObjectManager.getWorld
0.0022754361252868 2.1000000000271e-05 kunpo.Enemy.getIgnore
0.0014086033155438 1.2999999999153e-05 kunpo.Components.Transformation.getScale
0.0011918951129155 1.0999999997097e-05 kunpo.Components.Transformation.getHeight
0.0009751869108647 9.0000000003698e-06 kunpo.Components.Collide.getPhysicPosition
0.00086683280974306 8.0000000011182e-06 kunpo.Components.MessagePack.removeMessage
0.00075847870823646 6.9999999983139e-06 Manager.MapManager.getMapSizeInPixel
0.00065012460730729 6.0000000008387e-06 kunpo.Components.MessagePack.addMessageeOnly
0.00065012460711482 5.9999999990623e-06 Manager.BuffManager.getBuffComponent
0.00054177050618565 5.0000000015871e-06 kunpo.Components.Movement.getExtraForce
0.00054177050618565 5.0000000015871e-06 kunpo.Components.MessagePack.update
0.00054177050599317 4.9999999998107e-06 kunpo.Components.Animation.setTimeScale
0.00054177050599317 4.9999999998107e-06 kunpo.Components.DistanceWithNearPlay.updateSee
0.00054177050599317 4.9999999998107e-06 kunpo.Components.Movement.updateTemporarySpeedChanges
0.00054177050599317 4.9999999998107e-06 Manager.ObjectManager.pushIndexToNext
0.00054177050599317 4.9999999998107e-06 kunpo.Components.WeaponLogic.isAmmoEnough
0.00054177050599317 4.9999999998107e-06 kunpo.Components.TailSmog.update
0.00043341640487153 4.0000000005591e-06 Manager.MapManager.getInstance
0.00043341640487153 4.0000000005591e-06 kunpo.Components.DamageReduction.getDamageReduction
0.00043341640467905 3.9999999987828e-06 Manager.BuffManager.update
0.00032506230355741 2.9999999995312e-06 kunpo.Components.Health.callChangeFuncs
0.00021670820243576 2.0000000002796e-06 kunpo.Components.Animation.playAnimation
0.00021670820243576 2.0000000002796e-06 kunpo.Components.WeaponLogic.getSuspendFire
0.00021670820243576 2.0000000002796e-06 kunpo.Components.LimitMove.setNeedExtrusion
0.00021670820243576 2.0000000002796e-06 kunpo.Components.WeaponLogic.getIsFiring
0.00021670820243576 2.0000000002796e-06 kunpo.Components.Movement.setSpeedDirection
0.00021670820243576 2.0000000002796e-06 kunpo.Components.StateList.update
0.00021670820243576 2.0000000002796e-06 kunpo.Components.Ammunition.getAmmunition
0.00021670820243576 2.0000000002796e-06 kunpo.Components.MessagePack.getLastMessage
0.00021670820243576 2.0000000002796e-06 kunpo.Components.StateMachine.getCurrentStateId
0.00021670820243576 2.0000000002796e-06 kunpo.Components.DistanceWithNearPlay.getNearPlayer
0.00021670820243576 2.0000000002796e-06 kunpo.Components.Collide.getPhysicRadius
0.00021670820224329 1.9999999985032e-06 kunpo.Components.BTFullFrame.removeBTNode
0.00021670820224329 1.9999999985032e-06 Manager.UpdateManager.pushIndexToNext
0.00021670820224329 1.9999999985032e-06 kunpo.Components.MessagePack.regetSleepTo
0.00021670820224329 1.9999999985032e-06 kunpo.map.SurfaceLayer.getTypeByCoord
0.00021670820224329 1.9999999985032e-06 Manager.ObjectManager.preUpdate
0.00010835410131412 1.000000001028e-06 kunpo.Components.Transformation.setDirection
0.00010835410131412 1.000000001028e-06 kunpo.Components.Transformation.getDirectionDegree
0.00010835410131412 1.000000001028e-06 kunpo.Components.DamageReduction.getDamageReductionPercentage
0.00010835410131412 1.000000001028e-06 kunpo.Components.Health.getIsDead
0.00010835410112164 9.999999992516e-07 Manager.MachineManager.getInstance
0.00010835410112164 9.999999992516e-07 kunpo.Components.RootNode.getRootNode
0.00010835410112164 9.999999992516e-07 Manager.ObjectManager.getPlayers
0.00010835410112164 9.999999992516e-07 kunpo.Components.LimitMove.getLimitType
0.00010835410112164 9.999999992516e-07 Manager.ObjectManager.getPlayerCount
0.00010835410112164 9.999999992516e-07 kunpo.Components.SkillBase.getSkillCd
0.00010835410112164 9.999999992516e-07 kunpo.Components.SkillBase.getDestroyMe
0.00010835410112164 9.999999992516e-07 Manager.TaskUIManager.getInstance
0 0 kunpo.Components.Surface.isValid
0 0 kunpo.Components.Movement.getSpeed
0 0 Manager.MachineManager.update
0 0 Manager.TaskUIManager.update
self._statistics_count
128 kunpo.Components.Transformation.getPosition
95 kunpo.Components.Buff.getAttribute
80 Manager.MapManager.getHeightByCoord
80 Manager.MapManager.isOutOfMapByCoord
79 Manager.MapManager.isValidMovementByHeight
73 kunpo.Components.EffectContainer.update
34 Manager.MapManager.getCoordByPosition
27 kunpo.Components.Height.getFlyHeight
27 kunpo.Components.Height.getHeight
21 kunpo.Components.Transformation.getHeight
20 Manager.ObjectManager.getInstance
15 Manager.MapManager.getTileInRect
15 kunpo.Components.Collide.getCollide
15 kunpo.Components.Transformation.getScale
15 Manager.MapManager.isValidMovement
15 kunpo.Components.Collide.isFloating
15 Manager.MapManager.isOutOfMap
13 kunpo.Components.FullFrameLogicalHosting.update
13 kunpo.Components.Transformation.getDirection
13 kunpo.Components.DistanceWithNearPlay.update
12 kunpo.Components.Transformation.setPosition
12 kunpo.Components.RootNode.update
11 kunpo.Components.Health.updateInvincible
11 kunpo.Components.LimitMove.relieveLimit
11 kunpo.Components.AutoZOrder.update
11 Manager.BuffManager.update
11 kunpo.Components.LimitMove.limitMove
11 kunpo.Components.Movement.updateTemporarySpeedChanges
11 kunpo.Components.Buff.update
11 Manager.BuffManager.postUpdate
11 kunpo.Components.Movement.getTemporarySpeedChange
11 Manager.MapManager.getMapSizeInPixel
11 Manager.BuffManager.getBuffComponent
11 kunpo.Components.Shadow.update
11 kunpo.Components.DistanceWithNearPlay.setNearPlayer
11 kunpo.Components.DistanceWithNearPlay.setDistanceWithNearPlayerSQ
11 kunpo.Components.Movement.update
11 kunpo.Components.Movement.getMoveSpeed
11 kunpo.Components.Health.updateAttackSource
11 Manager.BuffManager.perUpdate
11 kunpo.Components.Collide.setPositionAndDir
11 kunpo.Components.Movement.clearReactionForceList
11 Manager.ObjectManager.getNearPlayer
11 kunpo.Components.Health.update
10 kunpo.Components.Animation.update
9 kunpo.Components.MessagePack.haveMessage
8 kunpo.Enemy.getIgnore
8 kunpo.Components.BTFullFrame.update
7 kunpo.map.BarrierLayer.getBarrierByCoord
5 kunpo.Components.MessagePack.removeMessage
5 Manager.MapManager.getInstance
5 kunpo.Components.Movement.getExtraForce
4 kunpo.Components.MessagePack.sortMessages
4 kunpo.Components.MessagePack.addMessageeOnly
4 kunpo.Components.MessagePack.addMessage
4 kunpo.Components.Movement.addExtraForce
4 kunpo.Components.MessagePack.regetSleepTo
3 kunpo.Components.LogicalHosting.update
3 kunpo.Components.DistanceWithNearPlay.getNearPlayer
3 kunpo.Components.MessagePack.update
3 kunpo.CommonsLogics.getCustomKey
3 kunpo.CommonsLogics.getNearPlayer
2 kunpo.Components.RootNode.getRootNode
2 kunpo.Components.Surface.update
2 kunpo.Components.AutoAdjustOrientation.update
2 kunpo.Components.WeaponLogic.getIsFiring
2 kunpo.Components.Movement.getSpeed
2 kunpo.map.SurfaceLayer.getTypeByCoord
2 kunpo.Components.Surface.isValid
2 kunpo.Components.Collide.getPhysicRadius
2 Manager.ObjectManager.getWorld
2 kunpo.Components.Collide.getPhysicPosition
2 kunpo.Components.LimitMove.setNeedExtrusion
2 kunpo.map.SurfaceLayer.getTypeByPosition
1 kunpo.Components.BattleState.RuningUpdate
1 kunpo.Components.Movement.setSpeedDirection
1 kunpo.Components.Ammunition.getAmmunition
1 kunpo.Components.MessagePack.getLastMessage
1 kunpo.Components.Animation.playAnimation
1 kunpo.Components.Health.getIsDead
1 Manager.ObjectManager.postUpdate
1 kunpo.Components.TailSmog.update
1 Manager.TaskUIManager.getInstance
1 Manager.TaskUIManager.update
1 Manager.UpdateManager.pushIndexToNext
1 kunpo.Components.Transformation.getDirectionDegree
1 kunpo.Components.DamageReduction.getDamageReduction
1 kunpo.Components.WeaponLogic.updateHolderDead
1 kunpo.Components.StateList.update
1 kunpo.Components.BTFullFrame.removeBTNode
1 Manager.MachineManager.update
1 Manager.MapManager.getHeightByPosition
1 kunpo.Components.EnemyRangeDamage.update
1 kunpo.Components.WeaponLogic.isAmmoEnough
1 kunpo.Components.SkillBase.getDestroyMe
1 Manager.MapManager.damageWallInRange
1 Manager.MachineManager.getInstance
1 kunpo.Components.DamageReduction.getDamageReductionPercentage
1 kunpo.Components.StateMachine.getCurrentStateId
1 kunpo.Components.SkillBase.update
1 kunpo.Components.WeaponLocalZOrderUpdate.update
1 kunpo.Components.Animation.setTimeScale
1 kunpo.Components.Health.reduceHp
1 kunpo.Components.Transformation.setDirection
1 kunpo.Components.DistanceWithNearPlay.updateSee
1 kunpo.Components.Health.hurt
1 Manager.ObjectManager.update
1 kunpo.Components.SkillBase.getSkillCd
1 Manager.MapManager.getBarrierLayer
1 kunpo.Components.Streak.update
1 kunpo.Components.LimitMove.getLimitType
1 Manager.ObjectManager.pushIndexToNext
1 Manager.ObjectManager.getPlayers
1 Manager.ObjectManager.getPlayerCount
1 kunpo.map.BarrierLayer.getBarrierByPosition
1 Manager.ObjectManager.getObjectsInRange
1 Manager.ObjectManager.damageInRange
1 Manager.UpdateManager.updateDestroy
1 kunpo.Components.Health.callChangeFuncs
1 kunpo.Components.WeaponLogic.getSuspendFire
1 Manager.UpdateManager.update
1 Manager.ObjectManager.preUpdate
這段信息分成了三段:
- 第一段是調用的樹型輸出,可以知道他們之間的調用關係。每個函數佔用父節點的時間比例,佔用總時間的時間比例、調用次數、函數名稱
- 第二階段是總共的函數調用時長比例。如果某個函數調用的時間太長。要麼就是他被調用的次數很多,要麼就是他的實現比較垃圾
- 第三階段是總共的函數調用次數排序。如果某一個函數調用次數比較多,那麼可以考慮減少這個函數的調用次數。方法可以自己想。
啊,還忘了樹形結構的實現
local TreeNode = class("TreeNode")
function TreeNode:ctor()
self._parent = nil
self._childs = {}
self._name = nil
self._data = nil
end
function TreeNode:setName(v)
self._name = v
end
function TreeNode:getName()
return self._name
end
function TreeNode:setParent(v)
self._parent = v
end
function TreeNode:getParent()
return self._parent
end
function TreeNode:addChild(v)
table.insert(self._childs, v)
end
function TreeNode:getChilds()
return self._childs
end
function TreeNode:getChildByName(name)
local data = nil
for _, item in ipairs(self._childs) do
if item:getName() == name then
data = item
break
end
end
return data
end
function TreeNode:clearChilds()
self._childs = {}
end
function TreeNode:setData(v)
self._data = v
end
function TreeNode:getData()
return self._data
end
kunpo.TreeNode = TreeNode
return TreeNode
這個很簡單的,我就不說了。
最後真的抱歉,我回頭想想。我還是沒有辦法。非常順暢的描述這個問題怎麼解決。寫作水平真的有限,湊合看吧。