From 1ed382f126a158e0e92009214f6c2ffc8be17a50 Mon Sep 17 00:00:00 2001 From: root <13910913995@163.com> Date: Thu, 11 Dec 2025 09:49:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/Log/OrbbecSDK.log.txt | Bin 15334 -> 18731 bytes frontend/src/renderer/main/main.js | 11 +- frontend/src/renderer/main/preload.js | 13 +- frontend/src/renderer/src/views/Detection.vue | 34 +- ...Detection - 副本.vue => Detection_bak.vue} | 9 +- frontend/src/renderer/src/views/model.vue | 362 +++++++----------- frontend/src/renderer/vite.config.js | 2 +- 7 files changed, 194 insertions(+), 237 deletions(-) rename frontend/src/renderer/src/views/{Detection - 副本.vue => Detection_bak.vue} (99%) diff --git a/backend/Log/OrbbecSDK.log.txt b/backend/Log/OrbbecSDK.log.txt index 0079a34330193624ce1fba0da0e63c83d58561cc..8512bbae1fca351a19aec33b00170ac1c771f8a8 100644 GIT binary patch delta 1381 zcmZXUyG~m{5Qc?qIif*Au_JCtOaUT|z4wcez!vn-q=+0VQp80xP$4>a1Z1}71!#B! z@EbT!Ku4bkh?H5@oU=2o{b~Q1`M=}WtB1R}$Jg!fxKjJdS&N%4^IfjnmTRs2aBy_| z`|@-+a7MT=ssEyk(H1iYA39&iJI0xu8U6i13CrYgaCUxjF%23o>{G-^7$!p|&F>WP zTID&RSJ8A_Z*-2h(4XJLjCDp6=H=5Sjsga+6k63?gg9mxXL(e(u6mRNh;*=ae&9v# zR^JPN-;E;2eHMEwMMD5sA+n>u!p(4B!wUiB1&J9gH^aZBS { 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 d7ff8e68..e4921cee 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