【问题标题】:What causes frame rate loss?是什么导致帧率丢失?
【发布时间】:2009-06-21 00:03:47
【问题描述】:

我正在用 cocos2d 编写游戏,我注意到帧速率随着游戏的进行而下降。我检查了是否有泄漏,但一切看起来都很好,所以我不知道下一步该怎么做。对不起,如果这是一个非常基本的问题,但是什么样的因素会导致帧率丢失?

当我从图层中清除精灵时,问题似乎变得更糟。有时帧率会跳回 60,但偶尔会下降到 30 或更低,并且永远不会恢复。几分钟后,动画明显变慢,游戏几乎停止了。我不确定这是 cocos2d 特有的还是游戏开发中的常见问题,但它会使游戏无法玩:(

【问题讨论】:

    标签: iphone cocos2d-iphone frame-rate


    【解决方案1】:

    您如何测试内存泄漏?在您完全确定之前,我认为您不应该将其排除为原因,因为这听起来像是经典的“内存泄漏行为”。

    还要确保你没有像日志这样的东西,或者内存中每帧都在不断变大的东西(我这么说是因为我过去也发生过这种情况)。

    同时确保您不会随着游戏的进行不断地加载新的对象和/或精灵。尝试将所有加载调用保留在逻辑的初始化部分。

    【讨论】:

    • 我正在使用泄漏工具工具。经过更仔细的检查,我确实发现了一个漏洞,结果发现其他人在 cocos2d 粒子系统中也遇到了类似的问题。 cocos2d-iphone.org/forum/topic/177感谢您的建议,我会留意更多的陷阱。
    • 小心累积操作。每个人都会想到内存泄漏,但真正的问题是导致系统做更多工作的“操作泄漏”。 额外的工作会减慢它的速度,无论是绘图操作还是内存分配操作。我最近在按钮上绘制矩形边框之前忘记在 Flash 中调用 Graphics.clear,并且想知道为什么当我与它交互时光栅化阶段花费的时间越来越长。 Graphics 类的 draw* 方法是累积的,因此它最终尝试在自身上绘制一个填充的圆角矩形数十次。
    【解决方案2】:

    如果你添加更多精灵,你的帧率将会下降,显然,因为它需要处理更多。

    现在,我对 cocos2d 一无所知,但是当您“从图层中清除精灵”时,听起来好像除了存储它们现在隐藏的事实之外,它只是将它们隐藏在视图之外。

    也许尝试使用更少的精灵?

    【讨论】:

      【解决方案3】:

      您是否在重复使用预加载的纹理?如果你不是,你应该。一次又一次地加载相同的纹理既慢又是泄漏。

      此外,您是否发布了已完成的纹理?即使精灵消失了,纹理仍然存在。

      【讨论】:

        【解决方案4】:

        我最近在使用 Flash 时遇到了一个问题,该问题涉及图形光栅化的逐渐减慢,因此这里可能会发生类似的事情。当系统必须执行太多工作时,通常会出现减速。内存泄漏是显而易见的,因为内存的过度分配和碎片从来都不是好事,但考虑一下:

        我发现我忘记在 Graphics 对象上调用“clear”,所以每次我重绘精灵的边框时,它都会绘制另一个圆角矩形,并且绘制命令是累积的。经过几十次交互后,它在自身上绘制了这个填充的圆角矩形一百次。着色器、代码等都占用了不到 1% 的渲染时间,但过度光栅化正在扼杀我的帧率。

        所以我建议检查对象创建、忘记清除东西、绘制方法等。确保系统没有做不必要的工作或积累不必要的操作,而不仅仅是内存对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-05
          • 2021-01-17
          • 2010-09-08
          • 2018-11-26
          • 2014-03-25
          • 1970-01-01
          • 2011-04-04
          • 2021-06-17
          相关资源
          最近更新 更多