#1247·note-gen

[feat] 降低后台时webview2内存占用

Author: scoliaCreated Sep 7, 2026Updated Sep 10, 2026

描述你的建议

如题,现在即使程序在后台不渲染,webview2依旧有100mb左右的占用,可以在进入后台时,通过set_memory_usage_level设置为low,降低内存占用。

use tauri::Manager;
use windows_core::Interface;

pub fn setup_memory_optimization(app: &tauri::App) -> Result<(), Box<dyn std::error::Error>> {
    let app_handle = app.handle().clone();
    if let Some(window) = app.get_webview_window("main") {
        window.on_window_event(move |event| {
            if let tauri::WindowEvent::Focused(focused) = event {
                set_memory_usage_level(&app_handle, !focused);
            }
        });
    }
    Ok(())
}

fn set_memory_usage_level(app: &tauri::AppHandle, low: bool) {
    if let Some(window) = app.get_webview_window("main") {
        let webview = window.as_ref();
        let _ = webview.with_webview(move |wv| {
            #[cfg(windows)]
            unsafe {
                use webview2_com::Microsoft::Web::WebView2::Win32::{
                    COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_LOW,
                    COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_NORMAL,
                    ICoreWebView2_19,
                };

                let controller = wv.controller();
                let core_webview = match controller.CoreWebView2() {
                    Ok(v) => v,
                    Err(_) => return,
                };
                let webview_19 = match core_webview.cast::<ICoreWebView2_19>() {
                    Ok(v) => v,
                    Err(_) => return,
                };
                let level = if low {
                    COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_LOW
                } else {
                    COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_NORMAL
                };
                let _ = webview_19.SetMemoryUsageTargetLevel(level);
            }
        });
    }
}