fix: reduce CPU usage caused by repeated refresh of "Current Proxy" card

This commit is contained in:
wonfen 2025-03-26 01:39:39 +08:00
parent 98d3a48710
commit 804fad6083

View File

@ -177,9 +177,9 @@ export const CurrentProxyCard = () => {
return; return;
} }
// 检查刷新间隔 // 检查刷新间隔,强制增加最小间隔
const now = Date.now(); const now = Date.now();
if (!force && now - lastRefreshRef.current < 1000) { if (!force && now - lastRefreshRef.current < 1500) {
return; return;
} }
@ -260,32 +260,33 @@ export const CurrentProxyCard = () => {
} finally { } finally {
isRefreshingRef.current = false; isRefreshingRef.current = false;
// 处理待处理的刷新请求 // 处理待处理的刷新请求,但增加延迟
if (pendingRefreshRef.current) { if (pendingRefreshRef.current) {
pendingRefreshRef.current = false; pendingRefreshRef.current = false;
setTimeout(() => fetchProxyData(), 100); setTimeout(() => fetchProxyData(), 500);
} }
} }
}, },
[isGlobalMode, isDirectMode], [isGlobalMode, isDirectMode],
); );
// 响应 currentProxy 变化 // 响应 currentProxy 变化,增加时间检查避免循环调用
useEffect(() => { useEffect(() => {
if ( if (
currentProxy && currentProxy &&
(!state.displayProxy || currentProxy.name !== state.displayProxy.name) (!state.displayProxy ||
(currentProxy.name !== state.displayProxy.name &&
Date.now() - lastRefreshRef.current > 1000))
) { ) {
fetchProxyData(true); fetchProxyData(true);
} }
}, [currentProxy, fetchProxyData, state.displayProxy]); }, [currentProxy, fetchProxyData]);
// 监听模式变化mode变化时刷新 // 监听模式变化mode变化时刷新
useEffect(() => { useEffect(() => {
fetchProxyData(true); fetchProxyData(true);
}, [mode, fetchProxyData]); }, [mode, fetchProxyData]);
// 计算要显示的代理选项 - 使用 useMemo 优化 // 计算要显示的代理选项 - 使用 useMemo 优化
const proxyOptions = useMemo(() => { const proxyOptions = useMemo(() => {
if (isDirectMode) { if (isDirectMode) {
@ -308,11 +309,11 @@ export const CurrentProxyCard = () => {
return []; return [];
}, [isDirectMode, isGlobalMode, state.proxyData, state.selection.group]); }, [isDirectMode, isGlobalMode, state.proxyData, state.selection.group]);
// 使用防抖包装状态更新,避免快速连续更新 // 使用防抖包装状态更新,避免快速连续更新,增加防抖时间
const debouncedSetState = useCallback( const debouncedSetState = useCallback(
debounce((updateFn: (prev: ProxyState) => ProxyState) => { debounce((updateFn: (prev: ProxyState) => ProxyState) => {
setState(updateFn); setState(updateFn);
}, 50), }, 300),
[], [],
); );
@ -390,11 +391,12 @@ export const CurrentProxyCard = () => {
}); });
} }
// 刷新代理信息,使用较短的延迟 // 延长刷新延迟时间
setTimeout(() => { setTimeout(() => {
refreshProxy(); refreshProxy();
fetchProxyData(true); // 给refreshProxy一点时间完成再触发fetchProxyData
}, 200); setTimeout(() => fetchProxyData(true), 300);
}, 500);
} catch (error) { } catch (error) {
console.error("更新代理失败", error); console.error("更新代理失败", error);
} }