我正在使用cocos2dx 2.1.4创建游戏。它的FPS持续下降,永不复苏。 请查看以下详细信息
关于我做事的方式的背景: - 它的游戏是关于向下滚动一些形状,每个形状由一些方块组成。我有7种块。全部加载到Sprite Sheet中并使用这个sprite表中的这些块创建一个形状。 级别文件由这些形状组成。我同时在屏幕上和另一个屏幕上加载两个级别,以使其无缝滚动。为了同时加载两个级别,我使用了两个不同的CCSprite游戏批处理节点: -
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("56blackglow.plist");
_gameBatchNode1 = CCSpriteBatchNode::create("56blackglow.png", 200);
_gameBatchNode1->retain();
this->addChild(_gameBatchNode1,kForeground);
_gameBatchNode2= CCSpriteBatchNode::create("56blackglow.png", 200);
_gameBatchNode2->retain();
this->addChild(_gameBatchNode2,kForeground);
我面临的问题是,随着我继续玩游戏帧速率不断下降,从60 fps到10 fps并且永远无法恢复或者可能在不久的将来恢复,因为我观察了20分钟,但它的时间过长了等待。
我的观察: -
1>我使用Time profiler它显示draw()调用的最长时间。此外,如果我非常快地玩游戏,时间的高峰会在赛道上增加,这应该没问题,因为我正在做更多的工作,但是一旦达到峰值,它仍然只是在那个高度,即使我离开游戏空闲。这是正常的吗?据我所知,一旦目前的工作完成,它应该恢复到正常的峰值。
2 - ;一些我认为它发生的地方因为我使用了两个批处理节点并立即在用户触摸时移除它的子节点可能会导致它变慢但是在移除子节点后它应该正常运行。给出一个想法是否可以立即从批处理节点中删除10个孩子?有些人说它的过程很慢。为了检查这是否导致问题,我做了: -
而不是删除它们我只是将子项的可见性设置为false。但仍然FPS下降并且永远不会恢复。
请分享您的想法。
答案 0 :(得分:0)
虽然SpriteBatchNodes通常非常适合有效地绘制大量元素,但我认为最好用于静态/不那么动态的元素。在您的情况下,如果您有很多元素离开屏幕但仍处于活动状态,draw()
函数将不得不进行一些检查,从而影响您的性能(即使您明确设置isVisible(false);
,它仍然需要检查)。
在你的情况下,我认为如果你只是通过一些基于时间的功能在屏幕之外添加新形状会更好,如果它们在视图之外滚动,只需从场景中删除它们,而不使用batchNodes。
答案 1 :(得分:0)
刚刚发现,每次触摸时,我都会在图层中添加8个新精灵,并且每次触摸都会添加它。所以随着时间的推移,我正在做更多的工作。这是问题
实际上我想用触摸替换8个地方的精灵,就像我每次都这样做: -
_colorBottom1=CCSprite::createWithSpriteFrameName(png[0]);
this->addChild(_colorBottom1,kForeground);
_colorBottom1->setPosition(ccp((_colorPanelLeftPad)*_blockWidth,_blockWidth));
这导致每次触摸都会添加这个精灵。
但应该是(替换纹理而不是再次创建Sprite): -
CCSpriteFrame *frame1=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(png0);
_colorBottom1->setDisplayFrame(frame1);