怎麼調試lua性能

怎麼調試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

這個很簡單的,我就不說了。

最後真的抱歉,我回頭想想。我還是沒有辦法。非常順暢的描述這個問題怎麼解決。寫作水平真的有限,湊合看吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章