FPS在SpriteKit中下降

int*_*_32 13 ios sprite-kit swift

我正在用Swift和SpriteKit开发一个简单的游戏,我注意到FPS从60降到58-59(以及后退).发生丢弃时会出现明显的延迟 - 看起来像丢弃了1或2帧.

CPU负载大约为20-25%并且变化不大,内存使用量永久约为8 MB.

截图: 应用截图

屏幕上有6个对象:标签,红色对象(Sprite),2x绿色对象(Sprite),一个框(Sprite)和"ground"(Rect形状节点).

除标签外的所有对象都有物理主体(以白色边框显示).

动态创建绿色和白色对象,从右向左移动并在屏幕外时销毁:

func scheduleAddingLiquid() {
let wait = SKAction.waitForDuration(NSTimeInterval(getRandomNumber(1, end: 3)))
        let block = SKAction.runBlock({
            [unowned self] in

            let liquidNode = LiquidNode(texture: self.liquidTexture, sceneFrame: self.frame)
            self.addChild(liquidNode)
            liquidNode.move()

            self.scheduleAddingLiquid()
        })

        let sequence = SKAction.sequence([wait, block])
        runAction(sequence)
Run Code Online (Sandbox Code Playgroud)

和:

func move() {
        let moveAction = SKAction.moveToX(-frame.width, duration: NSTimeInterval(3))
        let removeBlock = SKAction.runBlock({
            [unowned self] in

            self.removeFromParent()
            })

        runAction(SKAction.sequence([moveAction, removeBlock]))
    }
Run Code Online (Sandbox Code Playgroud)

屏幕触摸时红色物体"跳跃":

if touches.count > 0 && isHeroOnGround && heroNode != nil {
            isHeroOnGround = false
            heroNode.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
            heroNode.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 400))
        }
Run Code Online (Sandbox Code Playgroud)

滞后发生在"跳跃"之后的随机时间间隔内(跳跃后约0.5至1.5秒).

当发生碰撞时,就会发生滞后,就在红色物体"在空中"时.并不是每次跳跃都会发生.当FPS下降时,CPU负载不会增加.

在iOS 9.3,iPad mini 2上测试过.

更新1.在iOS 9.3 iPhone 6上测试 - 前几秒FPS约为50-55,然后它一直是60,没有滞后.因此,它仅落后于iPad mini 2(我只有这两款设备,无法测试其他设备).

UPD 2.除了红色图外,我已经注释掉了所有对象创建代码."跳跃"时它仍然落后.所以,现在我确定它与applyImpulse方法有关.

UPD 3.真的,非常奇怪:我已经从touchesBegan方法中删除了所有代码,但它仍然落后于触摸!该方法完全是空的.我不知道为什么,但如果我点击几次FPS下降...

如何调试?

Flu*_*ity 4

只有迷你电脑上出现问题才让我认为你的迷你电脑(或迷你电脑上的特定包装)有问题。尝试创建一个新项目,复制文件,然后再次运行它。另外,您说的是 9.3,但还有 9.3.1、9.3.2 等。这两种设备可能有不同的版本。

因此,首先,确保您的 iPhone 和 iPad 运行相同版本的 iOS。也许存在错误,或者可能他们修补了错误(从而导致一个可以工作,另一个不能工作)。

另外,尝试在不同的模拟器上运行它......如果它在模拟器上完美运行,那么我更加怀疑迷你(在其当前配置中)。

这样,您还可以查看问题是否(也许)与方向有关(iPhone 的宽屏与 4:3 或 iPad 的其他屏幕)。

有时,我的项目文件发生了“非常奇怪”的事情(即使没有插件),只是创建一个新项目,复制所有文件来修复它。如果当你点击一个空的“touchesBegan”时它出现滞后......让我觉得 Xcode / 你的 mini 手头有问题 - 因为它只发生在一台设备上(因此我们到目前为止知道)......

其他需要考虑的事情,

  1. 您使用的是哪个版本的 Xcode?尝试最新的测试版/返回 7.3。有什么区别吗?

  2. 您是否有另一台计算机可以尝试构建该项目?

  3. 如果换出[unowned self]或保留它没有解决任何问题,那么我的建议是用语句加载代码print并看看发生了什么。

  4. 如果您使用场景编辑器来制作精灵节点,请将它们全部删除并重新制作,或者尝试以编程方式制作它们。这修复了我的一些项目中的随机错误(似乎没有原因)。

我们需要更多代码/信息,但以上内容有望解决您的问题。