Swift 可牵引延迟,导致稳态延迟

Swift 可牵引延迟,导致稳态延迟,swift,metal,Swift,Metal,我有一个小小的Swift游乐场,它使用一个金属计算内核在每次鼠标移动时绘制纹理。计算内核运行得非常快,但由于某种原因,当我开始拖动鼠标时,系统中会出现一些未知的延迟,最终每个鼠标移动事件的结果会在收到事件后显示多达4帧 我所有的代码都在这里: 我将这段代码复制到一个示例应用程序中,并在鼠标事件处理程序周围添加了一些os\u路标s,以便在仪器中对其进行分析。我看到的是,第一个鼠标拖动事件很快完成了计算工作,但“surface queued”事件直到一个多帧后才发生。一旦曲面排队,它实际上不会在下一

我有一个小小的Swift游乐场,它使用一个金属计算内核在每次鼠标移动时绘制纹理。计算内核运行得非常快,但由于某种原因,当我开始拖动鼠标时,系统中会出现一些未知的延迟,最终每个鼠标移动事件的结果会在收到事件后显示多达4帧

我所有的代码都在这里:

我将这段代码复制到一个示例应用程序中,并在鼠标事件处理程序周围添加了一些
os\u路标
s,以便在仪器中对其进行分析。我看到的是,第一个鼠标拖动事件很快完成了计算工作,但“surface queued”事件直到一个多帧后才发生。一旦曲面排队,它实际上不会在下一个vsync中显示,而是在下一个vsync中显示

第二个鼠标拖动事件的曲面在计算完成后立即排队,但由于上一帧延迟,它现在被困在等待另一个vsync。在几帧之后,延迟构建和后续帧必须等待很长时间才能使用drawable,然后才能执行任何工作。在稳定状态下,我看到事件处理程序与最终呈现可绘制文件之间有大约4帧的延迟

  • 是什么导致了这些最初的延迟?我能做些什么来减少这些延迟
  • 有没有一种简单的方法来防止延迟加剧,例如告诉系统自动丢弃帧

  • 我仍然不知道最初的延迟是从哪里来的,但我找到了一个解决方案来防止延迟加剧

    原来我对鼠标事件的假设是错误的。在我的测试中,鼠标拖动事件之间的间隔通常小于8毫秒,有时甚至小于3毫秒,而屏幕的更新间隔约为16.67毫秒。因此,在每次鼠标拖动事件上渲染场景的想法从根本上说是有缺陷的

    解决此问题的一个简单方法是跟踪排队的绘图,如果另一个可绘图项仍在排队,则不再开始绘图。例如,类似于:

    var queuedDraws=0
    //鼠标事件处理程序:
    如果queuedDraws>1{
    return//跳过此帧
    }
    queuedDraws+=1
    //绘图时
    drawable.addPresentedHandler{uuIn
    queuedDraws-=1
    }