Getting an exact node count and performance issues in Swift/SpriteKit

时间:2016-09-01 19:24:39

标签: swift sprite-kit frame-rate

I'm making my first game with SpriteKit in which enemies come on screen from one side and pass through- going off screen on the other side. I noticed that later on in the game when different types of enemies are being rendered the FPS drops and the CPU usage approaches 100% (~95-99%). I wanted to know if there was a way to get the exact node count on scene (Not just ones rendered on screen), to tell if I wasn't properly removing them. I already have a global node counter that I update and it seems to work properly-- the total node count is generally consistent. Are there other things that I can do to try and debug this? Thanks!

3 个答案:

答案 0 :(得分:6)

您还可以创建SKNode的扩展名来计算从当前节点开始的子树中的所有节点。

extension SKNode {
    func subtreeCount() -> Int {
        return children.reduce(1) { $0 + $1.subtreeCount() }
    }
}

现在在你的场景中写下

let totalNodes = subtreeCount()

答案 1 :(得分:2)

这样的事情:

func childrenCount(node : SKNode) -> Int
{
    var count = 0
    for child in node.children
    {
        count += childrenCount(child)
    }
    count += node.children.count
    return count
}

print("Nodes: \(childrenCount(scene) + 1)")  //+ 1 to count scene

答案 2 :(得分:1)

调试游戏性能问题需要一些策略才能确定您的约束位置。出于好奇,您是在基于模拟器还是在设备上进行陈述?如果是模拟器,请注意即使您的节点数量不是特别高,您实际上也可以获得一些可怜的FPS和CPU使用率。因此,在查看性能时,您确实应该在设备上。

您已经有一些关于获取节点数的答案,所以我不打算回答那个部分。根据您管理节点的方式,您可能还需要考虑隐藏节点。当前的方法有答案的处理所有节点;是否可见(我知道q的一部分与计算所有节点有关)。如果您正在使用隐藏节点,那么您应该至少有2个与节点相关的指标:可见和总计。可能有用的另一个细分是节点"类型"以及节点使用的纹理。

进一步研究性能问题,您可能希望专注于运行仪器。特别是Time Profiler和OpenGL ES分析。您也可以在Xcode中使用GPU报告。运行Time Profiler时,如果您认为CPU使用率上升,我会让游戏运行几秒钟。这是为了让更多的样本点能够更容易地在有问题的区域进行磨练。

攻击帧速率可能在很大程度上取决于您构建和运行游戏的方式。例如,使用单个纹理与地图集,纹理的大小等。这些类型的设计决策确实会影响性能。

请记住,解决这些性能问题没有灵丹妙药。每个游戏的实现方式都不同,因此针对您的解决方案/方法可能不适合其他游戏。

如果您仍然陷入困境,建立一些禁用项目或使用更简化版本的机制总是有帮助的。这样,您可以关闭项目并查看帧速率的净效果。