# 内存优化指南 ## 概述 本指南介绍了身体平衡评估系统中WebSocket视频流的内存优化功能,帮助您解决浏览器内存占用缓慢增长的问题。 ## 问题描述 在长时间运行WebSocket视频流时,可能会遇到以下问题: - 浏览器内存使用量持续增长 - 页面响应速度逐渐变慢 - 系统资源占用过高 - 可能导致浏览器崩溃 ## 优化方案 ### 1. 前端优化 #### 1.1 帧率控制 - **最大FPS限制**: 默认15fps,可根据需要调整 - **跳帧机制**: 每3帧显示1帧,减少处理负担 - **自适应帧率**: 根据内存使用情况动态调整 #### 1.2 内存监控 - **实时监控**: 每10秒检查一次内存使用情况 - **自动清理**: 内存使用率超过80%时自动垃圾回收 - **手动控制**: 提供手动垃圾回收按钮 #### 1.3 图像缓存优化 - **缓存复用**: 重用Image对象,避免频繁创建 - **及时清理**: 及时释放不再使用的图像资源 - **强制重绘**: 使用requestAnimationFrame优化渲染 ### 2. 后端优化 #### 2.1 图像压缩 - **尺寸压缩**: 最大分辨率320x240 - **质量压缩**: JPEG质量设为50% - **编码优化**: 禁用渐进式JPEG,启用优化 #### 2.2 内存管理 - **内存限制**: 后端最大内存使用100MB - **定期检查**: 每50帧检查一次内存使用 - **强制清理**: 内存超限时强制垃圾回收 #### 2.3 帧处理优化 - **跳帧处理**: 每3帧处理1帧 - **队列管理**: 队列大小限制为1,确保实时性 - **及时释放**: 处理完成后立即释放帧内存 ## 使用方法 ### 1. 启动优化版本 确保使用最新的优化版本: ```bash # 启动后端(已包含内存优化) python backend/app.py # 打开前端页面 # 访问 frontend_websocket_example.html ``` ### 2. 监控内存使用 在前端页面中: 1. 点击 **"内存使用情况"** 按钮查看当前内存状态 2. 观察以下指标: - 已使用内存 - 总分配内存 - 内存使用率 - 接收帧数和跳帧率 ### 3. 手动优化 当发现内存使用过高时: 1. 点击 **"强制垃圾回收"** 按钮 2. 观察内存使用情况的变化 3. 如果问题持续,考虑刷新页面 ### 4. 配置调整 编辑 `memory_config.py` 文件来调整优化参数: ```python # 前端配置 MAX_FPS = 15 # 降低可减少内存使用 FRAME_SKIP_THRESHOLD = 2 # 增加可减少处理负担 MAX_MEMORY_USAGE_PERCENT = 80 # 调整自动清理阈值 # 后端配置 JPEG_QUALITY = 50 # 降低可减少内存使用 MAX_FRAME_WIDTH = 320 # 降低可减少内存使用 MAX_BACKEND_MEMORY_MB = 100 # 调整内存限制 ``` ## 性能调优建议 ### 1. 根据硬件调整 **低配置设备**: ```python MAX_FPS = 10 FRAME_SKIP_THRESHOLD = 4 JPEG_QUALITY = 40 MAX_FRAME_WIDTH = 240 ``` **高配置设备**: ```python MAX_FPS = 20 FRAME_SKIP_THRESHOLD = 1 JPEG_QUALITY = 60 MAX_FRAME_WIDTH = 480 ``` ### 2. 根据网络调整 **慢速网络**: - 降低帧率和质量 - 增加跳帧比例 - 减小图像尺寸 **快速网络**: - 可适当提高帧率和质量 - 减少跳帧比例 ### 3. 长时间运行优化 对于需要长时间运行的场景: 1. 设置更严格的内存限制 2. 增加自动清理频率 3. 定期刷新页面(建议每2-4小时) ## 故障排除 ### 1. 内存仍然增长 **可能原因**: - 浏览器不支持强制垃圾回收 - 其他页面或扩展占用内存 - 系统内存不足 **解决方案**: 1. 使用Chrome浏览器并启用 `--enable-precise-memory-info` 标志 2. 关闭其他不必要的标签页 3. 降低优化参数设置 4. 定期刷新页面 ### 2. 视频卡顿 **可能原因**: - 帧率设置过低 - 跳帧比例过高 - 网络延迟 **解决方案**: 1. 适当提高MAX_FPS 2. 减少FRAME_SKIP_THRESHOLD 3. 检查网络连接 4. 优化后端处理性能 ### 3. 图像质量差 **可能原因**: - JPEG质量设置过低 - 图像尺寸压缩过度 **解决方案**: 1. 提高JPEG_QUALITY(建议不超过70) 2. 增加MAX_FRAME_WIDTH和MAX_FRAME_HEIGHT 3. 平衡质量和内存使用 ## 监控和日志 ### 1. 前端监控 在浏览器控制台中查看: ```javascript // 查看内存使用 console.log(performance.memory); // 查看优化统计 console.log('帧数:', frameCount); console.log('跳帧数:', frameSkipCount); ``` ### 2. 后端日志 查看后端日志中的内存相关信息: ``` [INFO] 内存使用: 45.2MB [WARNING] 内存使用过高: 105.3MB,强制清理 [INFO] 垃圾回收完成,内存降至: 38.7MB ``` ## 最佳实践 1. **定期监控**: 每隔一段时间检查内存使用情况 2. **合理配置**: 根据实际需求调整优化参数 3. **及时清理**: 发现内存异常时及时进行清理 4. **版本更新**: 保持使用最新的优化版本 5. **硬件匹配**: 根据硬件配置调整参数 ## 技术原理 ### 1. 内存泄漏原因 - 频繁创建Image对象 - Base64字符串累积 - 事件监听器未正确清理 - 浏览器垃圾回收不及时 ### 2. 优化原理 - 对象复用减少创建开销 - 及时释放减少内存占用 - 跳帧处理减少处理负担 - 强制垃圾回收释放内存 ### 3. 性能平衡 - 内存使用 vs 视频质量 - 实时性 vs 资源占用 - 用户体验 vs 系统稳定性 --- 如有其他问题,请查看项目文档或联系技术支持。