在 Swift/SpriteKit 中获取确切的节点数和性能问题
Getting an exact node count and performance issues in Swift/SpriteKit
我正在使用 SpriteKit 制作我的第一款游戏,其中敌人从屏幕的一侧进入屏幕并通过 - 从另一侧离开屏幕。我注意到在游戏后期,当渲染不同类型的敌人时,FPS 下降并且 CPU 使用率接近 100%(~95-99%)。我想知道是否有办法获得场景中的确切节点数(不仅仅是屏幕上呈现的节点数),以判断我是否没有正确删除它们。我已经有一个我更新的全局节点计数器,它似乎工作正常——总节点数通常是一致的。我可以做其他事情来尝试调试它吗?谢谢!
像这样:
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
你也可以创建SKNode
的扩展来计算从当前节点开始的子树中的所有节点。
extension SKNode {
func subtreeCount() -> Int {
return children.reduce(1) { [=10=] + .subtreeCount() }
}
}
现在在你的场景中简单地写
let totalNodes = subtreeCount()
调试游戏的性能问题需要一些策略以确定您的局限性。出于好奇,您的陈述是基于模拟器还是基于设备?如果是模拟器,请注意即使您的节点数不是特别高,您实际上也可以获得一些糟糕的 FPS 和 CPU 使用率。因此,在查看性能时,您确实应该在设备上。
关于获取节点数,您已经有了一些答案,所以我不打算回答那部分。根据您管理节点的方式,您可能还需要考虑隐藏节点。目前有答案的方法处理所有节点;可见与否(我知道 q 的一部分与计算所有节点有关)。如果您正在使用隐藏节点,那么您应该至少有 2 个与节点相关的指标:可见和总计。另一个有用的细分是节点 "types" 以及节点使用的纹理。
进一步研究性能问题,您可能希望关注 运行ning 工具。特别是 Time Profiler 和 OpenGL ES Analysis。您还可以使用 Xcode 中的 GPU 报告。当 运行 使用 Time Profiler 时,当您认为 CPU 使用率上升时,我会让游戏 运行 持续几秒钟。这是为了允许更多的样本点更容易地在有问题的区域进行磨练。
攻击帧速率在很大程度上取决于您构建和运行游戏的方式。例如,使用单独的纹理与图集、纹理的大小等。这些类型的设计决策确实会影响性能。
请记住,解决这些性能问题没有灵丹妙药。每个游戏的实现方式都不同,因此适合您的 solution/approach 可能不适合其他游戏。
如果您仍然遇到困难,建立某种机制来禁用项目或使用它们的更简化版本总是有帮助的。这样您就可以关闭项目并查看对帧速率的净影响。
我正在使用 SpriteKit 制作我的第一款游戏,其中敌人从屏幕的一侧进入屏幕并通过 - 从另一侧离开屏幕。我注意到在游戏后期,当渲染不同类型的敌人时,FPS 下降并且 CPU 使用率接近 100%(~95-99%)。我想知道是否有办法获得场景中的确切节点数(不仅仅是屏幕上呈现的节点数),以判断我是否没有正确删除它们。我已经有一个我更新的全局节点计数器,它似乎工作正常——总节点数通常是一致的。我可以做其他事情来尝试调试它吗?谢谢!
像这样:
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
你也可以创建SKNode
的扩展来计算从当前节点开始的子树中的所有节点。
extension SKNode {
func subtreeCount() -> Int {
return children.reduce(1) { [=10=] + .subtreeCount() }
}
}
现在在你的场景中简单地写
let totalNodes = subtreeCount()
调试游戏的性能问题需要一些策略以确定您的局限性。出于好奇,您的陈述是基于模拟器还是基于设备?如果是模拟器,请注意即使您的节点数不是特别高,您实际上也可以获得一些糟糕的 FPS 和 CPU 使用率。因此,在查看性能时,您确实应该在设备上。
关于获取节点数,您已经有了一些答案,所以我不打算回答那部分。根据您管理节点的方式,您可能还需要考虑隐藏节点。目前有答案的方法处理所有节点;可见与否(我知道 q 的一部分与计算所有节点有关)。如果您正在使用隐藏节点,那么您应该至少有 2 个与节点相关的指标:可见和总计。另一个有用的细分是节点 "types" 以及节点使用的纹理。
进一步研究性能问题,您可能希望关注 运行ning 工具。特别是 Time Profiler 和 OpenGL ES Analysis。您还可以使用 Xcode 中的 GPU 报告。当 运行 使用 Time Profiler 时,当您认为 CPU 使用率上升时,我会让游戏 运行 持续几秒钟。这是为了允许更多的样本点更容易地在有问题的区域进行磨练。
攻击帧速率在很大程度上取决于您构建和运行游戏的方式。例如,使用单独的纹理与图集、纹理的大小等。这些类型的设计决策确实会影响性能。
请记住,解决这些性能问题没有灵丹妙药。每个游戏的实现方式都不同,因此适合您的 solution/approach 可能不适合其他游戏。
如果您仍然遇到困难,建立某种机制来禁用项目或使用它们的更简化版本总是有帮助的。这样您就可以关闭项目并查看对帧速率的净影响。