【发布时间】:2015-10-09 16:44:02
【问题描述】:
我在使用 iOS9 时遇到了巨大的性能问题,我不知道该怎么办。我读过很多帖子——例如here 和here,但他们建议的解决方案没有帮助或没有什么不同。
我的游戏已从旧 iPad 2 (iOS 8.4) 上的 60fps 下降到新 iPad mini (iOS 9) 上的
我正在努力找出罪魁祸首。我很确定其中之一是 SKCropNodes。我通常在我的场景中渲染几个 SKCropNodes (6 - 18)。这在 iOS8 中从来都不是问题,但似乎 iOS9 虽然在裁剪方面做得更好,但这样做也会消耗性能。
如果我将裁剪节点渲染为普通的 SKSpriteNodes,我在旧设备上可能会获得 5fps,而在较新的 iPhone 6 上最多可以达到 30 帧。我别无选择,只能使用裁剪节点,但这不是问题的全部。
我认为可能使用了错误的纹理图集 - 即更大的分辨率之一。然而,强迫我的设备使用一个非常小的图集并没有什么不同。
我正在使用 Texture Packer 为不同设备生成带有缩放变体的图集。我注意到 XCAssets 现在具有添加 Sprite Atlas 的选项(我似乎找不到任何关于此的文档)。这不适合我的游戏,因为我使用了 100 多个精灵。我尝试将我的地图集添加到 XCAssets,但由于某种原因,它不会使用缩放变体。尽管如此,对于低分辨率纹理,它仍然运行得非常糟糕。
我试过设置
skView.ignoresSiblingOrder = YES;
并给了我所有的节点 zPosition 值,但仍然没有效果。我还为每个图像名称添加了 .png 扩展名(最初是一个意味着它们不会呈现的问题。)
我的场景中有一些 SKEffectNode,但删除和添加这些似乎没有效果。
我不明白相同的硬件和相同的代码如何产生如此截然不同的结果。显然,Apple 已经改变了一些与渲染有关的东西,这已经产生了不利影响。他们似乎也无意解决这些问题。我知道这个问题上的错误已经存在了几个月——早在 iOS9 发布之前。
我已经在这个游戏上工作了 2 年了,只是在 iOS9 之前才发布它。它现在正遭受糟糕的性能和经常崩溃的困扰。
有没有人弄清楚 Apple 究竟做了什么来扼杀性能?如果我知道这一点,我至少可以尝试解决它......谢谢。
更新
以下是同一场景的一些数据,其中包含游戏一次生成的绝对最大节点数。
iOS 8、iPad 2、~200 个节点、~100 次绘制、58.7 - 60 fps
iOS 9,iPhone6,~280 个节点,~216 次绘制,大约 20 fps
我认为节点数量的差异是由于屏幕尺寸不同。如果我在 iPhone 6 上更改场景以达到等效值,FPS 仍然在 24 左右。
更新 2
使用 Xcode 的模板 Sprite Kit 项目,并将宇宙飞船更改为包含宇宙飞船的 SKCropNode,在 iOS 8 上,我能够添加 100 艘没有帧速率问题的飞船。在 iOS 9 上,同样的项目,我可以在帧速率下降到
iPad2 上的 iOS 8:
iOS 9 iPhone 5:
就纹理图集的使用而言,正如我的评论中所说,我不能保证任何东西都来自同一个图集。我的游戏包含自定义角色,以及来自一系列图集的资产(每个图集包含约 100 个纹理)。屏幕上一次最多可以有 9 个字符。我知道这在平局方面不是最有效的,但直到 iOS9 之前我从来没有遇到过问题......
更新 3
我已向 Apple 提交了一个错误,包括我的示例程序。我还用完了我的一项技术支持请求。到目前为止,苹果没有任何消息。
【问题讨论】:
-
请使用相关性能信息更新您的问题,例如:8 vs 9 上的绘制调用次数和 FPS、8 vs 9 的仪器时间和 fps 配置文件等。
-
好的,我添加了更多信息。即使在同一场景中的 iPhone 6 与 iPad 2 上,性能也会受到巨大影响。
-
@Smikey 关于抽奖次数(与双抽问题无关)对于 200 个节点来说,即使 100 次抽奖也太多了。 .首先确保您正确使用地图集。阅读此内容以了解有关什么会破坏批处理过程的更多信息:stackoverflow.com/a/22856964/3402095。其次,您必须记住,SKLabelNode、SKShapeNode 和 SKCropNode 需要(至少)每个节点一个绘制调用。那些不能像SKSpriteNode那样批量绘制。
-
@Smikey 我很好奇。你提供的两张照片你得到了什么抽奖电话?你应该只得到一些。如果您已经为这两张照片提供了该信息,很抱歉没有看到它。还有那些来自实际设备的屏幕截图?
-
@Smikey 您能否链接到您正在展示并提交给 Apple 的测试项目的下载?
标签: objective-c performance sprite-kit ios9 xcode7