SKLightNode 性能问题

Posted

技术标签:

【中文标题】SKLightNode 性能问题【英文标题】:SKLightNode performance issues 【发布时间】:2014-08-15 02:30:19 【问题描述】:

我一直在 SpriteKit 中试验SKLightNodeios8 中的新功能),即使在一个非常简单的测试用例中,我的性能也很糟糕。例如,在纯色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 无法完成使用SKLightNodes 的任务。我现在使用当时最新版本的 Xcode(iOS 8.1 的版本 6.1 (6A1052d))在 iOS 8 和 iOS 8.1 上进行了测试,结果相同。我的测试代码在具有 8 个光源的 iPhone 5s 上以 60FPS 的速度运行,因此代码本身似乎不是问题。

【讨论】:

以上是关于SKLightNode 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit 游戏崩溃(因为 SKLightNode 线程问题?)

iOS 8 检测 SKSpriteNode 是不是被 SKLightNode 点亮

性能测试知多少——常见性能问题

怎样查出SQLServer的性能瓶颈

怎样查出SQLServer的性能瓶颈

PHP性能优化