Cocos2dx 2.1.4 游戏,Continuos FPS 下降且永不恢复

Posted

技术标签:

【中文标题】Cocos2dx 2.1.4 游戏,Continuos FPS 下降且永不恢复【英文标题】:Cocos2dx 2.1.4 Game, Continuos FPS drop and never recovers 【发布时间】:2013-10-22 08:57:24 【问题描述】:

我正在使用 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 仍然下降并且永远不会恢复。

请分享您对此的看法。

【问题讨论】:

【参考方案1】:

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

在您的情况下,我认为如果您只是通过一些基于时间的函数在屏幕外添加新形状,并且如果它们滚动到视图之外只需将它们从场景中删除,而不使用 batchNodes,会更好。

【讨论】:

我在上面,所以我将使用 CCSprite::create() 添加块。如果内存泄漏,FPS也会下降吗?两者之间有什么关系吗? 我刚刚意识到,使用批处理节点的整个想法是通过批处理节点滚动同时滚动所有形状,如果我不使用批处理节点,那么我将不得不滚动每个单独的形状,这很乏味。所以我必须使用批处理节点来检查你的建议,我将不得不更改很多代码。 好吧,您可以将它们添加到单独的 CCLayer,然后滚动这个。但是,计算正确的位置来生成元素会很乏味。您是否考虑过使用 CCMoveTo/CCMoveBy?另外,编写自己的更新函数来移动积木并不是一项艰巨的任务,另外,您将拥有时间控制,这将使您能够为不同的 FPS 提供相同的体验。【参考方案2】:

刚刚发现,每次触摸,我都会在图层中添加 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);

【讨论】:

以上是关于Cocos2dx 2.1.4 游戏,Continuos FPS 下降且永不恢复的主要内容,如果未能解决你的问题,请参考以下文章

cocos2dx游戏--欢欢英雄传说--添加游戏背景

Cocos2dx学习笔记12:cocos2dx进度条(ProgressTimer)

cocos2dx塔防游戏逻辑

cocos2dx 用啥工具开发

sublime_text 2.0.2 绑定cocos2dx lua 开发游戏

cocos2dx游戏开发学习笔记2-从helloworld開始