编辑
2024-12-31
React
00

目录

优化 Tauri 项目中基于 Emit 的高频通信性能
问题背景
优化方案
1. 使用自定义 Hook 封装消息监听逻辑
2. 使用 useRef 存储最新状态
3. 优化回调函数存储
4. 优化消息处理函数
5. 优化状态更新逻辑
6. 使用 RxJS 优化事件监听
使用示例
性能优化效果
关键优化点总结
注意事项
  • [问题] 为什么频率过高
  • udp链接无人机进行mavlink通信, 太快了渲染一直在处理.

解决方案

[👍] 使用Observable,Observer
[👍] 对emit中内容进行

优化 Tauri 项目中基于 Emit 的高频通信性能

在开发 Tauri 应用时,我们经常需要处理前后端之间的频繁通信。然而,当通信频率过高时,可能会导致 CPU 使用率持续飙升的问题。本文将介绍一个基于 React Hooks 的优化方案,通过合理使用 useRef、useCallback 等手段来提升性能。

问题背景

在 Tauri 应用中,前端通常需要实时监听后端发送的消息。当消息频率较高时(例如设备状态更新),可能会出现以下问题:

  1. 频繁的状态更新导致组件重复渲染
  2. 重复创建监听器和回调函数
  3. 闭包引起的性能问题
  4. CPU 使用率居高不下

优化方案

1. 使用自定义 Hook 封装消息监听逻辑

首先,我们创建了一个 useMavlinkMessageListener 的自定义 Hook,用于统一处理消息监听逻辑:

typescript
export function useMavlinkMessageListener<T, R = T>( messageType: MavlinkMessageEnum, options: MavlinkMessageOptions<T, R> ) { // ... }

2. 使用 useRef 存储最新状态

为了避免闭包问题并减少不必要的重渲染,我们使用 useRef 来存储最新的状态值:

typescript
const stateRef = useRef<R>( transform ? transform(initialState) : (initialState as unknown as R) ); const [state, setState] = useState<R>(stateRef.current);

3. 优化回调函数存储

使用 useRef 存储回调函数和配置参数,避免因依赖变化导致效果重新运行:

typescript
const callbacksRef = useRef({ transform, filter, onError, debug }); useEffect(() => { callbacksRef.current = { transform, filter, onError, debug }; }, [transform, filter, onError, debug]);

4. 优化消息处理函数

使用 useCallback 包装消息处理函数,避免不必要的重新创建:

typescript
const processMessage = useCallback((rawMessage: T): R | null => { const { transform, filter } = callbacksRef.current; if (filter && !filter(rawMessage)) { return null; } return transform ? transform(rawMessage) : (rawMessage as unknown as R); }, []);

5. 优化状态更新逻辑

通过比较新旧状态,避免不必要的更新:

typescript
const updateState = useCallback((newState: R) => { const hasChanged = JSON.stringify(stateRef.current) !== JSON.stringify(newState); if (hasChanged) { stateRef.current = newState; setState(newState); } }, []);

6. 使用 RxJS 优化事件监听

使用 RxJS 的 Observable 模式来处理事件流,提供更好的错误处理和资源管理:

typescript
export const IpcClientListener = (name: string): Observable<ResultMeta> => { return new Observable((observer: Observer<ResultMeta>) => { try { const listener = listen(name, (event) => { observer.next(event.payload as ResultMeta); }); // 错误处理... } catch (error) { // 错误处理... } }); };

使用示例

typescript
const { message: MLStatustext } = useMavlinkMessageListener( MavlinkMessageEnum.STATUSTEXT, { debug: true, initialState: initialStatustext, } );

性能优化效果

通过上述优化措施,我们实现了以下改进:

  1. 减少了不必要的组件重渲染
  2. 避免了闭包带来的内存泄漏风险
  3. 优化了事件监听器的创建和销毁
  4. 显著降低了 CPU 使用率

关键优化点总结

  1. 使用 useRef 存储状态和回调函数,避免闭包问题
  2. 使用 useCallback 优化函数创建
  3. 实现状态比较逻辑,避免无效更新
  4. 采用 RxJS 处理异步事件流
  5. 统一的错误处理机制

注意事项

  1. 确保在组件卸载时正确清理监听器
  2. 合理使用 debug 模式进行问题排查
  3. 根据实际需求调整状态比较逻辑
  4. 注意异常处理的完整性

通过以上优化方案,我们成功解决了 Tauri 项目中由于高频通信导致的 CPU 性能问题。这个方案不仅适用于 Mavlink 消息处理,也可以推广到其他类似的高频通信场景中。

以上内容由claude.ai生成,结合解决思路与相关API,实现代码使用AI润色生成

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:还是夸张一点

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

还是夸张一点技术专栏 © 2019 - 2023 | 滇ICP备2022001556号
世间情动不过盛夏白瓷梅子汤,碎冰碰壁当啷响。