diff --git a/frontend/src/renderer/main/main.js b/frontend/src/renderer/main/main.js index fc338ea0..d1de71c0 100644 --- a/frontend/src/renderer/main/main.js +++ b/frontend/src/renderer/main/main.js @@ -8,6 +8,12 @@ let mainWindow; let localServer; let backendProcess; + app.disableDomainBlockingFor3DAPIs(); +// app.disableHardwareAcceleration(); + app.commandLine.appendSwitch('ignore-gpu-blocklist'); + app.commandLine.appendSwitch('enable-webgl'); + app.commandLine.appendSwitch('use-angle', 'd3d11'); + ipcMain.handle('generate-report-pdf', async (event, payload) => { const win = BrowserWindow.fromWebContents(event.sender); if (!win) throw new Error('窗口未找到'); @@ -193,7 +199,6 @@ function createWindow() { nodeIntegration: false, contextIsolation: true, // sandbox: false, // 显式关闭沙盒,避免 preload 加载问题 - // backgroundThrottling: false, preload: path.join(__dirname, 'preload.js') }, icon: path.join(__dirname, '../public/logo.png'), @@ -311,7 +316,7 @@ function startLocalServer(callback) { // 应用事件处理 // 关闭硬件加速以规避 GPU 进程异常导致的闪烁 -app.disableHardwareAcceleration(); +// app.disableHardwareAcceleration(); app.whenReady().then(createWindow); app.on('window-all-closed', () => { @@ -334,4 +339,4 @@ app.on('activate', () => { // 应用退出前清理资源 app.on('before-quit', () => { stopBackendService(); -}); \ No newline at end of file +}); diff --git a/frontend/src/renderer/main/preload.js b/frontend/src/renderer/main/preload.js index 511db204..222465b0 100644 --- a/frontend/src/renderer/main/preload.js +++ b/frontend/src/renderer/main/preload.js @@ -1,6 +1,15 @@ -const { contextBridge, ipcRenderer } = require('electron'); +const { contextBridge } = require('electron'); contextBridge.exposeInMainWorld('electronAPI', { - generateReportPdf: (payload) => ipcRenderer.invoke('generate-report-pdf', payload), + generateReportPdf: (payload) => { + try { + return window?.electron?.ipcRenderer?.invoke('generate-report-pdf', payload) + } catch {} + }, getBackendUrl: () => process.env.BACKEND_URL || 'http://localhost:5000', + getSocketTransports: () => { + const allowPolling = process.env.ALLOW_POLLING === '1' + return allowPolling ? ['websocket', 'polling'] : ['websocket'] + } }); + diff --git a/frontend/src/renderer/src/views/Detection.vue b/frontend/src/renderer/src/views/Detection.vue index 538a8556..1ab2c1de 100644 --- a/frontend/src/renderer/src/views/Detection.vue +++ b/frontend/src/renderer/src/views/Detection.vue @@ -133,7 +133,7 @@ {{ headlist.rotation }}°
- +
@@ -585,6 +585,11 @@ let imuSocket = null let pressureSocket = null let restartSocket = null let frameCount = 0 +let latestFrameCamera1 = '' +let latestFrameCamera2 = '' +let rafScheduled = false +let lastRenderTs = 0 +const MAX_RENDER_FPS = 30 // 后端服务器地址配置 const BACKEND_URL = getBackendUrl() @@ -1216,13 +1221,30 @@ function displayFrame(base64Image) { function displayCameraFrameById(deviceId, base64Image) { if (base64Image && base64Image.length > 0) { - const url = 'data:image/jpeg;base64,' + base64Image if (String(deviceId).toLowerCase() === 'camera2') { - camera2ImgSrc.value = url + latestFrameCamera2 = base64Image } else { - camera1ImgSrc.value = url - // 旧变量保留(避免其它位置引用出错) - rtspImgSrc.value = url + latestFrameCamera1 = base64Image + } + if (!rafScheduled) { + rafScheduled = true + requestAnimationFrame(() => { + const now = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now() + const minInterval = 1000 / MAX_RENDER_FPS + if (now - lastRenderTs >= minInterval) { + if (latestFrameCamera1) { + const url1 = 'data:image/jpeg;base64,' + latestFrameCamera1 + camera1ImgSrc.value = url1 + rtspImgSrc.value = url1 + } + if (latestFrameCamera2) { + const url2 = 'data:image/jpeg;base64,' + latestFrameCamera2 + camera2ImgSrc.value = url2 + } + lastRenderTs = now + } + rafScheduled = false + }) } } else { console.warn('⚠️ 收到空的视频帧数据') diff --git a/frontend/src/renderer/src/views/Detection - 副本.vue b/frontend/src/renderer/src/views/Detection_bak.vue similarity index 99% rename from frontend/src/renderer/src/views/Detection - 副本.vue rename to frontend/src/renderer/src/views/Detection_bak.vue index b4acb8a9..66c6b64d 100644 --- a/frontend/src/renderer/src/views/Detection - 副本.vue +++ b/frontend/src/renderer/src/views/Detection_bak.vue @@ -579,10 +579,11 @@
- + video
- + + + \ No newline at end of file diff --git a/frontend/src/renderer/vite.config.js b/frontend/src/renderer/vite.config.js index 5236fae8..c6b9c5d7 100644 --- a/frontend/src/renderer/vite.config.js +++ b/frontend/src/renderer/vite.config.js @@ -24,7 +24,7 @@ export default defineConfig({ }, server: { port: 3000, - host: 'localhost', + host: '0.0.0.0', // 开发服务器配置 cors: true, strictPort: false