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

前端之家收集整理的这篇文章主要介绍了【cocos2dx】打印渲染树,一种用于检测内存泄漏及调试的思路前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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("\n乔巴大人: 用来输出渲染树,检测内存泄漏\n")
    file:write("\n======================= Render Node Tree Begin =======================\n")
    searchNodeTree(Stage.currentScene,1,file)
    file:write("\n======================= Render Node Tree End =========================\n")

    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,false)
        end
    end
end

function writeNode(level,nodeName,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,"[","]","\n"})
    file:write(str)
end

猜你在找的Cocos2d-x相关文章