You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 16:17:31