macOS Sequoia下SpriteKit首次按方向键触发delta值突增问题
macOS Sequoia下SpriteKit首次按下方向键delta值突增问题
在macOS Sequoia系统的SpriteKit游戏中,首次按下方向键时会出现delta值突增的异常,后续按方向键无此问题,而WASD键不会触发该现象。
测试代码
// // GameScene.swift // import SpriteKit import GameplayKit class GameScene: SKScene { var lastTime: TimeInterval = 0 override func keyDown(with event: NSEvent) { print("---------------> delta keyDown: \(event.characters!) keyCode: \(event.keyCode)") } override func update(_ currentTime: TimeInterval) { // Called before each frame is rendered print("update begins") let dt: CGFloat if lastTime > 0 { dt = CGFloat(currentTime - lastTime) } else { dt = 1.0 / 60.0 } if dt > (1/30) { print("************************************ delta spike ", dt) } lastTime = currentTime print("dt: ", dt) print("update ends") } }
示例输出
update begins ************************************ delta spike 0.03381687504588626 dt: 0.03381687504588626 update ends update begins dt: 0.016670208307914436 update ends
解决方案
原因分析
macOS默认将方向键绑定了系统级UI操作(如窗口移动、滚动视图),首次按下方向键时,系统会执行额外的检测和处理逻辑,导致SpriteKit的update循环被短暂阻塞,从而出现delta值突增的情况。WASD键无此问题是因为它们没有绑定系统默认操作。
解决方法
在keyDown(with:)方法中处理方向键事件后,直接返回以告知系统该事件已被处理,阻止系统执行默认操作:
override func keyDown(with event: NSEvent) { // 方向键对应的keyCode:左(123)、右(124)、下(125)、上(126) let directionKeyCodes: [UInt16] = [123, 124, 125, 126] if directionKeyCodes.contains(event.keyCode) { print("---------------> delta keyDown: \(event.characters!) keyCode: \(event.keyCode)") return // 阻止系统处理方向键的默认行为 } // 非方向键事件交给父类处理 super.keyDown(with: event) }
修改后,系统不会再对方向键执行默认操作,首次按下时的额外延迟被消除,update循环的时间间隔将恢复正常。
内容的提问来源于stack exchange,提问作者Chris Tucker
相关产品推荐
相关产品推荐

