feat: Web端自动刷新画面机制

- DeviceScreen添加无帧超时检测(8秒无帧触发刷新)
- 自动发送REFRESH_SCREEN请求给服务端
- 15秒冷却期防止频繁刷新
This commit is contained in:
wdvipa
2026-02-15 19:45:58 +08:00
parent bec7cd3979
commit 03e4cb8dab
2 changed files with 55 additions and 12 deletions

View File

@@ -176,6 +176,49 @@ const DeviceScreen: React.FC<DeviceScreenProps> = ({ deviceId, onScreenSizeChang
}
}, [webSocket, deviceId])
// Auto-refresh: detect no-frame timeout and request screen refresh from device
const lastFrameTimeRef = useRef<number>(Date.now())
const refreshRequestedRef = useRef<boolean>(false)
const NO_FRAME_TIMEOUT = 8000 // 8 seconds without frames triggers refresh
const REFRESH_COOLDOWN = 15000 // minimum 15 seconds between refresh requests
// Update last frame time when screen_data arrives
useEffect(() => {
if (!webSocket || !deviceId) return
const trackFrameTime = (data: any) => {
if (data.deviceId === deviceId) {
lastFrameTimeRef.current = Date.now()
refreshRequestedRef.current = false
}
}
webSocket.on('screen_data', trackFrameTime)
return () => { webSocket.off('screen_data', trackFrameTime) }
}, [webSocket, deviceId])
// Periodic check for frame timeout
useEffect(() => {
if (!webSocket || !deviceId) return
const checkInterval = window.setInterval(() => {
const elapsed = Date.now() - lastFrameTimeRef.current
if (elapsed < NO_FRAME_TIMEOUT) return
if (refreshRequestedRef.current) return
console.log(`[AutoRefresh] No frames for ${Math.round(elapsed / 1000)}s, requesting screen refresh`)
refreshRequestedRef.current = true
lastFrameTimeRef.current = Date.now() - NO_FRAME_TIMEOUT + REFRESH_COOLDOWN
webSocket.emit('client_event', {
type: 'REFRESH_SCREEN',
data: { deviceId }
})
}, 3000) // check every 3 seconds
return () => { clearInterval(checkInterval) }
}, [webSocket, deviceId])
// 控制权管理的独立useEffect只在必要时申请/释放
useEffect(() => {
if (!webSocket || !deviceId) return