websocket会实时发送大量数据,导致页面卡顿?-灵析社区

只想躺平

下面的修改:1.用Map来存储位置参数,可以更快查到和更新数据。2.在onMessage事件里,用setTimeout来设置下一次心跳,而不用setInterval这个处理。加了一个重连机制,在onClose和onError事件里,如果WebSocket连接关闭或发生错误,会在5秒后重连。用requestAnimationFrame来更新实体位置,这样可以较少页面卡的情况。 整体的结构可以参考一下: let positionParams = new Map(); // 用Map来存储位置 function webValue() { let reconnectInterval = null; const onOpen = () => { // ... (其他代码) clearTimeout(reconnectInterval); }; const onMessage = async (event) => { // ... (其他代码) clearTimeout(pingInterval.value); pingInterval.value = setTimeout(sendHeartbeat, 5000); }; const onClose = () => { console.log('Websocket连接关闭'); reconnectInterval = setTimeout(webValue, 5000); }; const onError = (error) => { console.log('Websocket连接错误', error); reconnectInterval = setTimeout(webValue, 5000); }; // ... (省略其他代码) } function processPositionParams(data) { // ... (其他代码) const newPositionParam = { // ... (其他代码) }; const oldData = positionParams.get(data.uid); if (!oldData || isNewDataDifferent(newPositionParam, oldData)) { positionParams.set(data.uid, newPositionParam); } } function isNewDataDifferent(newData, oldData) { // ... (其他代码) } function updateEntityPositions() { requestAnimationFrame(() => { positionParams.forEach((position, uid) => { // 更新实体位置 }); }); } // ... (其他代码)

阅读量:1

点赞量:0

问AI