@@ -47,6 +47,11 @@ const LAYER_SIZE = 16
47
47
const GROUP_SIZE = 6
48
48
const MIN_CAMERA_SIZE = 10
49
49
50
+ const propConfig = {
51
+ writable: true ,
52
+ configurable: false ,
53
+ }
54
+
50
55
installUnsafeEval (PIXI )
51
56
52
57
export default defineComponent ({
@@ -57,15 +62,16 @@ export default defineComponent({
57
62
const { startTime, endTime, minTime, maxTime } = useTime ()
58
63
const { darkMode } = useDarkMode ()
59
64
60
- // Optimize for read in loops
61
- const nonReactiveTime = {
65
+ // Optimize for read in loops and hot code
66
+ const nonReactiveState = {
62
67
startTime: nonReactive (startTime ),
63
68
endTime: nonReactive (endTime ),
64
69
minTime: nonReactive (minTime ),
70
+ darkMode: nonReactive (darkMode ),
65
71
}
66
72
67
73
function getTimePosition (time : number ) {
68
- return (time - nonReactiveTime .minTime .value ) / (nonReactiveTime .endTime .value - nonReactiveTime .startTime .value ) * app .view .width / window .devicePixelRatio
74
+ return (time - nonReactiveState .minTime .value ) / (nonReactiveState .endTime .value - nonReactiveState .startTime .value ) * app .view .width / window .devicePixelRatio
69
75
}
70
76
71
77
// Reset
@@ -159,7 +165,7 @@ export default defineComponent({
159
165
})
160
166
161
167
function updateBackground () {
162
- if (darkMode .value ) {
168
+ if (nonReactiveState . darkMode .value ) {
163
169
app && (app .renderer .backgroundColor = 0x0b1015 )
164
170
} else {
165
171
app && (app .renderer .backgroundColor = 0xffffff )
@@ -355,6 +361,7 @@ export default defineComponent({
355
361
// Events
356
362
357
363
const { selectedEvent } = useSelectedEvent ()
364
+ const nonReactiveSelectedEvent = nonReactive (selectedEvent )
358
365
359
366
let events: TimelineEvent [] = []
360
367
@@ -418,8 +425,15 @@ export default defineComponent({
418
425
draw ()
419
426
}
420
427
428
+ let isEventIgnoredCache: Record <TimelineEvent [' id' ], boolean > = {}
429
+
421
430
function isEventIgnored (event : TimelineEvent ) {
422
- return event .layer .ignoreNoDurationGroups && event .group && event .group .duration <= 0
431
+ let result = isEventIgnoredCache [event .id ]
432
+ if (result == null ) {
433
+ result = event .layer .ignoreNoDurationGroups && event .group ?.nonReactiveDuration <= 0
434
+ isEventIgnoredCache [event .id ] = result
435
+ }
436
+ return result
423
437
}
424
438
425
439
function computeEventVerticalPosition (event : TimelineEvent ) {
@@ -434,7 +448,7 @@ export default defineComponent({
434
448
// Collision offset for non-flamecharts
435
449
const offset = event .layer .groupsOnly ? 0 : 12
436
450
// For flamechart allow 1-pixel overlap at the end of a group
437
- const lastOffset = event .layer .groupsOnly && event .group ?.duration > 0 ? - 1 : 0
451
+ const lastOffset = event .layer .groupsOnly && event .group ?.nonReactiveDuration > 0 ? - 1 : 0
438
452
// Flamechart uses time instead of pixel position
439
453
const getPos = event .layer .groupsOnly ? (time : number ) => time : getTimePosition
440
454
@@ -483,7 +497,7 @@ export default defineComponent({
483
497
)
484
498
)) {
485
499
// Collision!
486
- if (event .group && event .group .duration > otherGroup .duration && firstEvent .time <= otherGroup .firstEvent .time ) {
500
+ if (event .group && event .group .nonReactiveDuration > otherGroup .nonReactiveDuration && firstEvent .time <= otherGroup .firstEvent .time ) {
487
501
// Invert positions because current group has higher priority
488
502
if (! updateEventVerticalPositionQueue .has (otherGroup .firstEvent )) {
489
503
queueEventPositionUpdate ([otherGroup .firstEvent ], event .layer .groupsOnly )
@@ -524,32 +538,18 @@ export default defineComponent({
524
538
525
539
if (! event .layer .groupsOnly || (event .group ?.firstEvent === event )) {
526
540
eventContainer = new PIXI .Container ()
527
- Object .defineProperty (event , ' container' , {
528
- value: eventContainer ,
529
- writable: true ,
530
- configurable: false ,
531
- })
541
+ Object .defineProperty (event , ' container' , { value: eventContainer , ... propConfig })
532
542
layerContainer .addChild (eventContainer )
533
543
}
534
544
535
545
// Group graphics
536
546
if (event .group ) {
537
547
if (event .group .firstEvent === event ) {
538
548
const groupG = new PIXI .Graphics ()
539
- Object .defineProperty (event , ' groupG' , {
540
- value: groupG ,
541
- writable: true ,
542
- configurable: false ,
543
- })
544
- Object .defineProperty (event , ' groupT' , {
545
- value: null ,
546
- writable: true ,
547
- configurable: false ,
548
- })
549
- Object .defineProperty (event , ' groupText' , {
550
- value: null ,
551
- writable: true ,
552
- configurable: false ,
549
+ Object .defineProperties (event , {
550
+ groupG: { value: groupG , ... propConfig },
551
+ groupT: { value: null , ... propConfig },
552
+ groupText: { value: null , ... propConfig },
553
553
})
554
554
eventContainer .addChild (groupG )
555
555
event .group .oldSize = null
@@ -565,11 +565,7 @@ export default defineComponent({
565
565
// Graphics
566
566
if (eventContainer ) {
567
567
const g = new PIXI .Graphics ()
568
- Object .defineProperty (event , ' g' , {
569
- value: g ,
570
- writable: true ,
571
- configurable: false ,
572
- })
568
+ Object .defineProperty (event , ' g' , { value: g , ... propConfig })
573
569
eventContainer .addChild (g )
574
570
}
575
571
@@ -618,6 +614,7 @@ export default defineComponent({
618
614
e .container = null
619
615
}
620
616
events = []
617
+ isEventIgnoredCache = {}
621
618
}
622
619
623
620
function resetEvents () {
@@ -736,8 +733,8 @@ export default defineComponent({
736
733
if (selected ) {
737
734
// Border-only style
738
735
size --
739
- g .lineStyle (2 , boostColor (color , darkMode .value ))
740
- g .beginFill (dimColor (color , darkMode .value ))
736
+ g .lineStyle (2 , boostColor (color , nonReactiveState . darkMode .value ))
737
+ g .beginFill (dimColor (color , nonReactiveState . darkMode .value ))
741
738
if (! event .group || event .group .firstEvent !== event ) {
742
739
event .container .zIndex = 999999999
743
740
}
@@ -759,7 +756,7 @@ export default defineComponent({
759
756
const drawUnselectedEvent = drawEvent .bind (null , false )
760
757
761
758
function refreshEventGraphics (event : TimelineEvent ) {
762
- if (selectedEvent .value === event ) {
759
+ if (nonReactiveSelectedEvent .value === event ) {
763
760
drawSelectedEvent (event )
764
761
} else {
765
762
drawUnselectedEvent (event )
@@ -775,8 +772,8 @@ export default defineComponent({
775
772
776
773
function selectPreviousEvent () {
777
774
let index
778
- if (selectedEvent .value ) {
779
- index = events .indexOf (selectedEvent .value )
775
+ if (nonReactiveSelectedEvent .value ) {
776
+ index = events .indexOf (nonReactiveSelectedEvent .value )
780
777
} else {
781
778
index = events .length
782
779
}
@@ -797,8 +794,8 @@ export default defineComponent({
797
794
798
795
function selectNextEvent () {
799
796
let index
800
- if (selectedEvent .value ) {
801
- index = events .indexOf (selectedEvent .value )
797
+ if (nonReactiveSelectedEvent .value ) {
798
+ index = events .indexOf (nonReactiveSelectedEvent .value )
802
799
} else {
803
800
index = - 1
804
801
}
@@ -862,38 +859,40 @@ export default defineComponent({
862
859
app .stage .addListener (' mousemove' , mouseEvent => {
863
860
const text: string [] = []
864
861
865
- // Event tooltip
866
- const event = getEventAtPosition (mouseEvent .data .global .x , mouseEvent .data .global .y )
867
- if (event ) {
868
- text .push (event .title ?? ' Event' )
869
- if (event .subtitle ) {
870
- text .push (event .subtitle )
871
- }
872
- text .push (formatTime (event .time , ' ms' ))
862
+ if (! cameraDragging ) {
863
+ // Event tooltip
864
+ const event = getEventAtPosition (mouseEvent .data .global .x , mouseEvent .data .global .y )
865
+ if (event ) {
866
+ text .push (event .title ?? ' Event' )
867
+ if (event .subtitle ) {
868
+ text .push (event .subtitle )
869
+ }
870
+ text .push (formatTime (event .time , ' ms' ))
873
871
874
- if (event .group ) {
875
- text .push (` Group: ${event .group .duration }ms (${event .group .events .length } event${event .group .events .length > 1 ? ' s' : ' ' }) ` )
876
- }
872
+ if (event .group ) {
873
+ text .push (` Group: ${event .group .nonReactiveDuration }ms (${event .group .events .length } event${event .group .events .length > 1 ? ' s' : ' ' }) ` )
874
+ }
877
875
878
- if (event ?.container ) {
879
- event .container .alpha = 0.5
880
- }
881
- } else {
882
- // Marker tooltip
883
- const marker = getMarkerAtPosition (mouseEvent .data .global .x )
884
- if (marker ) {
885
- text .push (marker .label )
886
- text .push (formatTime (marker .time , ' ms' ))
887
- text .push (' (marker)' )
876
+ if (event ?.container ) {
877
+ event .container .alpha = 0.5
878
+ }
879
+ } else {
880
+ // Marker tooltip
881
+ const marker = getMarkerAtPosition (mouseEvent .data .global .x )
882
+ if (marker ) {
883
+ text .push (marker .label )
884
+ text .push (formatTime (marker .time , ' ms' ))
885
+ text .push (' (marker)' )
886
+ }
888
887
}
889
- }
890
- if (event !== hoverEvent ) {
891
- if (hoverEvent ?.container ) {
892
- hoverEvent .container .alpha = 1
888
+ if (event !== hoverEvent ) {
889
+ if (hoverEvent ?.container ) {
890
+ hoverEvent .container .alpha = 1
891
+ }
892
+ draw ()
893
893
}
894
- draw ()
894
+ hoverEvent = event
895
895
}
896
- hoverEvent = event
897
896
898
897
if (text .length ) {
899
898
// Draw tooltip
@@ -929,7 +928,7 @@ export default defineComponent({
929
928
930
929
function drawEventGroup (event : TimelineEvent ) {
931
930
if (event .groupG ) {
932
- const drawAsSelected = event === selectedEvent .value && event .layer .groupsOnly
931
+ const drawAsSelected = event === nonReactiveSelectedEvent .value && event .layer .groupsOnly
933
932
934
933
/** @type {PIXI.Graphics} */
935
934
const g = event .groupG
@@ -938,14 +937,14 @@ export default defineComponent({
938
937
g .clear ()
939
938
if (event .layer .groupsOnly ) {
940
939
if (drawAsSelected ) {
941
- g .lineStyle (2 , boostColor (event .layer .color , darkMode .value ))
942
- g .beginFill (dimColor (event .layer .color , darkMode .value , 30 ))
940
+ g .lineStyle (2 , boostColor (event .layer .color , nonReactiveState . darkMode .value ))
941
+ g .beginFill (dimColor (event .layer .color , nonReactiveState . darkMode .value , 30 ))
943
942
} else {
944
943
g .beginFill (event .layer .color , 0.5 )
945
944
}
946
945
} else {
947
- g .lineStyle (1 , dimColor (event .layer .color , darkMode .value ))
948
- g .beginFill (dimColor (event .layer .color , darkMode .value , 25 ))
946
+ g .lineStyle (1 , dimColor (event .layer .color , nonReactiveState . darkMode .value ))
947
+ g .beginFill (dimColor (event .layer .color , nonReactiveState . darkMode .value , 25 ))
949
948
}
950
949
if (event .layer .groupsOnly ) {
951
950
g .drawRect (0 , - LAYER_SIZE / 2 , size - 1 , LAYER_SIZE - 1 )
@@ -959,16 +958,18 @@ export default defineComponent({
959
958
if (event .layer .groupsOnly && event .title && size > 32 ) {
960
959
let t = event .groupT
961
960
let text = event .groupText
962
- if (! t ) {
961
+ if (! text ) {
963
962
text = ` ${SharedData .debugInfo ? ` ${event .id } ` : ' ' }${event .title } ${event .subtitle } `
963
+ event .groupText = text
964
+ }
965
+ if (! t ) {
964
966
t = event .groupT = new PIXI .BitmapText (' ' , {
965
967
fontName: ' Roboto Mono' ,
966
- tint: darkMode .value ? 0xffffff : 0 ,
968
+ tint: nonReactiveState . darkMode .value ? 0xffffff : 0 ,
967
969
})
968
970
t .x = 1
969
971
t .y = Math .round (- t .height / 2 )
970
972
t .dirty = false
971
- event .groupText = text
972
973
event .container .addChild (t )
973
974
}
974
975
t .text = text .slice (0 , Math .floor ((size - 1 ) / 6 ))
0 commit comments