返回搜索
Electron + Vue 性能监控图表数据不显示问题排查与修复
4次浏览1/8/2026
ElectronVue.jsChart.jsSQLite数据可视化性能监控IPC通信Vue响应式sql.js数据读取时间戳匹配

问题描述

性能监控页面的四个折线图(丢帧率、FPS稳定性、丢包率、码率稳定性)无法显示数据。前端能接收到数据(数组长度正确),但图表中所有数据点都是0或null,导致图表空白。

根本原因

问题由多个层次的问题叠加导致: 1. **IPC响应格式问题**:后端返回的数据被包装在 `{success: true, data: [...]}` 中,前端直接使用 `result` 而不是 `result.data` 2. **Vue响应式问题**:`props.taskId` 在异步更新时,`open()` 方法执行时 `taskId` 还未更新,导致数据加载失败 3. **SQLite数据读取问题**:`SqlJsStatement.all()` 方法使用 `getColumn()` 读取数值类型时返回 `null`,需要使用 `getAsObject()` 方法 4. **时间戳匹配问题**:图表生成固定的时间轴(每秒一个点),而数据库中的时间戳可能不完全对齐,导致数据无法匹配到时间轴上

解决方案

分步骤修复: 1. **修复IPC响应处理**:在 `StreamPerformanceViewer.vue` 中正确提取 `result.data` 2. **修复Vue响应式问题**:修改 `open()` 方法接受 `taskId` 作为直接参数,避免依赖异步更新的 `props.taskId` 3. **修复SQLite数据读取**:在 `database.ts` 的 `SqlJsStatement.all()` 方法中优先使用 `getAsObject()`,如果失败则回退到逐列读取 4. **简化图表逻辑**:移除所有时间轴生成和映射逻辑,直接使用数据库中的时间戳作为横轴,按时间戳排序后直接显示,不做任何对齐或插值处理

背景信息

技术栈:Electron + Vue 3 + Chart.js + SQLite (sql.js) - 前端组件:`StreamPerformanceViewer.vue` - 后端服务:`StorageService.ts`, `PerformanceHistoryService.ts`, `StreamTaskExecutor.ts` - 数据库适配器:`database.ts` (SqlJsAdapter) - IPC通信:`streamHandlers.ts` 数据流程:FFmpeg输出 → StreamTaskExecutor → PerformanceHistoryService → StorageService → IPC → 前端组件 → Chart.js 关键代码修改: - `src/renderer/components/StreamPerformanceViewer.vue`: 修复数据提取和图表生成逻辑 - `src/main/utils/database.ts`: 修复SQLite数据读取方法 - `src/main/modules/StorageService.ts`: 添加调试日志 - `src/renderer/components/StreamStatus.vue`: 修复taskId传递