From 4bfa02023ca2542931dcca805ad4ee6de6ca230b Mon Sep 17 00:00:00 2001 From: Memory <134070804+Memory2314@users.noreply.github.com> Date: Wed, 4 Feb 2026 10:20:59 +0800 Subject: [PATCH] perf: improve core startup performance --- src/main/core/manager.ts | 4 +- src/main/core/process.ts | 2 +- src/main/index.ts | 86 ++++++++++++++++++++++++++-------------- src/main/utils/init.ts | 34 ++++++++++------ 4 files changed, 81 insertions(+), 45 deletions(-) diff --git a/src/main/core/manager.ts b/src/main/core/manager.ts index 9b3bbc1..7039f02 100644 --- a/src/main/core/manager.ts +++ b/src/main/core/manager.ts @@ -160,7 +160,9 @@ async function prepareCore(detached: boolean, skipStop = false): Promise { if (process.platform === 'win32') { diff --git a/src/main/index.ts b/src/main/index.ts index 6397736..20f31f2 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -128,9 +128,7 @@ app.on('open-url', async (_event, url) => { await handleDeepLink(url) }) -app.whenReady().then(async () => { - electronApp.setAppUserModelId('party.mihomo.app') - +const initPromise = (async () => { await initBasic() await checkHighPrivilegeCoreEarly() await initAdminStatus() @@ -144,52 +142,80 @@ app.whenReady().then(async () => { appConfig.language = systemLanguage } await initI18n({ lng: appConfig.language }) + return appConfig } catch (e) { safeShowErrorBox('common.error.initFailed', `${e}`) app.quit() + throw e } +})() - try { - initCoreWatcher() - const startPromises = await startCore() - if (startPromises.length > 0) { - startPromises[0].then(async () => { - await initProfileUpdater() - await initWebdavBackupScheduler() - await checkAdminRestartForTun() - }) - } - } catch (e) { - safeShowErrorBox('mihomo.error.coreStartFailed', `${e}`) - } +app.whenReady().then(async () => { + electronApp.setAppUserModelId('party.mihomo.app') - try { - await startMonitor() - } catch { - // ignore - } + const appConfig = await initPromise app.on('browser-window-created', (_, window) => { optimizer.watchWindowShortcuts(window) }) - const { showFloatingWindow: showFloating = false, disableTray = false } = await getAppConfig() registerIpcMainHandlers() - await createWindow() + + const createWindowPromise = createWindow() + + let coreStarted = false + const coreStartPromise = (async (): Promise => { + try { + initCoreWatcher() + const startPromises = await startCore() + if (startPromises.length > 0) { + startPromises[0].then(async () => { + await initProfileUpdater() + await initWebdavBackupScheduler() + await checkAdminRestartForTun() + }) + } + coreStarted = true + } catch (e) { + safeShowErrorBox('mihomo.error.coreStartFailed', `${e}`) + } + })() + + const monitorPromise = (async (): Promise => { + try { + await startMonitor() + } catch { + // ignore + } + })() + + await createWindowPromise + + const { showFloatingWindow: showFloating = false, disableTray = false } = appConfig + const uiTasks: Promise[] = [initShortcut()] if (showFloating) { - try { - await showFloatingWindow() - } catch (error) { - await logger.error('Failed to create floating window on startup', error) - } + uiTasks.push( + (async () => { + try { + await showFloatingWindow() + } catch (error) { + await logger.error('Failed to create floating window on startup', error) + } + })() + ) } if (!disableTray) { - await createTray() + uiTasks.push(createTray()) } - await initShortcut() + await Promise.all(uiTasks) + await Promise.all([coreStartPromise, monitorPromise]) + + if (coreStarted) { + mainWindow?.webContents.send('core-started') + } app.on('activate', () => { showMainWindow() diff --git a/src/main/utils/init.ts b/src/main/utils/init.ts index 060a0be..36f350a 100644 --- a/src/main/utils/init.ts +++ b/src/main/utils/init.ts @@ -165,7 +165,7 @@ async function killOldMihomoProcesses(): Promise { } } - await new Promise((resolve) => setTimeout(resolve, 500)) + await new Promise((resolve) => setTimeout(resolve, 200)) } catch { // 忽略错误 } @@ -389,19 +389,27 @@ export async function initBasic(): Promise { } export async function init(): Promise { - await startSubStoreFrontendServer() - await startSubStoreBackendServer() - const { sysProxy } = await getAppConfig() - try { - if (sysProxy.enable) { - await startPacServer() - } - await triggerSysProxy(sysProxy.enable) - } catch { - // ignore - } - await startSSIDCheck() + const initTasks: Promise[] = [ + startSubStoreFrontendServer(), + startSubStoreBackendServer(), + startSSIDCheck() + ] + + initTasks.push( + (async (): Promise => { + try { + if (sysProxy.enable) { + await startPacServer() + } + await triggerSysProxy(sysProxy.enable) + } catch { + // ignore + } + })() + ) + + await Promise.all(initTasks) initDeeplink() }