获取类似于 SceneKit 的 showStatistics 的 SpriteKit 统计数据

Getting SpriteKit statistics similar to SceneKit's showsStatistics

我正在开发一款 SpriteKit 游戏,想对它做一些介绍。 SceneKit 在 SCNView 上有一个非常有用的 showsStatistics 属性 ,展开后会向我显示此图:

我将如何获取像 SpriteKit 游戏这样的每帧统计数据?我不太了解Instruments,但据我所知,Time Profiler模板仅显示累积函数时间,而Game Performance模板仅显示Metal的渲染时间。

非常感谢。

我发现路标功能对此很有用。

logging.swift中:

import Foundation
import os.log

extension OSLog {
  static var subsystem = Bundle.main.bundleIdentifier!
  static let poi = OSLog(subsystem: subsystem, category: .pointsOfInterest)
}

然后是场景:

class MyScene: SKScene {
  let signpostID = OSSignpostID(log: .poi)

  override func update(_ currentTime: TimeInterval) {
    os_signpost(.begin, log: .poi, name: "1_update", signpostID: signpostID)
    // update code here
    endOfUpdate()
  }

  /// Mark the end of the update phase and the start of actions
  func endOfUpdate() {
    os_signpost(.end, log: .poi, name: "1_update", signpostID: signpostID)
    os_signpost(.begin, log: .poi, name: "2_actions", signpostID: signpostID)
  }

  /// Mark the end of actions and the start of physics computations
  override func didEvaluateActions() {
    os_signpost(.end, log: .poi, name: "2_actions", signpostID: signpostID)
    os_signpost(.begin, log: .poi, name: "3_physics", signpostID: signpostID)
  }

  /// Mark the end of the render loop
  override func didFinishUpdate() {
    os_signpost(.end, log: .poi, name: "3_physics", signpostID: signpostID)
  }
}

然后使用兴趣点工具;我通常会将其添加到游戏性能配置文件中。您会为渲染循环的每个阶段标出区域。 (我从未使用过约束,所以更新结束和物理模拟结束在我的情况下是一致的,上面没有标记,但你可以覆盖 didSimulatePhysicsdidApplyConstraints 如果你需要在那里捕获更多细节。请参阅 https://developer.apple.com/documentation/spritekit/skscene/responding_to_frame-cycle_events)

处的渲染循环说明

您还可以在适当的位置添加其他路标。我将它们放入以标记各种游戏事件(例如,敌人生成、玩家被击中等)并标记我怀疑对性能很重要的代码部分的 start/end。 运行 在窗口模式下的工具下,到达游戏出现延迟问题的地步,然后立即停止跟踪。您可以查看跟踪以了解发生了什么。