Ios Cocos2dx 2.1.4游戏,持续FPS下降,永不恢复

Ios Cocos2dx 2.1.4游戏,持续FPS下降,永不恢复,ios,cocos2d-x,frame-rate,ccspritebatchnode,Ios,Cocos2d X,Frame Rate,Ccspritebatchnode,我正在使用cocos2dx2.1.4创建一个游戏。它的FPS持续下降,而且永远不会恢复。 详情如下: 关于我做事方式的背景:- 它的游戏是关于向下滚动一些形状,每个形状由一些方块组成。我有7种方块。全部加载到一个精灵表中,并使用这个精灵表中的这些块创建一个形状。 级别文件由这些形状组成。我同时加载两个级别,一个在屏幕上,另一个在屏幕外,以使其无缝滚动。同时加载两个级别时,我使用了两个不同的CCSprite游戏批处理节点,如下所示:- CCSpriteFrameCache::sharedSpr

我正在使用cocos2dx2.1.4创建一个游戏。它的FPS持续下降,而且永远不会恢复。 详情如下:

关于我做事方式的背景:- 它的游戏是关于向下滚动一些形状,每个形状由一些方块组成。我有7种方块。全部加载到一个精灵表中,并使用这个精灵表中的这些块创建一个形状。 级别文件由这些形状组成。我同时加载两个级别,一个在屏幕上,另一个在屏幕外,以使其无缝滚动。同时加载两个级别时,我使用了两个不同的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> 我使用了时间分析器,它显示了draw()调用中的最大时间。另外,如果我玩游戏速度很快,时间的峰值会在赛道上增加,这应该很好,因为我要做更多的工作,但一旦达到峰值,它只会保持在该高度,即使我让游戏闲置。这正常吗?根据我的说法,一旦当前的工作完成,它应该会回到正常的峰值

2> 有些地方我认为它发生了,因为我使用了两个批处理节点,并且在用户触摸时立即删除了它的子节点,这可能会导致它运行缓慢,但在删除子节点后,它应该正常运行。给出一个想法,立即从批处理节点中删除10个子节点可以吗?有些人说这是一个非常缓慢的过程。为了检查这是否会导致问题,我做了:-

我并没有删除它们,而是将子对象的可见性设置为false。但FPS仍然会下降,并且永远不会恢复


请分享您的想法。

尽管SpriteBatchNodes通常非常适合高效地绘制大量元素,但我认为最好将其用于静态/不太动态的元素。在您的情况下,如果有许多元素离开屏幕但仍然处于活动状态,
draw()
函数将必须进行一些检查,从而占用您的性能(即使您显式地设置
isVisible(false);
它仍然需要检查)


在你的例子中,我认为如果你只是通过一些基于时间的功能在屏幕外添加新的形状会更好,如果它们在视图外滚动,只需将它们从场景中删除,而不使用batchNodes。

刚刚发现,每次触摸,我都会向层中添加8个新的精灵,并且每次触摸都会添加。所以随着时间的推移,我要做的工作越来越多。这就是问题所在

实际上,我想用触控来替换8处的精灵,每次都是这样:-

_colorBottom1=CCSprite::createWithSpriteFrameName(png[0]);
    this->addChild(_colorBottom1,kForeground);
    _colorBottom1->setPosition(ccp((_colorPanelLeftPad)*_blockWidth,_blockWidth));
这使得每次触摸都会添加这个精灵

但它应该是(替换纹理而不是再次创建精灵):-


我在上面,所以我将使用CCSprite::create()添加块。如果内存泄漏,FPS是否也会下降?这两者之间有什么关系吗?我刚刚意识到,使用批处理节点的整个想法是使用批处理节点滚动同时滚动所有形状,如果我不使用批处理节点,那么我将不得不单独滚动每个形状,这很乏味。所以我必须使用批处理节点,为了检查您的建议,我必须更改许多代码。好的,您可以将它们添加到单独的CCLayer,并滚动此层。但是,计算生成元素的正确位置将是一件乏味的事情。您是否考虑过使用CCMoveTo/CCMoveBy?另外,编写自己的更新函数来移动块并不是一项很难的任务,另外,您将拥有时间控制,这将使您能够为不同的FPS提供相同的体验。
CCSpriteFrame *frame1=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(png0);
_colorBottom1->setDisplayFrame(frame1);