profile
viewpoint

Ask questionshs.window:move has inconsistent performance

I recently made a Spoon that lets you hold down cmd+shift and click-drag a window to move it around the screen: https://github.com/dbalatero/SkyRocket.spoon

<img src="https://github.com/dbalatero/SkyRocket.spoon/raw/master/doc/demo.gif" />

However, I (and other users) have noticed varying performance. Sometimes the window will animate smoothly on drag, and sometimes it acts really choppy.

Context

My code for moving the window listens for the leftMouseDragged event and handles it this way:

https://github.com/dbalatero/SkyRocket.spoon/blob/master/init.lua#L120-L143

I've added calls to measure how long window:move() takes, and I've found that the performance is usually around 15-25ms to execute a move(), but sometimes it spikes to the hundreds of milliseconds.

A usual quick drag operation might end up processing 20 of the leftMouseDragged events. When a few of these events have move() calls that take 200-800ms, it backs everything up and makes everything feel choppy.

For example, here's a drag operation I did that processed 13 sequential leftMouseDragged events

  • time is relative to when the drag first started
  • move is how long the call to move() took
  • dx and dy is how far the window was moved in that specific event
2021-07-27 11:10:25: 11:10:25                 Handled 13 drag events
2021-07-27 11:10:25:                            Event 1: time = 328.71407ms, move = 53.9934ms, dx = 0px, dy = 0px
2021-07-27 11:10:25:                            Event 2: time = 400.17699ms, move = 23.50854ms, dx = -4px, dy = 0px
2021-07-27 11:10:25:                            Event 3: time = 425.15426ms, move = 16.09029ms, dx = -15px, dy = 0px
2021-07-27 11:10:25:                            Event 4: time = 487.36714ms, move = 16.00868ms, dx = -17px, dy = 0px
2021-07-27 11:10:25:                            Event 5: time = 570.61709ms, move = 14.17941ms, dx = -24px, dy = 0px
2021-07-27 11:10:25:                            Event 6: time = 650.29178ms, move = 17.97919ms, dx = -9px, dy = 0px
2021-07-27 11:10:25:                            Event 7: time = 728.43207ms, move = 826.48959ms, dx = -20px, dy = 0px
2021-07-27 11:10:25:                            Event 8: time = 1556.74348ms, move = 827.72796ms, dx = -20px, dy = -1px
2021-07-27 11:10:25:                            Event 9: time = 2386.59503ms, move = 819.58293ms, dx = -20px, dy = -5px
2021-07-27 11:10:25:                            Event 10: time = 3206.7307ms, move = 832.84942ms, dx = -14px, dy = -3px
2021-07-27 11:10:25:                            Event 11: time = 4040.11141ms, move = 833.63704ms, dx = -5px, dy = -1px
2021-07-27 11:10:25:                            Event 12: time = 4874.24237ms, move = 506.99123ms, dx = -11px, dy = -2px
2021-07-27 11:10:25:                            Event 13: time = 5381.76185ms, move = 14.93555ms, dx = -14px, dy = -1px

As you can see, everything is initially fine, but then Event 7 starts to see the 800ms timings when calling move().

A simpler repro

I don't want you to have to install my Spoon and use it, so I made a simpler repro here you can drop into a blank init.lua:

