1

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2012-04-07T08:16:16.617 回答
1

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

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

cocos2d 文档有一些最佳实践,它们都以某种方式触及性能。您可以做很多事情来优化每秒帧数。

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

于 2012-04-07T03:32:34.567 回答