入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

【cocos2dx】打印渲染树,一种用于检测内存泄漏及调试的思路

创建时间:2016-09-19 投稿人: 浏览次数:761

    cocos2dx引擎的渲染树算是引擎比较核心的数据结构了,在开发过程中如果能把渲染树打印出来,其实是可以做很多事情的,例如:检测是否有节点被创建了但是没有被removeFromParent;审视整个渲染树结构看看是否有渲染层级过多导致性能下降;bug调试等……

    我想的方案是用lua导出文件的方式,在导出文件中按层次把渲染树打印出来(当然,这个和框架封装相关),因此还解决了一个比较隐蔽的内存泄漏的bug,是项目组一哥们写的道具掉落,但是有一个if条件分支会导致道具掉落创建的节点没有被remove,造成节点堆积,从而内存泄漏。打印出的渲染树结构如下:



    我采取的方式是注册一个键盘按键事件,在某一个时间点按键打印当前渲染树,然后过一段时间再次按键,打印一份新的渲染树。使用beyondCompare或者其他比对工具对两次打印的渲染树进行比对,从而排查定位到明显创建了没有释放的节点,可以定位这一部分的内存泄漏。

    同时,打印完整的渲染树可以帮助了解当前渲染结构,可以针对性的去做一些优化或者bug修复,具体作用大家可以自行发挥想象力^_^,不过这里的打印方式依赖于项目框架,其实就是对cocos原生userdata在lua层进行了一个封装,构造了一个table的结构,便于lua层进行管理(这个框架肯定是不可以开源了,毕竟是公司商业项目),这里贴出用于打印渲染树的源码,主要是提供一种打印渲染树的思路,个人觉得比较方便,所以拿出来分享一下。相关lua代码如下:


-- 乔巴大人:用来输出渲染树,检测内存泄漏
function printNodeTree()
    local file = io.open("NodeTree.txt", "w")
    file:write("
乔巴大人: 用来输出渲染树,检测内存泄漏
")
    file:write("
======================= Render Node Tree Begin =======================
")
    searchNodeTree(Stage.currentScene, 1, file)
    file:write("
======================= Render Node Tree End =========================
")

    file:close()
end

function searchNodeTree(node, level, file)
    for index = 1, #node._children do
        local nextNode = node._children[index]

        if "table" == type(nextNode) and nil ~= nextNode._children and 0 ~= nextNode:getChildrenCount() then
            writeNode(level, tostring(nextNode._name), file, true)
            searchNodeTree(nextNode, level + 1, file)
        else
            writeNode(level, tostring(nextNode._name), file, false)
        end
    end
end

function writeNode(level, nodeName, file, hasChild)
    local str = ""

    for i = 1, level do
        str = "    " .. str
    end

    if true == hasChild then
        str = str .. "+"
    elseif false == hasChild then
        str = str .. "-"
    end

    str = table.concat({str, "[", level, "]", nodeName, "
"})
    file:write(str)
end


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。