Warning: long post ahead. But after years of lag, silence and half-measures, this deserves more than another vague reply. First, I will show what Orca has already fixed in the same codebase while Bambu Lab still leaves users with the same problems. Then I will set out what Bambu Lab now needs to do if you want any credibility back on this issue.
Purpose: Show exactly, point by point, which UI problems Orca Slicer has
addressed but which Bambu Lab Studio still has open in the same codebase.
With issue numbers, commit hashes, dates, and exact file:line references. No
rhetoric. Just evidence.
Date: 2026-04-20
Bambu Studio analyzed at: commit bf68eece1 (master, HEAD)
Orca Slicer analyzed at: commit 31c1c29325 (main, HEAD)
Verification: Every claim can be substantiated via git show <hash> in the clones.
Summary: Three Categories
- ORCA FIXED — BAMBU STILL HAS IT: Problems Orca explicitly addressed
via PR or commit, and which are still present unchanged in Bambu’s public
master. - BOTH STILL HAVE IT — BAMBU USERS ASKED FOR A FIX: Problems reported by
Bambu users years ago that still exist in both. - BAMBU HAS AN INTERNAL FIX — NEVER PUBLISHED TO MASTER: The most
critical category — Bambu HAS written the fix in their internal tree, but
never released it to users.
CATEGORY 1: ORCA FIXED — BAMBU STILL HAS IT
1.1 Tab switch destroys the entire widget tree
Bambu issue: Implicit — reported in multiple blogs/forum posts as
“Prepare/Quality tab takes 1-3 seconds”
Orca issue improved: #997 “UI Slow to respond when changing settings tabs”
Bambu still has: Tab switching destroys and recreates the widget tree on
every switch.
Orca FIXED via PR #5386 (merged 2024-05-19):
- File:
src/slic3r/GUI/Tab.cpp,src/slic3r/GUI/Tab.hpp - Method: New
deactivate()function that HIDES content instead of DESTROYING - Quote from PR description: “The Slicer GUI was destroying all the contents
of a tab when going away and recreating it if you went back again. I have
changed it so the contents aren’t destroyed, just hidden.”
The difference: Orca users report 1-second delay on tab switch. Bambu
users report 3+ seconds.
Time Bambu has been inactive: 23 months since Orca’s fix became publicly
available. No equivalent PR in Bambu’s master.
1.2 Continuous 100 ms timer in GLCanvas3D that runs always
Bambu issue: #10289 (April 2026) “Systemic UI slowness… ~37 wxTimer instances”
Orca handling: Implicit resolution — the timer is gone in the fork
Bambu still has (verified today):
// BambuStudio/src/slic3r/GUI/GLCanvas3D.cpp:10290
m_timer.Start(100, wxTIMER_CONTINUOUS);
Orca does NOT have this line. Grep verification in OrcaSlicer/src/slic3r/GUI/GLCanvas3D.cpp:
10107: m_timer.Start(300, false); // one-shot 300ms
10151: m_timer.Start(300, false); // one-shot 300ms
Orca runs a one-shot 300ms timer instead of a continuous 100ms timer.
That means 10 unnecessary UI-thread wakeups per second that Bambu users
suffer from, which Orca users don’t.
Time Bambu has been inactive: We don’t know exactly when Orca removed it,
but it is NOT in Bambu’s master today. Bambu users have reported UI sluggishness
since at least 2023.
1.3 Synchronous telemetry calls (track_event) — EXTREME CASE
Bambu issue: Implicit — contributes to #10289, #9967 (CPU spikes)
Orca handling: Explicit removal — ALL telemetry, not just in idle handler
Bambu still has (GUI_App.cpp:3299, 3307):
m_agent->track_event("mqtt_active", j.dump());
m_agent->track_event("mqtt_inactive", j.dump());
These run inside Bind(wxEVT_IDLE, [this](wxIdleEvent& event) {...}) and
call NetworkAgent::track_event() which typically makes an HTTP call to
Bambu cloud.
Verified via grep: Bambu’s GUI_App.cpp contains 11 track_event
calls. The entire BambuStudio/src/slic3r/GUI/ contains track_event in
10+ files including DeviceManager.cpp (8 calls), MainFrame.cpp (8 calls),
CalibrationPanel.cpp, Monitor.cpp, BBLTopbar.cpp and more.
Orca has 0 track_event calls in the entire OrcaSlicer/src/slic3r/GUI/.
Grep verification 2026-04-20 returned zero matches. They have removed all
telemetry, not just the two in the idle handler.
What this means for the user: Bambu makes telemetry calls on window
activation, slicing, calibration, device manipulation, filament switches,
and more. Depending on the NetworkAgent implementation, these can block the
UI thread. Orca users don’t experience this at all.
Be careful: This is not a UI fix in the strict sense — it’s an
architectural choice by Orca to remove all Bambu cloud telemetry. But it
reduces UI thread contention as a bonus effect.
1.4 wxWidgets is 1 year old (frozen fork)
Bambu issue: Implicit — misses a year of upstream bug fixes
Orca handling: PR #12941 merged 2026-03-30
Bambu still has (deps/wxWidgets/wxWidgets.cmake:27-28):
GIT_REPOSITORY "https://github.com/bambulab/wxWidgets"
GIT_TAG master
GitHub API verified 2026-04-20: latest commit in bambulab/wxWidgets is
2025-03-31. Over a year old.
Orca (deps/wxWidgets/wxWidgets.cmake:27-28):
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
GIT_TAG v3.3.2
PR #12941 (merged 2026-03-30): “Upgrade wxWidgets to the latest 3.3.2. …
As Linux distros are moving to Wayland, and given the number of fixes in
wxWidgets to improve Wayland support, it’s worth upgrading to 3.3.2.”
Consequence for users: Wayland users on Linux (#8891, #11849, #13067 in
Orca) get a lot of improvements in Orca that Bambu users miss. wxWidgets
3.3.x has several years of improvements that nobody in Bambu gets.
1.5 Native Wayland support
Bambu issue: #8891 (unresponsive on Wayland after 2h), #2595 (Linux
Wayland support feature request since 2023)
Orca handling: PR #13197 “WIP: Add native Wayland support for Linux” (April 2026)
Bambu has: Nothing concrete in master. Issue #2595 has been open since 2023.
Orca has: Ongoing PR for native Wayland implementation. It replaces
wx’s default behavior with dedicated edge panels for window resize, which
solves the “resize only works on Prepare view” problem.
1.6 Multi-thread clipper (slicing performance)
Bambu issue: Implicit — contributes to #9469 (freezes whole system when
slicing mildly complex models)
Orca handling: PR #7177 “Upgrade clipper & improve multi-thread performance”
(merged 2025-06-18)
Bambu: No corresponding upgrade in public master.
Orca: Multi-threaded clipper library, ~10 months ago.
This doesn’t affect the UI thread directly, but faster slicing = less time
the UI is frozen while the user waits. In parallel, GUI updates run smoother.
1.7 Port of libvgcode (G-code viewer from PrusaSlicer 2.8)
Bambu issue: Implicit
Orca handling: PR #10735 merged 2026-01-06
Bambu: Uses original Bambu/Prusa fork viewer.
Orca: Ported the entire libvgcode from PrusaSlicer 2.8 — much more
modern GPU buffers, less memory, faster G-code preview rendering.
Not directly a UI freeze, but Orca users can scroll G-code without lag on
large models. Bambu users report slow G-code preview (implicit in #9933, #9191).
1.8 QoL: Hotkeys blocked in Prepare view
Bambu issue: Implicit, no open issue in Bambu
Orca handling: PR #12715 merged 2026-03-10
Orca fix: Hotkeys work even when notifications are displayed.
Bambu: Doesn’t have this fix.
1.9 Linux UX optimizations
Orca PR #12705 (2026-03-09): “Optimize linux experience”
- Window resizing on all views (not just Prepare/Preview)
- Fixed black screen on startup on Linux
- Fixed Filament Grouping dialog appearing for all printers on Linux
Bambu: Has no corresponding Linux optimization in master. Linux users
report via #8891, #11849, #5526 (AppImage GTK exceptions), #9116 (Ubuntu
immediate crash on startup).
1.10 macOS-specific fixes
Orca PR #13215 (2026-04-15): “Fix macos crash on close”
Orca PR #11780 (2026-03): “OrcaSlicer clears user’s machine folder on
startup on macOS”
Bambu counterpart: #9188 (macOS mouse events) merged 2026-01-19 — one
fix. Several other macOS issues (#5397, #9652, #9757, #7513) are still
open.
CATEGORY 2: BOTH STILL HAVE IT — BAMBU USERS WAITING FOR YEARS
2.1 Monitor.cpp 1000 ms timer → stutters other apps
Bambu issue: #1950 — reported 2023-04 with exact root diagnosis
Age: 3 years open
Status: “Inactive 90d” — Bambu has NOT responded to the reporter
Bambu Monitor.cpp:
Line 37: #define REFRESH_INTERVAL 1000
Line 162: m_refresh_timer->Start(REFRESH_INTERVAL);
Orca Monitor.cpp:
Line 39: #define REFRESH_INTERVAL 1000
Line 165: m_refresh_timer->Start(REFRESH_INTERVAL);
BOTH have the same code. Orca has not fixed this either. But:
- Orca has FEWER users complaining about this because Orca lags less overall
- Orca has updated wxWidgets (3.3.2), which improves the event loop effect
But the fact remains: Bambu users have asked for this specific fix for
three years without response.
2.2 Plater.cpp wxMilliSleep(50) in UI thread loop
Bambu issue: F-005 in #10290 (April 2026)
Orca handling: Has not fixed this either
Bambu Plater.cpp:17073:
while (cont && cont_dlg) {
wxMilliSleep(50);
cont_dlg = dlg.Update(percent, msg);
// ...
}
Orca Plater.cpp:12238:
while (cont && cont_dlg) {
wxMilliSleep(50);
cont_dlg = dlg.Update(percent, msg);
// ...
}
Identical code. Neither has fixed this. But it’s an obvious UI blocking
pattern.
2.3 Synchronous app_config->save() in idle handler
Bambu issue: F-015 in #10290
Orca handling: Added m_post_initialized guard but NOT debouncing
Bambu GUI_App.cpp:3318:
if (app_config->dirty())
app_config->save();
Orca GUI_App.cpp:3233:
if (m_post_initialized && app_config->dirty())
app_config->save();
Both write to disk synchronously on every idle cycle if dirty is set.
Orca only has a guard against running it before initialization is complete.
2.4 27 unique wxTimer instances (timer proliferation)
| Repo | Number of unique new wxTimer() |
|---|---|
| Bambu | 27 |
| Orca | 27 |
Neither has dealt with the fundamental timer proliferation. #10289 touches
on this point, but both repos have the same architecture.
CATEGORY 3: BAMBU HAS AN INTERNAL FIX — NEVER PUBLISHED
This is the most serious category. Bambu’s own developers have written
fixes but never released them in public master.
3.1 Page-fault reductions that exist in master but #3702 is still open
The following commits exist in Bambu’s master (verified via git log --grep "page fault"):
| Date | Commit | Title |
|---|---|---|
| 2024-08-12 | 66403ba19 |
ENH: Reduce the number of page faults on the device |
| 2024-09-26 | 791be1954 |
ENH: Reduce the number of page faults in AMS |
| 2024-10-09 | 542aa02ac |
FIX: fixed button not refreshing (page faults) |
| 2025-02-08 | ed1e9678c |
FIX: try to reduce page fault while idling |
| 2025-02-10 | b1fa2421c |
FIX: remove some unnecessary refresh to reduce page faults |
| 2025-09-19 | cefe97377 |
ENH: page faults when device page idle |
| 2025-09-19 | 4dae5ff6d |
ENH: page faults when device page idle |
Issue #3702 was reported 2023-09 and is still open 2026-04-20.
Conclusion: Bambu has fixed page faults seven times via point fixes
over two years, but the problem persists. This indicates the fixes are
symptomatic, not root-cause-based. If there was an architectural fix (like
S1/S2/S4 in report 4), issue #3702 would have been closed long ago.
3.2 Commits in Orca that are cherry-picked from Bambu internal
Interesting finding from Orca’s git log:
commit 7a197a3d8d
Author: tao ■■■■ <tao.■■■■@bambulab.com>
Date: Thu Sep 26 20:57:42 2024 +0800
ENH:Reduce the number of page faults in AMS
Change-Id: I4bfb048ec62c35b515eecbb70c175fa0975d7f92
(cherry picked from commit 791be195475bd834c937fb63341713529e4f41b8)
Interpretation: This is from tao.■■■■@bambulab.com — a Bambu employee!
The commit is cherry-picked from Bambu INTERNAL code. The Orca maintainer has
pulled from Bambu’s public master history.
So Bambu makes certain fixes internally and pushes to public master
sporadically. But in many cases where an issue reports a specific problem
(#1950, #3702, #3806), there is no commit that addresses the root cause
publicly.
Point: What Bambu Lab Actually Does
Bambu Lab are active developers. They have dev teams, they commit to public
master, they make page-fault fixes. But:
- No refactoring of Monitor.cpp despite #1950 for 3 years
- No refactoring of Plater.cpp despite its 23,675 lines
- No wxWidgets upgrade despite the fork being 1 year old
- No Wayland native paths despite Linux users’ complaints for 3 years
- No central timer scheduler despite 37+ wxTimer instances
- No debouncing of config save despite it being a 3-line fix
- Removal of 100 ms continuous timer — Orca did it, Bambu still has it
- Removal of telemetry in idle handler — Orca did it, Bambu still has it
Of these 8 points, 2 (#7, #8) are trivially easy fixes that take under
an hour to implement. They make a difference. Bambu has not done them.
Cadence of anger: what this says about priorities
Bambu’s communication with users is silent:
- #1950 (2023-04): “Inactive 90d” — no comment from Bambu team
- #3702 (2023-09): no root cause analysis published
- #3806 (2023): no specific action
- #8891 (2025-11): one comment from a Bambu collaborator referring to
“create a DMP and send via ticket” — no technical diagnosis
Bambu’s actual activity: The team spends time on new features (H2D
support, AMS improvements, new printers) while performance issues get
symptomatic fixes instead of structural investment.
The market’s reaction: Orca has tripled Bambu’s GitHub popularity
(13,371 vs 4,294 stars) and has a third of open issues. This is not a
popularity in the Bambu Lab Studio community — users are fleeing to Orca.
Absolute demands on Bambu Lab — bullet list for immediate action
If Bambu Lab wants to keep its users, the following must happen in the
next release (2-4 weeks):
- Comment on #1950, #3702, #3806, #8891 with a timeline for action
- Debounce config save (3 lines of code, address:
GUI_App.cpp:3318) - Remove the 100 ms continuous timer (1 line of code:
GLCanvas3D.cpp:10290) - Remove
track_eventcalls from idle handler (2 lines of code:GUI_App.cpp:3299, 3307) - Upgrade wxWidgets to 3.3.2 (follow Orca’s PR #12941)
- Port back Orca PR #5386 (tab hide-instead-of-destroy)
Total implementation time for items 2-6: less than 2 weeks for a single
team member. If Bambu Lab can’t manage this after 3 years of complaints,
users can draw their own conclusions about the commitment.
Verification (for reviewers)
Every claim in this report can be checked:
- Clone both repos:
git clone https://github.com/bambulab/BambuStudio.git git clone https://github.com/OrcaSlicer/OrcaSlicer.git - Verify the lines:
grep -n "REFRESH_INTERVAL\|Start(100\|wxMilliSleep\|track_event" \ BambuStudio/src/slic3r/GUI/{Monitor,GLCanvas3D,Plater,GUI_App}.cpp grep -n "REFRESH_INTERVAL\|Start(100\|wxMilliSleep\|track_event" \ OrcaSlicer/src/slic3r/GUI/{Monitor,GLCanvas3D,Plater,GUI_App}.cpp - Verify wxWidgets version:
grep "GIT_TAG" BambuStudio/deps/wxWidgets/wxWidgets.cmake grep "GIT_TAG" OrcaSlicer/deps/wxWidgets/wxWidgets.cmake - Verify Orca PR #5386:
gh pr view 5386 --repo OrcaSlicer/OrcaSlicer - Verify Bambu issue #1950:
gh issue view 1950 --repo bambulab/BambuStudio
Closing word
The user who reported #1950 wrote in April 2023:
“I do see a 1000 ms timer refresh event in Monitor.cpp, perhaps there is
an issue in the way the timer event and wxWidgets are being used that may
have negative externalities on other apps?”
The reporter identified exact file and exact problem. It took 10 seconds
to identify. Bambu Lab has had 3 years to fix it.
Three years.
Reports 1-4 describe what is technically wrong and how it can be fixed. This
report documents what is organizationally wrong. Bambu Lab has an active
development team with competence — but UI performance is not their
priority. Their users’ tormented reports show that it should be.
References
All issues and PRs verified via gh issue view / gh pr view 2026-04-20.
- Device monitoring window causes rendering to stutter in other 2D/3D applications when moving the mouse · Issue #1950 · bambulab/BambuStudio · GitHub
- Bambu Studio kills computer performance because of an abnormal number of Page Faults. Even when the software is idle. · Issue #3702 · bambulab/BambuStudio · GitHub
- Very High CPU use while idle - Mac OS · Issue #3806 · bambulab/BambuStudio · GitHub
- Bambu studio becomes unresponsive after being open for several hour · Issue #8891 · bambulab/BambuStudio · GitHub
- Systemic UI slowness: entire application sluggish even with no project open — rooted in ~37 wxTimer instances and busy wxEVT_IDLE loops (static code evidence included; consolidates #3702, #9413, #9967, #1950) · Issue #10289 · bambulab/BambuStudio · GitHub
- Suggestion for future developments of Bambu Lab Studio to match the exelent hardware. · Issue #10290 · bambulab/BambuStudio · GitHub
- Added a deactivate() function to Tab so when switching tabs it hides … by akoolenbourke · Pull Request #5386 · OrcaSlicer/OrcaSlicer · GitHub
- Upgrade clipper & improve multi-thread performance by Noisyfox · Pull Request #7177 · OrcaSlicer/OrcaSlicer · GitHub
- https://github.com/OrcaSlicer/OrcaSlicer/pull/10735
- Optimize linux experience by SoftFever · Pull Request #12705 · OrcaSlicer/OrcaSlicer · GitHub
- QoL: Fix hotkeys blocked in Prepare view when notification is shown by SoftFever · Pull Request #12715 · OrcaSlicer/OrcaSlicer · GitHub
- https://github.com/OrcaSlicer/OrcaSlicer/pull/12941
- WIP: Add native Wayland support for Linux by SoftFever · Pull Request #13197 · OrcaSlicer/OrcaSlicer · GitHub
- Fix macos crash on close by Noisyfox · Pull Request #13215 · OrcaSlicer/OrcaSlicer · GitHub
Commits in Bambu master (verified via git log --grep):
66403ba19(2024-08-12),791be1954(2024-09-26),542aa02ac(2024-10-09)ed1e9678c(2025-02-08),b1fa2421c(2025-02-10)cefe97377,4dae5ff6d(2025-09-19)
Audience: Bambu Lab Studio development team
Date: 2026-04-20
Status of the problem space: Systemic, multi-year, inadequately addressed
Analyzed commit: bf68eece1 (master, HEAD)
TL;DR
The UI performance problems in Bambu Studio are not unsolvable. Orca Slicer —
a fork of your own codebase — delivers a noticeably more responsive UI through
a handful of concrete structural choices you can adopt. But it requires you to
prioritize it. You have had root-cause diagnoses like #1950 (Monitor.cpp
1000ms timer) open since 2023; #3702 (page-fault storm) since 2023; #3806 since
2023. This is not a technical difficulty — it is a prioritization problem.
This plan is divided into three time horizons:
- Immediate (within 1 week, minimal risk)
- Short-term (within 1 month, moderate risk)
- Long-term (3-12 months, structural investment)
Each action is tied to concrete file:line references and relevant open issues.
Immediate Actions (within 1 week)
I1. Debounce app_config->save() in the idle handler
File: src/slic3r/GUI/GUI_App.cpp:3318
Issue: Contributes to #3702 (page faults), #9967 (CPU spikes every minute)
Risk: Very low
Problem: save() runs synchronously on the UI thread every time the idle
handler fires and dirty() is true. In the worst case this can result in
dozens of disk flushes per second.
Action: Add time-based debouncing (5-second interval).
// Suggested (pseudo)
static wxLongLong last_save_time = 0;
wxLongLong now = wxGetLocalTimeMillis();
if (app_config->dirty() && (now - last_save_time).GetValue() > 5000) {
app_config->save();
last_save_time = now;
}
I2. Remove track_event from idle handler
File: src/slic3r/GUI/GUI_App.cpp:3299, 3307
Issue: Potential UI-thread blocking via NetworkAgent
Risk: Low — only telemetry data is affected
Action: Follow Orca’s lead — remove these lines:
m_agent->track_event("mqtt_active", j.dump()); // LINE 3299
m_agent->track_event("mqtt_inactive", j.dump()); // LINE 3307
Or move them to an async background thread if they must remain:
std::thread([agent = m_agent, event_name, json_data]() {
agent->track_event(event_name, json_data);
}).detach();
I3. Stop the 100 ms continuous timer in GLCanvas3D
File: src/slic3r/GUI/GLCanvas3D.cpp:10290
Issue: #10289 (~37 wxTimer instances problem)
Risk: Low — Orca has already removed this
Problem: m_timer.Start(100, wxTIMER_CONTINUOUS) starts a timer that
fires 10 times per second continuously. Together with other timers this
contributes to persistent UI-thread activity.
Action: Convert to StartOnce only when layer editing is actually active:
// Original:
m_timer.Start(100, wxTIMER_CONTINUOUS);
// Suggested:
if (is_layer_editing_active()) {
m_timer.StartOnce(100);
}
I4. Review startup time for the Network Plugin
Issue: #8160, #8605, #8390 (slow startup)
File: relevant points in src/slic3r/Utils/NetworkAgent.cpp
Risk: Medium
Problem: libbambu_networking.so loading causes split-lock errors on
modern CPUs and takes several seconds to initialize.
Action: Lazy-load the network plugin only when the first network call is
needed, not at app start. Display the UI while plugin loading proceeds in the
background.
I5. Ensure all timers stop in Show(false)
File: every file that starts timers (see bevis/bambu-timer-inventory.md)
Issue: #10289
Risk: Low, but requires granular review
Problem: Some panels start timers but don’t bind Stop() to
Show(false)/hidden state. Examples: MultiMachinePage, SendMultiMachinePage,
ThermalPreconditioningDialog.
Action: Do a full audit — every timer->Start(N) should have a matching
timer->Stop() in panel-hiding / panel-destruction paths.
I6. Address #1950 publicly
Action: It has been 3 years since an external user pointed out the
1000 ms Monitor.cpp timer as the cause of UI problems affecting other apps.
Comment on the issue with either a planned fix or an explanation for why
it’s difficult to change. Three years of silence erodes trust.
Short-term (within 1 month)
S1. Centralize timers into a common scheduler
Issue: #10289 (timer proliferation)
Risk: Medium — touches many panels
Problem: 27 unique new wxTimer() + 230 wxTimer references across 92
files. Each timer has its own wxEVT_TIMER event going through the event
loop. This scales poorly when many panels are open simultaneously.
Action: Implement a central UiScheduler that manages all periodic tasks:
class UiScheduler {
public:
using JobId = size_t;
JobId schedule(std::chrono::milliseconds interval,
std::function<void()> callback,
bool only_when_visible = true);
void cancel(JobId);
private:
// Single wxTimer driving all callbacks
wxTimer m_driver_timer;
std::vector<Job> m_jobs;
};
Panels register instead of owning their own timers. Hidden panel = no
callbacks. This eliminates the #10289 problem in one sweep.
S2. Move device polling to a background thread
File: src/slic3r/GUI/Monitor.cpp
Issue: #1950, #10289
Risk: Medium — requires thread-safe DeviceManager
Problem: Monitor::on_timer → update_all() does synchronous queries on
the UI thread every second. The result is that other apps stutter when
Bambu Studio is open.
Action:
- Move
update_all()to a background thread that polls once per second - When data updates,
wxQueueEvent(panel, new DeviceDataEvent(...))for UI
update - The UI thread does no synchronous I/O; it just renders the latest snapshot
S3. Audit 17 synchronous .perform() HTTP calls
Files: GUI_App.cpp, BindDialog.cpp, StatusPanel.cpp,
WebViewDialog.cpp, HelioDragon.cpp
Issue: #10289, potentially #8891, #9453
Risk: Medium — affects error paths
Problem: These calls block the calling thread for the full HTTP
operation. If they run on the UI thread directly or indirectly → UI freeze.
Action: Go through every call site and verify:
- Does it run on the UI thread?
- If yes, move to a background thread with
std::asyncor boost.asio - Use
wxQueueEventfor UI update when the operation completes
S4. Upgrade wxWidgets to 3.3.x
File: deps/wxWidgets/wxWidgets.cmake:27-28
Risk: High — many small behavior differences between versions
Time investment: 1-2 weeks
Problem: Bambu’s wxWidgets fork was last updated 2025-03-31 — over a year
ago. Orca migrated to v3.3.2 via PR #12941.
Action: Follow Orca’s example:
- Merge upstream
v3.3.2into thebambulab/wxWidgetsfork - Test on all platforms (Windows, macOS, Linux) with CI
- Cherry-pick Bambu’s own improvements on top of the 3.3.2 base
S5. Lazy-load the Network Plugin
Issue: #8160, #8605, #8390
Risk: Medium
Action: Load the plugin only when the user needs it (Device tab,
Login dialog) — not at app start. Show the UI immediately.
S6. Debounce file I/O and unnecessary Refresh()
Files: several (see grep for Refresh())
Issue: #3702 (page faults)
Risk: Low
Problem: Bambu’s commit history shows several fixes like “remove
unnecessary refresh to reduce page faults” (b1fa2421c, ed1e9678c, etc.).
These fixes are point fixes. Do a systematic audit with git grep Refresh()
and identify every call that can be replaced with RefreshRect() or
eliminated entirely.
Long-term (3-12 months)
L1. Split Plater.cpp into logical modules
File: src/slic3r/GUI/Plater.cpp (23,675 lines, 163 includes)
Issue: Implicit — contributes to #3702
Risk: High — affects a large surface of the code
Time investment: 3-6 months
Problem: The “god object” file has such large instruction cache pressure
that hot paths generate thousands of page faults per second. Splitting it is
not just a cleanliness argument — it is a performance concern.
Action: Split by responsibility:
PlaterModel.cpp— state managementPlaterUIView.cpp— widget hierarchyPlaterRender.cpp— 3D renderingPlaterJobs.cpp— async jobs (slicing, upload)PlaterDialogs.cpp— inline dialogs
L2. Split GLCanvas3D.cpp
File: src/slic3r/GUI/GLCanvas3D.cpp (13,560 lines, 69 includes)
Risk: High
Action: Same principle — render, input handling, gizmos, picking, and
ImGui integration should be separate.
L3. Introduce clang-tidy + cppcheck in CI
Issue: Issue #10290 identified several classes of problems static
analysis could catch
Risk: Low (only produces reports)
Rules to enable:
bugprone-empty-catchperformance-*misc-unused-parameterscppcoreguidelines-*(selective)
Even though some of issue #10290’s early findings were retracted via errata,
clang-tidy is still valuable for future regression protection.
L4. Introduce performance regression tests in CI
Action: Build a test that:
- Starts the app
- Loads a standard 3mf
- Switches between tabs X times
- Measures idle CPU and page faults with perf/WPA
Failure if regression is detected. This blocks new #3702-like problems.
L5. Move the slicing process to a dedicated worker process
Issue: #9469 (freezes whole system when slicing mildly complex models)
Risk: Very high
Time investment: 6-12 months
Action: Instead of slicing on a worker thread inside the app process,
spawn a separate OS process that runs slic3r core and communicates via
pipes/IPC. Benefits:
- A slicing crash doesn’t take down the whole app
- The OS scheduler can prioritize the slicing process separately
- The UI process remains fully responsive
L6. Introduce structured telemetry (opt-in) for performance
Action: Collect anonymous frame-time data, idle CPU time, page fault rate.
Users opt in. This gives you your own data instead of having to extract it
from issue reports.
Specific PRs/commits from Orca worth porting back
The following Orca commits/PRs solve problems relevant to Bambu and are
relatively low-risk to port back:
| Orca source | What it does | Bambu file to change |
|---|---|---|
| PR #5386 (2024-05) | Tab::deactivate() — hide tab instead of destroy |
Tab.cpp, Tab.hpp |
| PR #12941 (2026-03) | wxWidgets 3.3.2 upgrade | deps/wxWidgets/wxWidgets.cmake |
| PR #12705 (2026-03) | Linux resize/window fixes | MainFrame.cpp |
| PR #12715 (2026-03) | Fix hotkeys blocked in Prepare view | relevant input handler |
| PR #11887 (2026-01) | Memory opt for small loops | slicing core |
| Commits removing 100ms timer in GLCanvas3D | Fewer UI thread wakeups | GLCanvas3D.cpp:10290 |
| Commits removing track_event in idle handler | No synchronous telemetry in idle | GUI_App.cpp:3299-3307 |
Measurable goals (KPIs)
If you implement the proposed changes:
| KPI | Baseline (now) | Target after 3 months |
|---|---|---|
| Idle CPU (desktop, no activity) | ≥5% (per #3806) | <1.5% |
| Page faults per second in idle | 1000+ (per #3702) | <50 |
| Tab-switch time | 1-3 s (per #997 for Orca, worse in Bambu) | <100 ms |
| Startup time to usable UI | 10-30 s (per #8390) | <3 s |
| Open issues with “freeze/lag/slow” in title | 100+ | <30 |
Prioritization recommendation
If you can only do one thing in the next sprint — do I1 + I2 + I3
(debouncing + remove track_event + stop 100 ms timer). Together they take
less than a day to implement and address multiple high-profile issues.
If you have two weeks — add S1 (central scheduler). It solves timer
proliferation permanently.
If you have a month — add S4 (wxWidgets upgrade). It’s the single
biggest lever.
If you have half a year — add L1 + L4 (Plater.cpp split + CI regression
tests). That’s the structural reinforcement that keeps the problems from
coming back.
Communication with users
Your users are frustrated. Several high-profile issues (#1950, #3702, #3806,
#8891) have been open for a year or more without response. Use one of them
to show that you’re listening:
- Comment on #1950, #3702 with “we have a plan, here are the milestones”
- Open a meta-issue titled “UI performance improvements 2026: tracking”
- Update that meta-issue weekly with actual fixes that land
Silent development after 3 years of complaints rarely turns users around;
visible iteration does.
Closing remark
Your users are not wrong. The problems are real, documented, and have
concrete root causes that can be addressed. Your own fork Orca Slicer has
proven it. There is no technical reason Bambu Studio needs to keep freezing
year after year.
Take ownership of the codebase.
References
Issues
- Device monitoring window causes rendering to stutter in other 2D/3D applications when moving the mouse · Issue #1950 · bambulab/BambuStudio · GitHub
- Bambu Studio kills computer performance because of an abnormal number of Page Faults. Even when the software is idle. · Issue #3702 · bambulab/BambuStudio · GitHub
- Very High CPU use while idle - Mac OS · Issue #3806 · bambulab/BambuStudio · GitHub
- Bambu studio becomes unresponsive after being open for several hour · Issue #8891 · bambulab/BambuStudio · GitHub
- Idle Bambu Studio CPU usage jumps to ~100% every minute for 15-20 seconds · Issue #9967 · bambulab/BambuStudio · GitHub
- Systemic UI slowness: entire application sluggish even with no project open — rooted in ~37 wxTimer instances and busy wxEVT_IDLE loops (static code evidence included; consolidates #3702, #9413, #9967, #1950) · Issue #10289 · bambulab/BambuStudio · GitHub
- Suggestion for future developments of Bambu Lab Studio to match the exelent hardware. · Issue #10290 · bambulab/BambuStudio · GitHub
Pull requests (Orca)
- Added a deactivate() function to Tab so when switching tabs it hides … by akoolenbourke · Pull Request #5386 · OrcaSlicer/OrcaSlicer · GitHub
- Upgrade clipper & improve multi-thread performance by Noisyfox · Pull Request #7177 · OrcaSlicer/OrcaSlicer · GitHub
- https://github.com/OrcaSlicer/OrcaSlicer/pull/10735
- Small Loop Memory Optimizations by neo-jayfeather · Pull Request #11887 · OrcaSlicer/OrcaSlicer · GitHub
- UI Fixes / Improvements by yw4z · Pull Request #12069 · OrcaSlicer/OrcaSlicer · GitHub
- Optimize linux experience by SoftFever · Pull Request #12705 · OrcaSlicer/OrcaSlicer · GitHub
- QoL: Fix hotkeys blocked in Prepare view when notification is shown by SoftFever · Pull Request #12715 · OrcaSlicer/OrcaSlicer · GitHub
- https://github.com/OrcaSlicer/OrcaSlicer/pull/12941
Code references (Bambu HEAD bf68eece1)
src/slic3r/GUI/Monitor.cpp:37,162,281,461src/slic3r/GUI/GLCanvas3D.cpp:10290,3935-3984src/slic3r/GUI/Plater.cpp:17073src/slic3r/GUI/GUI_App.cpp:3291-3320deps/wxWidgets/wxWidgets.cmake:27-28
