我将游戏从android上移植到wp8,根据跟踪发现,系统给应用180M内存的限制,游戏运行以后,内存一直上升上升,到刚好超过180M以后,D3D这块就由于没有内存崩溃了。
哪位大侠有碰到过这个问题么?指点下迷津
我将游戏从android上移植到wp8,根据跟踪发现,系统给应用180M内存的限制,游戏运行以后,内存一直上升上升,到刚好超过180M以后,D3D这块就由于没有内存崩溃了。
哪位大侠有碰到过这个问题么?指点下迷津
你好,请您检查运行空应用是否有内存泄露,以便派出您自己的问题。或者使用内存检测工具来检查。
我用2个最简单的场景切换(一个场景包括一个CCScene, 一个CCLayer, CCSprite),不断的切换2个场景,我一直跟踪到最底层的CCObject, 发觉CCobject数量能够保持住,没有泄漏,但是内存却一直在增加
楼主不妨发代码上来
ccdatareaderhelper.cpp里面似乎确实有泄露
场景1Home,和场景 2 Other, 差别就是CCSprite里面的背景图不一样而已,在2个图之间不断点击屏幕进行切换
一下是lua部分关键代码
local M = {}
function M:create(params)
local scene = CCScene:create()
scene.name = “home”
local viewLayer = CCLayer:create()
local btn_grey_bg = CCSprite:create("image/bg2.png")
INIT_FUNCTION.setAnchPos(btn_grey_bg , 0 , 0)
viewLayer:addChild(btn_grey_bg)
scene:addChild( viewLayer )
local function onTouch(eventType , x , y)
if eventType == CCTOUCHBEGAN then
INIT_FUNCTION:switchScene("other")
return true
end
return true
end
viewLayer:registerScriptTouchHandler(onTouch)
viewLayer:setTouchEnabled(true)
return scene
end
return M
用的是2.2.3的版本,在CCObject的构造和析构里面跟踪,发觉切来切去,CCObject对象的个数能够保持稳定,应该是没有泄露,但是通过跟踪内存发现,使用内存会一直上升,不知道是哪里有泄露。
1、
void LabelBMFont::initRenderer()
{
_labelBMFontRenderer = cocos2d::CCLabelBMFont::create();
…
}
void LabelBMFont::setFntFile(const char *fileName)
{
…
_labelBMFontRenderer->initWithString("", fileName);
…
}
LabelBMFont的setFntFile函数中调用了方法initWithString,然而initRenderer里面已经调用过了这个方法(CCLabelBMFont::create())
导致这个方法调用了两次,有一次的资源无法释放
2、GUIReader的函数setPropsForLabelFromJsonDictionary中
label->setText(text);
bool fs = DICTOOL->checkObjectExist_json(options, “fontSize”);
if (fs)
{
label->setFontSize(DICTOOL->getIntValue_json(options, “fontSize”));
}
bool fn = DICTOOL->checkObjectExist_json(options, “fontName”);
if (fn)
{
label->setFontName(DICTOOL->getStringValue_json(options, “fontName”));
}
这里先调用了setText,后面接着调用了setFontSize,setFontName。殊不知,这里首先设置了text,会调用一次操作系统的文字绘图函数
后面的两个函数也都各自调用了一次操作系统的绘图函数,这样一共调用了3次文字绘制。
然而,这个操作的代价是及其昂贵的,如果调整下这几个函数的顺序,UI加载性能会有一个大幅度的提升,尤其是文字较多的面板
上面两个问题可以看出,写UI空间的开发人员并没有深入的了解cocos的一些内部机制,希望你们能够再用心一点。其实ui加载慢以前的json解析慢并不是主要原因。
这个问题也是一个比较大的原因。这个排除了,项目开发中把解析过的json缓存下,UI加载速度会大幅提升,如果再把控件的clone功能实现了,类似unity里面的prefab
,这样UI几乎不会有加载卡顿问题,常用的UI面板点击后立刻就会显示出来
六楼的优化不错
非常抱歉,这个帖子可能之前被忽略掉了。非常感谢您的建议,该问题已经提交到UI的负责人,我们将尽快验证并调整。
楼主,这些问题在2.x的时候确实存在,不过最新的v3.x的Label采用的是新的机制,不会出现这样的优化问题。