Skip to content

Commit c85bdbb

Browse files
committed
perf: skip drawing if animation is lagging
1 parent 47eb965 commit c85bdbb

1 file changed

Lines changed: 31 additions & 11 deletions

File tree

lua/smear_cursor/animation.lua

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ local BASE_TIME_INTERVAL = 17
88

99
local animating = false
1010
local previous_time = 0
11+
local lag = 0
1112
local target_position = { 0, 0 }
1213
local current_corners = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }
1314
local target_corners = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }
@@ -103,10 +104,10 @@ local function get_effective_time_interval()
103104
local time_interval
104105

105106
if previous_time == 0 then
106-
previous_time = vim.uv.now()
107+
previous_time = vim.uv.hrtime() / 1000000
107108
time_interval = BASE_TIME_INTERVAL
108109
else
109-
local current_time = vim.uv.now()
110+
local current_time = vim.uv.hrtime() / 1000000
110111
time_interval = current_time - previous_time
111112
previous_time = current_time
112113
end
@@ -368,11 +369,10 @@ local function redraw_cmd_mode(force)
368369
end
369370

370371
local function animate()
371-
local start_time = vim.uv.now()
372372
if not animating then return end
373373

374-
local must_redraw_cmd_mode = check_smear_outside_cmd_row()
375374
local time_interval = get_effective_time_interval()
375+
local must_redraw_cmd_mode = check_smear_outside_cmd_row()
376376
local index_head, index_tail = update(time_interval)
377377
update_particles(time_interval)
378378

@@ -392,8 +392,6 @@ local function animate()
392392
end
393393
local thickness = right_bound - left_bound
394394

395-
draw.clear()
396-
397395
if
398396
(
399397
(max_distance <= config.distance_stop_animating and max_velocity <= config.distance_stop_animating)
@@ -404,11 +402,13 @@ local function animate()
404402
)
405403
) and #particles == 0
406404
then
405+
draw.clear()
407406
set_corners(current_corners, target_position[1], target_position[2])
408407
reset_velocity()
409408
redraw_cmd_mode(must_redraw_cmd_mode)
410409
unhide_real_cursor()
411410
stop_animation()
411+
lag = 0
412412
return
413413
end
414414

@@ -455,12 +455,32 @@ local function animate()
455455
gradient_length_squared > 1 and gradient_direction[2] / gradient_length_squared or 0,
456456
}
457457

458-
draw.draw_particles(particles, target_position)
459-
draw.draw_quad(drawn_corners, target_position, cursor_is_vertical_bar(), gradient_origin, gradient_direction_scaled)
460-
redraw_cmd_mode(must_redraw_cmd_mode)
458+
if lag == 0 then
459+
draw.clear()
460+
draw.draw_particles(particles, target_position)
461+
draw.draw_quad(
462+
drawn_corners,
463+
target_position,
464+
cursor_is_vertical_bar(),
465+
gradient_origin,
466+
gradient_direction_scaled
467+
)
468+
redraw_cmd_mode(must_redraw_cmd_mode)
469+
end
470+
471+
lag = math.max(0, lag + time_interval - config.time_interval)
472+
local call_duration = vim.uv.hrtime() / 1000000 - previous_time
473+
local delay_next_call = config.time_interval - call_duration
474+
475+
if lag <= delay_next_call then
476+
delay_next_call = delay_next_call - lag
477+
lag = 0
478+
else
479+
lag = lag - delay_next_call
480+
delay_next_call = 0
481+
end
461482

462-
local end_time = vim.uv.now()
463-
vim.defer_fn(animate, math.max(0, config.time_interval - (end_time - start_time)))
483+
vim.defer_fn(animate, delay_next_call)
464484
end
465485

466486
local function start_anination()

0 commit comments

Comments
 (0)