hs.hotkey.bind({'cmd', 'alt', 'ctrl'}, 'n', function()
  math.randomseed(os.time())

  local results = {}
  local logger = hs.logger.new('move', 'debug')

  -- We're going to move the current focused window
  local window = hs.window.focusedWindow()

  local startTime = hs.timer.absoluteTime()

  -- Move the window 40 times to the left, and measure it each time
  for i = 1, 40 do
    local loopStart = hs.timer.absoluteTime()

    local dx = -1 * math.random(2, 15) -- move left a random number of px
    local dy = -1 * math.random(0, 2) -- nudge up a bit randomly

    local moveStart = hs.timer.absoluteTime()
    window:move({dx, dy}, nil, false, 0)
    local moveEnd = hs.timer.absoluteTime()

    table.insert(results, {
      dx = dx,
      dy = dy,
      start = loopStart,
      move = moveEnd - moveStart,
    })
  end

  logger.d("Moved " .. tostring(#results) .. " times:")

  -- print timing results
  for i, event in ipairs(results) do
    -- Times are in nanoseconds, convert them to ms:
    local eventMs = (event.start - startTime) / 100000
    local moveMs = event.move / 100000

    logger.d("  Event " .. tostring(i) .. ": time = " .. tostring(eventMs) .. "ms, move = " .. moveMs .. "ms, dx = " .. event.dx .. "px, dy = " .. event.dy .. "px")
  end
end)

Focus a window, and hit cmd+alt+ctrl n. It will nudge the focused window to the left 40 times, and print timing info at the end. Here's an example run I did with it:

2021-07-27 12:11:06: 12:11:06                 Moved 40 times:
2021-07-27 12:11:06:                            Event 1: time = 0.00561ms, move = 27.54635ms, dx = -15px, dy = -2px
2021-07-27 12:11:06:                            Event 2: time = 27.60896ms, move = 25.39676ms, dx = -15px, dy = -2px
2021-07-27 12:11:06:                            Event 3: time = 53.05317ms, move = 21.8768ms, dx = -13px, dy = 0px
2021-07-27 12:11:06:                            Event 4: time = 74.97535ms, move = 32.72719ms, dx = -10px, dy = -2px
2021-07-27 12:11:06:                            Event 5: time = 107.7492ms, move = 22.13578ms, dx = -7px, dy = 0px
2021-07-27 12:11:06:                            Event 6: time = 129.94245ms, move = 25.46815ms, dx = -9px, dy = -2px
2021-07-27 12:11:06:                            Event 7: time = 155.4713ms, move = 27.09337ms, dx = -12px, dy = -2px
2021-07-27 12:11:06:                            Event 8: time = 182.62045ms, move = 29.80518ms, dx = -7px, dy = 0px
2021-07-27 12:11:06:                            Event 9: time = 212.49273ms, move = 48.21837ms, dx = -4px, dy = -2px
2021-07-27 12:11:06:                            Event 10: time = 260.77966ms, move = 40.94057ms, dx = -6px, dy = 0px
2021-07-27 12:11:06:                            Event 11: time = 301.77329ms, move = 34.04122ms, dx = -8px, dy = -2px
2021-07-27 12:11:06:                            Event 12: time = 335.87245ms, move = 28.14681ms, dx = -4px, dy = -2px
2021-07-27 12:11:06:                            Event 13: time = 364.06769ms, move = 24.93245ms, dx = -15px, dy = 0px
2021-07-27 12:11:06:                            Event 14: time = 389.04245ms, move = 66.20369ms, dx = -7px, dy = -2px
2021-07-27 12:11:06:                            Event 15: time = 455.29811ms, move = 22.08742ms, dx = -2px, dy = 0px
2021-07-27 12:11:06:                            Event 16: time = 477.42405ms, move = 22.89252ms, dx = -13px, dy = 0px
2021-07-27 12:11:06:                            Event 17: time = 500.35234ms, move = 21.33387ms, dx = -13px, dy = -2px
2021-07-27 12:11:06:                            Event 18: time = 521.73393ms, move = 20.22326ms, dx = -4px, dy = -1px
2021-07-27 12:11:06:                            Event 19: time = 542.00085ms, move = 47.7839ms, dx = -9px, dy = -2px
2021-07-27 12:11:06:                            Event 20: time = 589.83782ms, move = 36.97542ms, dx = -6px, dy = -2px
2021-07-27 12:11:06:                            Event 21: time = 626.86595ms, move = 33.00474ms, dx = -11px, dy = -1px
2021-07-27 12:11:06:                            Event 22: time = 659.9277ms, move = 24.44817ms, dx = -7px, dy = -1px
2021-07-27 12:11:06:                            Event 23: time = 684.42015ms, move = 22.40076ms, dx = -12px, dy = -1px
2021-07-27 12:11:06:                            Event 24: time = 706.86795ms, move = 21.73812ms, dx = -9px, dy = -2px
2021-07-27 12:11:06:                            Event 25: time = 728.64572ms, move = 25.48907ms, dx = -14px, dy = -1px
2021-07-27 12:11:06:                            Event 26: time = 754.17442ms, move = 672.02106ms, dx = -4px, dy = -1px
2021-07-27 12:11:06:                            Event 27: time = 1426.25325ms, move = 841.07634ms, dx = -10px, dy = 0px
2021-07-27 12:11:06:                            Event 28: time = 2267.4196ms, move = 826.58262ms, dx = -12px, dy = 0px
2021-07-27 12:11:06:                            Event 29: time = 3094.0761ms, move = 266.09113ms, dx = -6px, dy = 0px
2021-07-27 12:11:06:                            Event 30: time = 3360.2221ms, move = 22.78907ms, dx = -5px, dy = -1px
2021-07-27 12:11:06:                            Event 31: time = 3383.05382ms, move = 37.72055ms, dx = -2px, dy = -2px
2021-07-27 12:11:06:                            Event 32: time = 3420.83006ms, move = 41.57918ms, dx = -8px, dy = -1px
2021-07-27 12:11:06:                            Event 33: time = 3462.47407ms, move = 29.00075ms, dx = -6px, dy = 0px
2021-07-27 12:11:06:                            Event 34: time = 3491.53172ms, move = 26.71468ms, dx = -4px, dy = -2px
2021-07-27 12:11:06:                            Event 35: time = 3518.28732ms, move = 28.55503ms, dx = -2px, dy = 0px
2021-07-27 12:11:06:                            Event 36: time = 3546.88645ms, move = 40.61574ms, dx = -4px, dy = 0px
2021-07-27 12:11:06:                            Event 37: time = 3587.55305ms, move = 36.80189ms, dx = -6px, dy = -1px
2021-07-27 12:11:06:                            Event 38: time = 3624.40747ms, move = 27.99468ms, dx = -12px, dy = 0px
2021-07-27 12:11:06:                            Event 39: time = 3652.45205ms, move = 24.09238ms, dx = -9px, dy = -1px
2021-07-27 12:11:06:                            Event 40: time = 3676.58802ms, move = 21.44703ms, dx = -7px, dy = -2px

You can see a spike from event 26-29 into the 800ms range. You might have to run it a few times to see performance spikes, as there seems to be some variability and randomness to when it decides to lag.

I'd love to dig into why this might be happening more with you, and see if there's potentially low-hanging fruit to make performance more uniform between calls to window:move().

Let me know if I can provide any more information. Also let me know if I'm using window:move() "wrong" - e.g. is there a better way for me to do this kind of "move window on drag" functionality that will yield more stable results, without having to dig into the internals of window:move()?

Hammerspoon/hammerspoon

Answer questions latenitefilms

Here are my timings on Mojave:

2021-07-28 09:47:08: 09:47:08       move:     Moved 40 times:
2021-07-28 09:47:08:                            Event 1: time = 0.00639ms, move = 289.06827ms, dx = -13px, dy = -1px
2021-07-28 09:47:08:                            Event 2: time = 289.12867ms, move = 221.39369ms, dx = -13px, dy = -2px
2021-07-28 09:47:08:                            Event 3: time = 510.57154ms, move = 213.86852ms, dx = -9px, dy = -1px
2021-07-28 09:47:08:                            Event 4: time = 724.49567ms, move = 217.86973ms, dx = -3px, dy = -2px
2021-07-28 09:47:08:                            Event 5: time = 942.41116ms, move = 215.66587ms, dx = -13px, dy = -1px
2021-07-28 09:47:08:                            Event 6: time = 1158.13054ms, move = 213.17625ms, dx = -10px, dy = -2px
2021-07-28 09:47:08:                            Event 7: time = 1371.487ms, move = 247.91326ms, dx = -6px, dy = 0px
2021-07-28 09:47:08:                            Event 8: time = 1619.45405ms, move = 232.17482ms, dx = -4px, dy = -2px
2021-07-28 09:47:08:                            Event 9: time = 1851.69536ms, move = 232.41995ms, dx = -4px, dy = 0px
2021-07-28 09:47:08:                            Event 10: time = 2084.17804ms, move = 208.87729ms, dx = -12px, dy = -2px
2021-07-28 09:47:08:                            Event 11: time = 2293.10512ms, move = 228.85383ms, dx = -11px, dy = 0px
2021-07-28 09:47:08:                            Event 12: time = 2522.00946ms, move = 212.17199ms, dx = -11px, dy = 0px
2021-07-28 09:47:08:                            Event 13: time = 2734.23341ms, move = 215.52002ms, dx = -5px, dy = -2px
2021-07-28 09:47:08:                            Event 14: time = 2949.82467ms, move = 223.12076ms, dx = -11px, dy = 0px
2021-07-28 09:47:08:                            Event 15: time = 3172.99838ms, move = 219.55235ms, dx = -12px, dy = 0px
2021-07-28 09:47:08:                            Event 16: time = 3392.60229ms, move = 217.69837ms, dx = -5px, dy = 0px
2021-07-28 09:47:08:                            Event 17: time = 3610.34863ms, move = 218.85968ms, dx = -5px, dy = -1px
2021-07-28 09:47:08:                            Event 18: time = 3829.31522ms, move = 219.52763ms, dx = -4px, dy = -2px
2021-07-28 09:47:08:                            Event 19: time = 4048.92885ms, move = 239.62706ms, dx = -4px, dy = 0px
2021-07-28 09:47:08:                            Event 20: time = 4288.61392ms, move = 230.48992ms, dx = -15px, dy = 0px
2021-07-28 09:47:08:                            Event 21: time = 4519.15366ms, move = 213.22775ms, dx = -12px, dy = -2px
2021-07-28 09:47:08:                            Event 22: time = 4732.43143ms, move = 210.55814ms, dx = -11px, dy = 0px
2021-07-28 09:47:08:                            Event 23: time = 4943.03644ms, move = 232.10514ms, dx = -15px, dy = 0px
2021-07-28 09:47:08:                            Event 24: time = 5175.18766ms, move = 235.13491ms, dx = -9px, dy = -1px
2021-07-28 09:47:08:                            Event 25: time = 5410.37728ms, move = 233.33577ms, dx = -4px, dy = -1px
2021-07-28 09:47:08:                            Event 26: time = 5643.77351ms, move = 233.65875ms, dx = -15px, dy = -2px
2021-07-28 09:47:08:                            Event 27: time = 5877.48584ms, move = 217.5153ms, dx = -3px, dy = 0px
2021-07-28 09:47:08:                            Event 28: time = 6095.05892ms, move = 219.98165ms, dx = -2px, dy = -1px
2021-07-28 09:47:08:                            Event 29: time = 6315.10176ms, move = 228.99996ms, dx = -5px, dy = -2px
2021-07-28 09:47:08:                            Event 30: time = 6544.15904ms, move = 222.26846ms, dx = -3px, dy = 0px
2021-07-28 09:47:08:                            Event 31: time = 6766.47805ms, move = 223.10728ms, dx = -3px, dy = -2px
2021-07-28 09:47:08:                            Event 32: time = 6989.77435ms, move = 245.06894ms, dx = -8px, dy = -2px
2021-07-28 09:47:08:                            Event 33: time = 7234.89227ms, move = 219.32029ms, dx = -10px, dy = -1px
2021-07-28 09:47:08:                            Event 34: time = 7454.33029ms, move = 226.36979ms, dx = -2px, dy = -1px
2021-07-28 09:47:08:                            Event 35: time = 7680.75848ms, move = 217.10124ms, dx = -12px, dy = -2px
2021-07-28 09:47:08:                            Event 36: time = 7897.90812ms, move = 230.98119ms, dx = -6px, dy = -2px
2021-07-28 09:47:08:                            Event 37: time = 8128.94019ms, move = 229.46816ms, dx = -8px, dy = 0px
2021-07-28 09:47:08:                            Event 38: time = 8358.50509ms, move = 234.80294ms, dx = -9px, dy = 0px
2021-07-28 09:47:08:                            Event 39: time = 8593.36874ms, move = 215.19098ms, dx = -13px, dy = -2px
2021-07-28 09:47:08:                            Event 40: time = 8808.6209ms, move = 234.3636ms, dx = -4px, dy = 0px
2021-07-28 09:47:10: 09:47:10                 Moved 40 times:
2021-07-28 09:47:10:                            Event 1: time = 0.00747ms, move = 289.35596ms, dx = -10px, dy = 0px
2021-07-28 09:47:10:                            Event 2: time = 289.43333ms, move = 242.41979ms, dx = -7px, dy = -1px
2021-07-28 09:47:10:                            Event 3: time = 531.94011ms, move = 252.54655ms, dx = -15px, dy = -2px
2021-07-28 09:47:10:                            Event 4: time = 784.547ms, move = 220.81957ms, dx = -2px, dy = -2px
2021-07-28 09:47:10:                            Event 5: time = 1005.41607ms, move = 252.43985ms, dx = -11px, dy = -1px
2021-07-28 09:47:10:                            Event 6: time = 1257.9102ms, move = 223.82918ms, dx = -2px, dy = 0px
2021-07-28 09:47:10:                            Event 7: time = 1481.79511ms, move = 224.30484ms, dx = -5px, dy = -2px
2021-07-28 09:47:10:                            Event 8: time = 1706.15008ms, move = 231.61993ms, dx = -15px, dy = 0px
2021-07-28 09:47:10:                            Event 9: time = 1937.84065ms, move = 263.03137ms, dx = -3px, dy = 0px
2021-07-28 09:47:10:                            Event 10: time = 2200.93525ms, move = 221.97131ms, dx = -10px, dy = -1px
2021-07-28 09:47:10:                            Event 11: time = 2422.96278ms, move = 220.54927ms, dx = -10px, dy = -1px
2021-07-28 09:47:10:                            Event 12: time = 2643.5659ms, move = 228.21335ms, dx = -13px, dy = -2px
2021-07-28 09:47:10:                            Event 13: time = 2871.85412ms, move = 253.6188ms, dx = -2px, dy = -1px
2021-07-28 09:47:10:                            Event 14: time = 3125.52844ms, move = 228.2709ms, dx = -14px, dy = 0px
2021-07-28 09:47:10:                            Event 15: time = 3353.85192ms, move = 233.11983ms, dx = -12px, dy = -1px
2021-07-28 09:47:10:                            Event 16: time = 3587.02435ms, move = 223.10401ms, dx = -9px, dy = -2px
2021-07-28 09:47:10:                            Event 17: time = 3810.18363ms, move = 229.75225ms, dx = -8px, dy = 0px
2021-07-28 09:47:10:                            Event 18: time = 4039.99673ms, move = 225.74641ms, dx = -9px, dy = 0px
2021-07-28 09:47:10:                            Event 19: time = 4265.7942ms, move = 210.83807ms, dx = -4px, dy = -1px
2021-07-28 09:47:10:                            Event 20: time = 4476.68141ms, move = 235.30202ms, dx = -6px, dy = -1px
2021-07-28 09:47:10:                            Event 21: time = 4712.03372ms, move = 220.63805ms, dx = -6px, dy = 0px
2021-07-28 09:47:10:                            Event 22: time = 4932.72348ms, move = 220.13716ms, dx = -13px, dy = 0px
2021-07-28 09:47:10:                            Event 23: time = 5152.91491ms, move = 220.6848ms, dx = -13px, dy = 0px
2021-07-28 09:47:10:                            Event 24: time = 5373.77661ms, move = 215.29245ms, dx = -4px, dy = -1px
2021-07-28 09:47:10:                            Event 25: time = 5589.11801ms, move = 219.70286ms, dx = -14px, dy = 0px
2021-07-28 09:47:10:                            Event 26: time = 5808.87383ms, move = 229.2655ms, dx = -13px, dy = 0px
2021-07-28 09:47:10:                            Event 27: time = 6038.19404ms, move = 220.72476ms, dx = -10px, dy = 0px
2021-07-28 09:47:10:                            Event 28: time = 6258.971ms, move = 217.08687ms, dx = -9px, dy = -2px
2021-07-28 09:47:10:                            Event 29: time = 6476.10662ms, move = 221.83928ms, dx = -11px, dy = -1px
2021-07-28 09:47:10:                            Event 30: time = 6698.00209ms, move = 225.3444ms, dx = -8px, dy = -1px
2021-07-28 09:47:10:                            Event 31: time = 6923.39784ms, move = 222.44674ms, dx = -5px, dy = 0px
2021-07-28 09:47:10:                            Event 32: time = 7145.89783ms, move = 226.61602ms, dx = -15px, dy = -1px
2021-07-28 09:47:10:                            Event 33: time = 7372.56395ms, move = 207.38373ms, dx = -15px, dy = 0px
2021-07-28 09:47:10:                            Event 34: time = 7580.00905ms, move = 238.40863ms, dx = -2px, dy = 0px
2021-07-28 09:47:10:                            Event 35: time = 7818.4686ms, move = 224.48387ms, dx = -15px, dy = -1px
2021-07-28 09:47:10:                            Event 36: time = 8043.00245ms, move = 220.302ms, dx = -13px, dy = -1px
2021-07-28 09:47:10:                            Event 37: time = 8263.35333ms, move = 224.79878ms, dx = -11px, dy = -1px
2021-07-28 09:47:10:                            Event 38: time = 8488.20657ms, move = 223.61744ms, dx = -2px, dy = 0px
2021-07-28 09:47:10:                            Event 39: time = 8711.87539ms, move = 218.31523ms, dx = -4px, dy = -2px
2021-07-28 09:47:10:                            Event 40: time = 8930.23656ms, move = 211.98826ms, dx = -11px, dy = -1px
2021-07-28 09:47:19: 09:47:19                 Moved 40 times:
2021-07-28 09:47:19:                            Event 1: time = 0.00846ms, move = 313.33413ms, dx = -11px, dy = 0px
2021-07-28 09:47:19:                            Event 2: time = 313.4038ms, move = 263.14754ms, dx = -11px, dy = -1px
2021-07-28 09:47:19:                            Event 3: time = 576.60965ms, move = 263.61298ms, dx = -5px, dy = 0px
2021-07-28 09:47:19:                            Event 4: time = 840.28349ms, move = 228.71494ms, dx = -3px, dy = 0px
2021-07-28 09:47:19:                            Event 5: time = 1069.04929ms, move = 221.33861ms, dx = -13px, dy = -2px
2021-07-28 09:47:19:                            Event 6: time = 1290.44822ms, move = 226.10811ms, dx = -15px, dy = -1px
2021-07-28 09:47:19:                            Event 7: time = 1516.60331ms, move = 235.34187ms, dx = -11px, dy = -2px
2021-07-28 09:47:19:                            Event 8: time = 1752.006ms, move = 243.2776ms, dx = -14px, dy = -2px
2021-07-28 09:47:19:                            Event 9: time = 1995.3485ms, move = 223.16502ms, dx = -4px, dy = -1px
2021-07-28 09:47:19:                            Event 10: time = 2218.57207ms, move = 226.54254ms, dx = -15px, dy = -1px
2021-07-28 09:47:19:                            Event 11: time = 2445.16629ms, move = 223.30873ms, dx = -15px, dy = -1px
2021-07-28 09:47:19:                            Event 12: time = 2668.54271ms, move = 275.51899ms, dx = -4px, dy = 0px
2021-07-28 09:47:19:                            Event 13: time = 2944.13677ms, move = 246.41128ms, dx = -11px, dy = 0px
2021-07-28 09:47:19:                            Event 14: time = 3190.60376ms, move = 228.20355ms, dx = -10px, dy = -1px
2021-07-28 09:47:19:                            Event 15: time = 3418.86079ms, move = 225.07908ms, dx = -11px, dy = -1px
2021-07-28 09:47:19:                            Event 16: time = 3643.99539ms, move = 232.40275ms, dx = -2px, dy = -2px
2021-07-28 09:47:19:                            Event 17: time = 3876.45229ms, move = 244.82075ms, dx = -2px, dy = 0px
2021-07-28 09:47:19:                            Event 18: time = 4121.33013ms, move = 223.66132ms, dx = -13px, dy = -1px
2021-07-28 09:47:19:                            Event 19: time = 4345.04772ms, move = 217.77078ms, dx = -8px, dy = 0px
2021-07-28 09:47:19:                            Event 20: time = 4562.87419ms, move = 243.43412ms, dx = -5px, dy = -2px
2021-07-28 09:47:19:                            Event 21: time = 4806.36023ms, move = 245.70928ms, dx = -6px, dy = 0px
2021-07-28 09:47:19:                            Event 22: time = 5052.11893ms, move = 222.79434ms, dx = -5px, dy = -2px
2021-07-28 09:47:19:                            Event 23: time = 5274.96123ms, move = 209.10929ms, dx = -7px, dy = 0px
2021-07-28 09:47:19:                            Event 24: time = 5484.11953ms, move = 231.71987ms, dx = -4px, dy = -2px
2021-07-28 09:47:19:                            Event 25: time = 5715.90584ms, move = 251.67009ms, dx = -7px, dy = -1px
2021-07-28 09:47:19:                            Event 26: time = 5967.63347ms, move = 224.70183ms, dx = -15px, dy = -2px
2021-07-28 09:47:19:                            Event 27: time = 6192.38753ms, move = 230.10053ms, dx = -2px, dy = -1px
2021-07-28 09:47:19:                            Event 28: time = 6422.54393ms, move = 230.35219ms, dx = -9px, dy = -2px
2021-07-28 09:47:19:                            Event 29: time = 6652.95097ms, move = 232.52577ms, dx = -8px, dy = -1px
2021-07-28 09:47:19:                            Event 30: time = 6885.53165ms, move = 221.40702ms, dx = -14px, dy = -2px
2021-07-28 09:47:19:                            Event 31: time = 7106.99546ms, move = 214.77397ms, dx = -7px, dy = -2px
2021-07-28 09:47:19:                            Event 32: time = 7321.81654ms, move = 209.9966ms, dx = -4px, dy = -1px
2021-07-28 09:47:19:                            Event 33: time = 7531.85794ms, move = 222.81139ms, dx = -4px, dy = -1px
2021-07-28 09:47:19:                            Event 34: time = 7754.7328ms, move = 226.35008ms, dx = -2px, dy = 0px
2021-07-28 09:47:19:                            Event 35: time = 7981.13387ms, move = 225.96184ms, dx = -13px, dy = -2px
2021-07-28 09:47:19:                            Event 36: time = 8207.14583ms, move = 238.60895ms, dx = -9px, dy = 0px
2021-07-28 09:47:19:                            Event 37: time = 8445.80551ms, move = 224.12434ms, dx = -15px, dy = 0px
2021-07-28 09:47:19:                            Event 38: time = 8669.99491ms, move = 254.3866ms, dx = -11px, dy = 0px
2021-07-28 09:47:19:                            Event 39: time = 8924.4325ms, move = 225.42133ms, dx = -13px, dy = -2px
2021-07-28 09:47:19:                            Event 40: time = 9149.90468ms, move = 244.79227ms, dx = -14px, dy = -2px
useful!
source:https://uonfu.com/
answerer
Chris Hocking latenitefilms LateNite Films Australia https://latenitefilms.com Filmmaker (and occasional coder) @ LateNite Films
Github User Rank List