Skip to content

Commit 540e2bd

Browse files
committed
perf(timeline): group position cache (flamechart only)
1 parent 088d3c9 commit 540e2bd

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
TimelineEvent,
2424
useMarkers,
2525
TimelineMarker,
26+
getGroupsAroundPosition,
2627
} from './composable'
2728
import { useApps } from '@front/features/apps'
2829
import { onKeyUp } from '@front/util/keyboard'
@@ -395,12 +396,13 @@ export default defineComponent({
395396
const lastPos = event.group ? getPos(lastEvent.time) : firstPos
396397
397398
// Check for 'collision' with other event groups
398-
const l = event.layer.groups.length
399+
const otherGroups = event.layer.groupsOnly ? getGroupsAroundPosition(event.layer, firstEvent.time, lastEvent.time) : event.layer.groups
400+
const l = otherGroups.length
399401
let checkAgain = true
400402
while (checkAgain) {
401403
checkAgain = false
402404
for (let i = 0; i < l; i++) {
403-
const otherGroup = event.layer.groups[i]
405+
const otherGroup = otherGroups[i]
404406
405407
if (
406408
// Different group
@@ -886,7 +888,7 @@ export default defineComponent({
886888
if (event.layer.groupsOnly && event.title && size > 32) {
887889
let t = event.groupT
888890
if (!t) {
889-
t = event.groupT = new PIXI.Text(`${event.title} ${event.subtitle}`, {
891+
t = event.groupT = new PIXI.Text(`${SharedData.debugInfo ? `${event.id} ` : ''}${event.title} ${event.subtitle}`, {
890892
fontSize: 10,
891893
fill: darkMode.value ? 0xffffff : 0,
892894
})

packages/app-frontend/src/features/timeline/composable/events.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
} from './store'
1919
import { resetTime } from './reset'
2020
import { takeScreenshot } from './screenshot'
21+
import { addGroupAroundPosition } from './layers'
2122

2223
const AUTOSCROLL_DURATION = 10000
2324

@@ -72,6 +73,9 @@ export function addEvent (appId: string, eventOptions: TimelineEvent, layer: Lay
7273
}
7374
layer.groups.push(group)
7475
}
76+
if (layer.groupsOnly) {
77+
addGroupAroundPosition(layer, group, event.time)
78+
}
7579
group.events.push(event)
7680
group.lastEvent = event
7781
group.duration = event.time - group.firstEvent.time

packages/app-frontend/src/features/timeline/composable/layers.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
Layer,
1414
selectedEvent,
1515
inspectedEvent,
16+
EventGroup,
1617
} from './store'
1718
import { useRouter } from '@front/util/router'
1819

@@ -26,6 +27,7 @@ export function layerFactory (options: LayerFromBackend): Layer {
2627
height: 1,
2728
lastInspectedEvent: null,
2829
loaded: false,
30+
groupPositionCache: {},
2931
}
3032
}
3133

@@ -114,3 +116,33 @@ export async function fetchLayers () {
114116
await waitForAppSelect()
115117
getBridge().send(BridgeEvents.TO_BACK_TIMELINE_LAYER_LIST, {})
116118
}
119+
120+
export function getGroupsAroundPosition (layer: Layer, startPosition: number, endPosition: number): EventGroup[] {
121+
const result: EventGroup[] = []
122+
let key = Math.round(startPosition / 100)
123+
const endKey = Math.round(endPosition / 100)
124+
while (key <= endKey) {
125+
const groups = layer.groupPositionCache[key]
126+
if (groups) {
127+
result.push(...groups)
128+
}
129+
key++
130+
}
131+
return result
132+
}
133+
134+
export function addGroupAroundPosition (layer: Layer, group: EventGroup, newPosition: number) {
135+
let key = Math.round(group.lastEvent.time / 100)
136+
const endKey = Math.round(newPosition / 100)
137+
138+
while (key <= endKey) {
139+
let list = layer.groupPositionCache[key]
140+
if (!list) {
141+
list = layer.groupPositionCache[key] = []
142+
}
143+
if (!list.includes(group)) {
144+
list.push(group)
145+
}
146+
key++
147+
}
148+
}

packages/app-frontend/src/features/timeline/composable/store.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export interface Layer extends LayerFromBackend {
5656
eventsMap: Record<TimelineEvent['id'], TimelineEvent>
5757
groups: EventGroup[]
5858
groupsMap: Record<EventGroup['id'], EventGroup>
59+
groupPositionCache: Record<number, EventGroup[]>
5960
height: number
6061
lastInspectedEvent: TimelineEvent
6162
loaded: boolean

0 commit comments

Comments
 (0)