【问题标题】:Cocos2d moving nodes is choppyCocos2d 移动节点断断续续
【发布时间】:2012-04-07 03:19:07
【问题描述】:

在我即将推出的 iPhone 游戏中,不同的场景元素被拆分为各自的 CCNode。

我的障碍节点包含许多节点,每个节点代表一个障碍。每个障碍物节点内都有构成障碍物的图像(1 - 4 个图像),一次只有约 10 个障碍物。我的游戏每次更新都会调用 Obstacle 节点中的更新函数,它将所有障碍物移到左侧。但这大大减慢了我的游戏速度。

同时,我有一个粒子节点,它只包含图像,并在每一帧都移动它们,就像 Obstacle 节点一样,但它对性能没有明显影响。但它一次有数百张图片。

我的问题是为什么障碍物减慢了它的速度,而粒子却没有?我什至尝试用粒子中的图像替换障碍物中使用的图像,这没有(明显的)区别。会不会又多了一层子节点?

【问题讨论】:

  • 强制性警告(尽管@andrewx 下面的观点非常有效)。您是从您在模拟器或设备上看到的结果中报告的吗?在我的一个游戏中,FPS 为 12,并且在模拟器上的波动令人讨厌,但在 iPod touch 上一切都很好。

标签: objective-c ios cocos2d-iphone


【解决方案1】:

如果您将所有图像放入纹理图集中并使用CCSpriteBatchNode 类将它们作为批处理渲染一次,您将显着提高应用程序的性能、运行速度、帧速率等。如果您在屏幕上频繁移动大量对象,这会使硬件的工作量大大减少。

使用这个类很容易。使用包含所有图像的纹理图集创建该类,然后将该类作为子级添加到您的图层,就像添加精灵一样。

但是,当您创建精灵时,请将它们作为子节点添加到此批处理节点,而不是作为子层添加到图层。

这很容易,在这里可能会对您有很大帮助。

【讨论】:

    【解决方案2】:

    根据我对 Cocos2d 文档的回忆,粒子的设计目的是非常轻量级,因此您可以同时在屏幕上显示许多粒子。节点更重,需要在帧之间进行更多处理,因为它们与物理系统交互并且需要特定于节点的渲染。上次我查看渲染循环代码时,基本上是 O(n),基于场景中的 CCnode 数量。使用 NSTimers 与 Cocos 的内置运行循环在性能上也有相当大的差异。

    您能举一个速度慢很多的例子吗?究竟如何更新这些障碍?

    cocos2d 文档有一些best practices,所有这些都以某种方式触及性能。您可以做很多事情来优化每秒帧数。

    一般来说,当您的代码运行缓慢时,使用 Instruments.app 来确定您的代码在哪里花费了这么多时间会有所帮助。由于您使用的是框架,这将不太有用,因为您最终会找出代码花费大量时间的功能,然后找出如何通过框架的最佳实践或其他优化来减少它。有几篇关于提高性能的好博文,我发现this one 很有帮助。

    【讨论】:

    • 好的,我编辑了代码以添加普通精灵而不是障碍物对象,它运行得更加顺畅。一定是节点级别太多了。但我不能只使用图像,障碍物都是随机的、动画的,并且行为不同。有没有使用节点的替代方法?
    • 嗯,CCSprite 继承自 CCNode —— 几乎所有被绘制的东西都会在某些时候继承自 CCNode。您可能希望在几乎所有动画中都使用 CCSprite,但这并不重要。
    • 我将其更改为在 Obstacle 节点内保留一个 NSMutableArray 障碍物,它引用放置在 Obstacle 节点中的 CCSprite 对象。它工作得更顺利。
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2016-12-24
    相关资源
    最近更新 更多