SKLightNode 性能问题
Posted
技术标签:
【中文标题】SKLightNode 性能问题【英文标题】:SKLightNode performance issues 【发布时间】:2014-08-15 02:30:19 【问题描述】:我一直在 SpriteKit 中试验SKLightNode
(ios8 中的新功能),即使在一个非常简单的测试用例中,我的性能也很糟糕。例如,在纯色SKSpriteNode
上使用单光源,我在第三代iPad上获得13.2 FPS强>。如果我添加第二个光源,它会下降到糟糕的 7.7 FPS。
WWDC 会议视频 SpriteKit 中的新功能 提到,如果您在同一个 sprite 上使用多个灯,您可能会获得低于 60 FPS,但我什至无法获得 60 FPS . Here's the relevant section.
这是我在 swift 中的测试场景(它从一个光源开始,可以通过点击添加更多):
class GameScene: SKScene
override func didMoveToView(view: SKView)
let center = CGPointMake(size.width / 2.0, size.height / 2.0)
let background = SKSpriteNode(color: SKColor.lightGrayColor(), size: size)
background.position = center
background.lightingBitMask = 1
addChild(background)
let light = SKLightNode()
light.position = center
light.falloff = 1.0
light.lightColor = SKColor(hue: 0.62 , saturation: 0.89, brightness: 1.0, alpha: 0.4)
light.shadowColor = SKColor.blackColor().colorWithAlphaComponent(0.4)
addChild(light)
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
for touch: AnyObject in touches
let location = touch.locationInNode(self)
let light = SKLightNode()
light.position = location
light.falloff = 1.0
light.lightColor = SKColor(hue: 0.62 , saturation: 0.89, brightness: 1.0, alpha: 0.4)
light.shadowColor = SKColor.blackColor().colorWithAlphaComponent(0.4)
addChild(light)
以下是它在我的第三代 iPad 上运行的一些屏幕截图:
这是在使用单个光源运行时单击“分析”按钮后性能选项卡的外观:
这显然是受 GPU 限制的,但我想弄清楚的是,我是否只是在做一些可怕的错误,或者这只是测试版的一个问题,(希望)会在发布时得到解决。我目前正在使用 Xcode6-Beta5。
更新
我将我的 iPhone 5S 升级到 iOS8 并在那里尝试了同样的事情,它在 60FPS 和 8 个光源下运行得非常好。所以,我想这只是第三代 iPad 的 GPU 无法胜任任务的问题。我会在下一个测试版发布后重试,看看是否有任何变化,以防万一。
【问题讨论】:
您是否尝试过运行时间分析器来查看减速在哪里? 我在运行分析器后添加了性能选项卡的屏幕截图。这绝对是受 GPU 限制的东西,但这都是 SpriteKit 本身提供的(我没有任何自定义着色器或任何东西),所以我不知道我是否能做些什么。 如果提前配置和添加SKLightNode
,然后隐藏呢?然后在touchesBegan
中显示它?
(如果实际初始化成本很高,这将有所帮助。)
@JackC 我在我的第三代 iPad 的实际设备上运行它(我认为这与 iPad 3 不同)。我没有其他应用程序正在运行。也许我的硬件太旧了?我将尝试将我的 iPhone 5S 升级到 iOS8,看看它是如何运行的。
【参考方案1】:
这最终只是第三代 iPad 上的 GPU 无法完成使用SKLightNode
s 的任务。我现在使用当时最新版本的 Xcode(iOS 8.1 的版本 6.1 (6A1052d))在 iOS 8 和 iOS 8.1 上进行了测试,结果相同。我的测试代码在具有 8 个光源的 iPhone 5s 上以 60FPS 的速度运行,因此代码本身似乎不是问题。
【讨论】:
以上是关于SKLightNode 性能问题的主要内容,如果未能解决你的问题,请参考以下文章
Spritekit 游戏崩溃(因为 SKLightNode 线程问题?)