绘制次数异常增加
draw count increasing abnormally
我目前正在开发一个在两个主屏幕A和B之间滚动的Sprite Kit游戏。A的位置是(0, 0),B的位置是(0, device_height)。
大多数时候,游戏是 运行 60fps,平局计数(由 SKView::showsDrawCount
属性 获得)为 8 或 10。
但是有时候,仅仅在B屏上,抽奖次数就会异常增加到70-80抽奖!
这里有一些事实:
- 我在显示 B 时不会删除 A 屏幕节点,因为 A 节点会继续影响物理。
- 我正在使用 SKTextureAtlas 并且为了优化目的在字典中预加载了所有纹理
- 即使移除装饰节点(粒子、背景),绘制计数也会增加。
- 当bug发生时,非剔除节点数显着增加(由
SKView::showsNodeCount
给出),但我的真实节点数(通过使用[node::children count]
递归找到)是稳定的。
有没有人遇到过问题,可以做哪些优化?
我怎样才能获得有关这些抽奖的更多信息,看看它们来自哪里?
谢谢
编辑:
刚刚发现了一些非常有趣的东西。这是随时间变化的处理器使用情况,在屏幕 A 和 B 之间切换。我们可以看到某个线程 14 正在做很多事情!
好的,我找到了!
我使用一些 SKEffectNode
s 作为节点树的根,这些节点树从不改变,属性 shouldRasterize = YES
(为了缓存目的,我在网上看到了这个提示但我不记得在哪里。但现在我想知道这是否真的被挪用了......你怎么看?)。
我注意到这些节点的 shouldEnableEffects
属性在初始化后都设置为 YES,尽管 Apple 文档中有描述:
If the value of this property is YES, the effect node applies the
filter and blends the results. If the value is NO, the effect node is
ignored and its children are rendered normally. The default value is
NO.
显然 Apple 文档的默认值至少在 iOS8 上是错误的。
我认为疯狂的线程正在处理一些混合效果,因为在将每个 SKEffectNode::shouldEnableEffects
设置为 NO 之后,线程再也没有回来。但是我还是不明白为什么bug只出现在B屏
我目前正在开发一个在两个主屏幕A和B之间滚动的Sprite Kit游戏。A的位置是(0, 0),B的位置是(0, device_height)。
大多数时候,游戏是 运行 60fps,平局计数(由 SKView::showsDrawCount
属性 获得)为 8 或 10。
但是有时候,仅仅在B屏上,抽奖次数就会异常增加到70-80抽奖!
这里有一些事实:
- 我在显示 B 时不会删除 A 屏幕节点,因为 A 节点会继续影响物理。
- 我正在使用 SKTextureAtlas 并且为了优化目的在字典中预加载了所有纹理
- 即使移除装饰节点(粒子、背景),绘制计数也会增加。
- 当bug发生时,非剔除节点数显着增加(由
SKView::showsNodeCount
给出),但我的真实节点数(通过使用[node::children count]
递归找到)是稳定的。
有没有人遇到过问题,可以做哪些优化?
我怎样才能获得有关这些抽奖的更多信息,看看它们来自哪里?
谢谢
编辑:
刚刚发现了一些非常有趣的东西。这是随时间变化的处理器使用情况,在屏幕 A 和 B 之间切换。我们可以看到某个线程 14 正在做很多事情!
好的,我找到了!
我使用一些 SKEffectNode
s 作为节点树的根,这些节点树从不改变,属性 shouldRasterize = YES
(为了缓存目的,我在网上看到了这个提示但我不记得在哪里。但现在我想知道这是否真的被挪用了......你怎么看?)。
我注意到这些节点的 shouldEnableEffects
属性在初始化后都设置为 YES,尽管 Apple 文档中有描述:
If the value of this property is YES, the effect node applies the filter and blends the results. If the value is NO, the effect node is ignored and its children are rendered normally. The default value is NO.
显然 Apple 文档的默认值至少在 iOS8 上是错误的。
我认为疯狂的线程正在处理一些混合效果,因为在将每个 SKEffectNode::shouldEnableEffects
设置为 NO 之后,线程再也没有回来。但是我还是不明白为什么bug只出现在B屏