0

我正在使用 cocos2dx 2.1.4 创建游戏。它的FPS不断下降,永远不会恢复。请找到以下详细信息

关于我做事方式的背景:- 它关于向下滚动一些形状的游戏,每个形状由一些方形块组成。我有 7 种块。全部加载到 Sprite 表中,并使用此 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> 我使用了时间分析器,它显示最大时间在 draw() 调用中。此外,如果我玩游戏的速度非常快,赛道上的时间峰值会增加,这应该没问题,因为我要做更多的工作,但是一旦达到峰值,即使我让游戏闲置,它也只会保持在那个高度。正常吗?根据我的说法,一旦当前的工作完成,它应该会恢复到正常的峰值。

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

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

请分享您对此的看法。

4

2 回答 2

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);
于 2013-10-22T13:16:35.773 回答
0

虽然 SpriteBatchNodes 通常非常适合有效地绘制大量元素,但我认为最好用于静态/非动态元素。在您的情况下,如果您有很多元素离开屏幕但仍然存在,则该draw()功能将不得不进行一些检查,从而占用您的性能(即使您isVisible(false);明确设置,它仍然需要检查)。

在您的情况下,我认为最好通过一些基于时间的功能在屏幕外添加新形状,并且如果它们滚动到视图之外,只需将它们从场景中删除,而不使用批处理节点。

于 2013-10-22T09:40:13.067 回答