获取类似于 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)
}
}
然后使用兴趣点工具;我通常会将其添加到游戏性能配置文件中。您会为渲染循环的每个阶段标出区域。 (我从未使用过约束,所以更新结束和物理模拟结束在我的情况下是一致的,上面没有标记,但你可以覆盖 didSimulatePhysics
和 didApplyConstraints
如果你需要在那里捕获更多细节。请参阅 https://developer.apple.com/documentation/spritekit/skscene/responding_to_frame-cycle_events)
处的渲染循环说明
您还可以在适当的位置添加其他路标。我将它们放入以标记各种游戏事件(例如,敌人生成、玩家被击中等)并标记我怀疑对性能很重要的代码部分的 start/end。 运行 在窗口模式下的工具下,到达游戏出现延迟问题的地步,然后立即停止跟踪。您可以查看跟踪以了解发生了什么。
我正在开发一款 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)
}
}
然后使用兴趣点工具;我通常会将其添加到游戏性能配置文件中。您会为渲染循环的每个阶段标出区域。 (我从未使用过约束,所以更新结束和物理模拟结束在我的情况下是一致的,上面没有标记,但你可以覆盖 didSimulatePhysics
和 didApplyConstraints
如果你需要在那里捕获更多细节。请参阅 https://developer.apple.com/documentation/spritekit/skscene/responding_to_frame-cycle_events)
您还可以在适当的位置添加其他路标。我将它们放入以标记各种游戏事件(例如,敌人生成、玩家被击中等)并标记我怀疑对性能很重要的代码部分的 start/end。 运行 在窗口模式下的工具下,到达游戏出现延迟问题的地步,然后立即停止跟踪。您可以查看跟踪以了解发生了什么。