Skip to content

Commit 67f5682

Browse files
committed
perf(timeline): more update batching
1 parent 2c784e1 commit 67f5682

File tree

1 file changed

+61
-13
lines changed

1 file changed

+61
-13
lines changed

packages/app-frontend/src/features/timeline/TimelineView.vue

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -313,32 +313,80 @@ export default defineComponent({
313313
let events: TimelineEvent[] = []
314314
315315
const updateEventPositionQueue = new Queue<TimelineEvent>()
316+
const updateEventVerticalPositionQueue = new Queue<TimelineEvent>()
316317
let eventPositionUpdateInProgress = false
318+
let eventVerticalPositionUpdateInProgress = false
317319
318320
function queueEventPositionUpdate (events: TimelineEvent[], force = false) {
319-
for (const e of events) {
320-
if (!e.container) continue
321-
const ignored = isEventIgnored(e)
322-
e.container.visible = !ignored
323-
if (ignored) continue
324-
// Update horizontal position immediately
325-
e.container.x = Math.round(getTimePosition(e.time))
326-
if (!force && e.layer.groupsOnly) continue
327-
// Queue vertical position compute
328-
updateEventPositionQueue.add(e)
321+
for (const event of events) {
322+
if (!event.container) continue
323+
324+
event.forcePositionUpdate = force
325+
326+
updateEventPositionQueue.add(event)
329327
}
328+
329+
// If not running an update, start one
330330
if (!eventPositionUpdateInProgress) {
331331
eventPositionUpdateInProgress = true
332332
Vue.nextTick(() => {
333-
nextEventPositionUpdate()
333+
runEventPositionUpdate()
334334
eventPositionUpdateInProgress = false
335335
})
336336
}
337337
}
338338
339-
function nextEventPositionUpdate () {
339+
function runEventPositionUpdate () {
340340
let event: TimelineEvent
341341
while ((event = updateEventPositionQueue.shift())) {
342+
// Ignored
343+
const ignored = isEventIgnored(event)
344+
event.container.visible = !ignored
345+
if (ignored) continue
346+
347+
/*
348+
// Ignore events that are theorically not visible
349+
const eventInViewport = e.time >= nonReactiveTime.startTime.value && e.time <= nonReactiveTime.endTime.value
350+
const eventGroupInViewport = !e.group || e.group.firstEvent !== e || (
351+
(getTimePosition(e.group.lastEvent.time) - getTimePosition(e.time)) > 1 && (
352+
// First event in viewport
353+
eventInViewport ||
354+
// Last event in viewport
355+
(e.group.lastEvent.time >= nonReactiveTime.startTime.value && e.group.lastEvent.time <= nonReactiveTime.endTime.value) ||
356+
// Group in viewport (bigger than viewport)
357+
(e.time < nonReactiveTime.startTime.value && e.group.lastEvent.time > nonReactiveTime.endTime.value)
358+
)
359+
)
360+
const notVisible = !eventInViewport && !eventGroupInViewport
361+
e.container.visible = !notVisible
362+
if (!force && notVisible) continue
363+
// eslint-disable-next-line no-console
364+
console.log('update')
365+
*/
366+
367+
// Update horizontal position immediately
368+
event.container.x = getTimePosition(event.time)
369+
370+
// Ignore additional updates to flamechart
371+
if (!event.forcePositionUpdate && event.layer.groupsOnly) continue
372+
373+
// Queue vertical position compute
374+
updateEventVerticalPositionQueue.add(event)
375+
}
376+
377+
// If not running an update, start one
378+
if (!eventVerticalPositionUpdateInProgress) {
379+
eventVerticalPositionUpdateInProgress = true
380+
Vue.nextTick(() => {
381+
runEventVerticalPositionUpdate()
382+
eventVerticalPositionUpdateInProgress = false
383+
})
384+
}
385+
}
386+
387+
function runEventVerticalPositionUpdate () {
388+
let event: TimelineEvent
389+
while ((event = updateEventVerticalPositionQueue.shift())) {
342390
computeEventVerticalPosition(event)
343391
}
344392
}
@@ -412,7 +460,7 @@ export default defineComponent({
412460
// Collision!
413461
if (event.group && event.group.duration > otherGroup.duration && firstEvent.time <= otherGroup.firstEvent.time) {
414462
// Invert positions because current group has higher priority
415-
if (!updateEventPositionQueue.has(otherGroup.firstEvent)) {
463+
if (!updateEventVerticalPositionQueue.has(otherGroup.firstEvent)) {
416464
queueEventPositionUpdate([otherGroup.firstEvent], event.layer.groupsOnly)
417465
}
418466
} else {

0 commit comments

Comments
 (0)