diff --git a/src/components/layout/traffic-graph.tsx b/src/components/layout/traffic-graph.tsx index a6a1a0e..0a9d376 100644 --- a/src/components/layout/traffic-graph.tsx +++ b/src/components/layout/traffic-graph.tsx @@ -12,7 +12,6 @@ const upLineWidth = 4; const downLineAlpha = 1; const downLineWidth = 4; -const duration = 16 / 1000; const defaultList = Array(maxPoint + 2).fill({ up: 0, down: 0 }); type TrafficData = { up: number; down: number }; @@ -107,10 +106,9 @@ const TrafficGraph = (props: Props) => { return 1; }; - const drawBezier = (list: number[]) => { - const o = dx * Math.min(1, countRef.current * duration); + const drawBezier = (list: number[], offset: number) => { const points = list.map((y, i) => [ - (dx * (i - 1) - o + 3) | 0, + (dx * (i - 1) - offset + 3) | 0, countY(y), ]); @@ -132,9 +130,11 @@ const TrafficGraph = (props: Props) => { } }; - const drawLine = (list: number[]) => { - const o = dx * Math.min(1, countRef.current * duration); - const points = list.map((y, i) => [(dx * (i - 1) - o) | 0, countY(y)]); + const drawLine = (list: number[], offset: number) => { + const points = list.map((y, i) => [ + (dx * (i - 1) - offset) | 0, + countY(y), + ]); context.moveTo(points[0][0], points[0][1]); @@ -144,7 +144,17 @@ const TrafficGraph = (props: Props) => { } }; - const drawGraph = () => { + const drawGraph = (lastTime: number) => { + const listUp = listRef.current.map((v) => v.up); + const listDown = listRef.current.map((v) => v.down); + const lineStyle = styleRef.current; + + const now = Date.now(); + const diff = now - lastTime; + const temp = Math.min((diff / 1000) * dx + countRef.current, dx); + const offset = countRef.current === 0 ? 0 : temp; + countRef.current = temp; + context.clearRect(0, 0, width, height); // Reference lines @@ -159,15 +169,11 @@ const TrafficGraph = (props: Props) => { context.stroke(); context.closePath(); - const listUp = listRef.current.map((v) => v.up); - const listDown = listRef.current.map((v) => v.down); - const lineStyle = styleRef.current; - context.beginPath(); context.globalAlpha = upLineAlpha; context.lineWidth = upLineWidth; context.strokeStyle = upLineColor; - lineStyle ? drawBezier(listUp) : drawLine(listUp); + lineStyle ? drawBezier(listUp, offset) : drawLine(listUp, offset); context.stroke(); context.closePath(); @@ -175,16 +181,14 @@ const TrafficGraph = (props: Props) => { context.globalAlpha = downLineAlpha; context.lineWidth = downLineWidth; context.strokeStyle = downLineColor; - lineStyle ? drawBezier(listDown) : drawLine(listDown); + lineStyle ? drawBezier(listDown, offset) : drawLine(listDown, offset); context.stroke(); context.closePath(); - countRef.current += 1; - - raf = requestAnimationFrame(drawGraph); + raf = requestAnimationFrame(() => drawGraph(now)); }; - drawGraph(); + drawGraph(Date.now()); return () => { cancelAnimationFrame(raf);