问题描述 / Problem Description
Orca 在 Windows 上启动很慢(约 8.5 秒),界面时不时卡住并显示未响应。
Orca starts very slowly on Windows (about 8.5 seconds), and the UI occasionally freezes and shows "Not Responding".
启动日志分析 / Startup Log Analysis
通过设置 ORCA_STARTUP_DIAGNOSTICS=1 环境变量捕获启动日志,发现以下时间线:
By setting the ORCA_STARTUP_DIAGNOSTICS=1 environment variable to capture startup logs, the following timeline was found:
t=763 app-ready
t=773 store-loaded (27KB, 0ms read)
t=1106 services-initialized (+333ms)
t=1152 window-created
t=7455 load-start (+6303ms ← Major bottleneck!)
t=8244 event-loop-stall maxGapMs=7395 ← UI freezing cause
t=8506 ready-to-show (Total startup 8.5 seconds)
t=135583 did-finish-load (Page load complete)
t=135596 event-loop-stall maxGapMs=127146 ← Main thread blocked for 127 seconds
t=135890 renderer-startup-chain-start
根本原因 / Root Cause
-
主线程被阻塞 128 秒 - 从 loadMainWindow 调用后,主线程还在执行大量同步代码(第 806-972 行),导致渲染进程的 JavaScript 无法执行。
Main thread blocked for 128 seconds - After loadMainWindow is called, the main thread is still executing a large amount of synchronous code (lines 806-972), causing the renderer process's JavaScript to be unable to execute.
-
渲染进程启动链串行执行 - 12+ 个 IPC 调用依次执行。
Renderer startup chain executes serially - 12+ IPC calls execute sequentially.
阻塞主线程的操作 / Operations Blocking the Main Thread
在 window-created 和 load-start 之间(第 781-973 行),有大量同步操作:
Between window-created and load-start (lines 781-973), there are many synchronous operations:
-
registerCoreHandlers (第 806-833 行) - 注册 40+ 个 IPC 处理程序
Register 40+ IPC handlers
-
automations.start() (第 835 行) - 启动自动化服务
Start automation service
-
attachMainWindowServices (第 836-853 行) - 注册更多 IPC 处理程序
Register more IPC handlers
-
rateLimits.start() (第 858 行) - 启动限速服务
Start rate limiting service
-
createSystemTray (第 882-896 行) - 创建系统托盘
Create system tray
-
agentHookServer.setListener (第 901-954 行) - 设置事件监听器
Set event listeners
解决方案建议 / Proposed Solutions
方案 1:将非关键操作移到 loadMainWindow 之后 / Move non-critical operations after loadMainWindow
将不影响首屏渲染的操作延迟到页面加载完成后执行:
Defer operations that don't affect first-screen rendering until after page load:
- 系统托盘创建 / System tray creation
- 限速服务启动 / Rate limiting service startup
- 非关键 IPC 处理程序注册(如 GitHub、GitLab、Linear、Jira 等)
Non-critical IPC handler registration (e.g., GitHub, GitLab, Linear, Jira, etc.)
方案 2:并行化渲染进程启动链 / Parallelize renderer startup chain
将独立的 IPC 调用并行执行:
Execute independent IPC calls in parallel:
// 原先串行执行 / Originally serial execution
await fetchSettings()
await fetchRepos()
await fetchProjectGroups()
await fetchWorktrees()
// ...
// 改为并行执行 / Changed to parallel execution
await Promise.all([
fetchSettings(),
fetchRepos(),
fetchProjectGroups(),
fetchWorktrees(),
// ...
])
方案 3:延迟加载非关键 IPC 处理程序 / Lazy load non-critical IPC handlers
只注册首屏必需的 IPC 处理程序,其他处理器按需加载:
Only register IPC handlers required for first screen, load others on demand:
首屏必需 / Required for first screen:
- settings:get
- repos:getAll
- projectGroups:getAll
- folderWorkspaces:getAll
- worktrees:getAll
- worktreeLineage:get
- ui:get
- session:get
- keybindings:get
- browser:getSessionProfiles
- onboarding:get
可延迟加载 / Can be lazy loaded:
- github:* (GitHub 相关 / GitHub related)
- gitlab:* (GitLab 相关 / GitLab related)
- linear:* (Linear 相关 / Linear related)
- jira:* (Jira 相关 / Jira related)
- feedback:* (反馈相关 / Feedback related)
- stats:* (统计相关 / Statistics related)
- 等等 / etc.
预期效果 / Expected Results
- 启动时间从 8.5 秒减少到 2-3 秒 / Startup time reduced from 8.5 seconds to 2-3 seconds
- 界面不再显示未响应 / UI no longer shows "Not Responding"
- 渲染进程启动链更快执行 / Renderer startup chain executes faster
环境信息 / Environment Information
- Orca 版本 / Version:1.4.119
- 操作系统 / OS:Windows 10 Pro 10.0.19045
- 启动参数 / Launch args:
--disable-gpu --disable-gpu-compositing --disable-gpu-sandbox
附件 / Attachments
启动日志文件已保存到 orca-startup.log。
The startup log file has been saved to orca-startup.log.
问题描述 / Problem Description
Orca 在 Windows 上启动很慢(约 8.5 秒),界面时不时卡住并显示未响应。
Orca starts very slowly on Windows (about 8.5 seconds), and the UI occasionally freezes and shows "Not Responding".
启动日志分析 / Startup Log Analysis
通过设置
ORCA_STARTUP_DIAGNOSTICS=1环境变量捕获启动日志,发现以下时间线:By setting the
ORCA_STARTUP_DIAGNOSTICS=1environment variable to capture startup logs, the following timeline was found:根本原因 / Root Cause
主线程被阻塞 128 秒 - 从
loadMainWindow调用后,主线程还在执行大量同步代码(第 806-972 行),导致渲染进程的 JavaScript 无法执行。Main thread blocked for 128 seconds - After
loadMainWindowis called, the main thread is still executing a large amount of synchronous code (lines 806-972), causing the renderer process's JavaScript to be unable to execute.渲染进程启动链串行执行 - 12+ 个 IPC 调用依次执行。
Renderer startup chain executes serially - 12+ IPC calls execute sequentially.
阻塞主线程的操作 / Operations Blocking the Main Thread
在
window-created和load-start之间(第 781-973 行),有大量同步操作:Between
window-createdandload-start(lines 781-973), there are many synchronous operations:registerCoreHandlers(第 806-833 行) - 注册 40+ 个 IPC 处理程序Register 40+ IPC handlers
automations.start()(第 835 行) - 启动自动化服务Start automation service
attachMainWindowServices(第 836-853 行) - 注册更多 IPC 处理程序Register more IPC handlers
rateLimits.start()(第 858 行) - 启动限速服务Start rate limiting service
createSystemTray(第 882-896 行) - 创建系统托盘Create system tray
agentHookServer.setListener(第 901-954 行) - 设置事件监听器Set event listeners
解决方案建议 / Proposed Solutions
方案 1:将非关键操作移到
loadMainWindow之后 / Move non-critical operations afterloadMainWindow将不影响首屏渲染的操作延迟到页面加载完成后执行:
Defer operations that don't affect first-screen rendering until after page load:
Non-critical IPC handler registration (e.g., GitHub, GitLab, Linear, Jira, etc.)
方案 2:并行化渲染进程启动链 / Parallelize renderer startup chain
将独立的 IPC 调用并行执行:
Execute independent IPC calls in parallel:
方案 3:延迟加载非关键 IPC 处理程序 / Lazy load non-critical IPC handlers
只注册首屏必需的 IPC 处理程序,其他处理器按需加载:
Only register IPC handlers required for first screen, load others on demand:
首屏必需 / Required for first screen:
可延迟加载 / Can be lazy loaded:
预期效果 / Expected Results
环境信息 / Environment Information
--disable-gpu --disable-gpu-compositing --disable-gpu-sandbox附件 / Attachments
启动日志文件已保存到
orca-startup.log。The startup log file has been saved to
orca-startup.log.