Attempt to fix the browser "hiccups" commonly found in UXP (seems to be successful?)

This commit is contained in:
ownedbywuigi 2026-03-28 11:20:14 +00:00
commit 2cd5702611
2 changed files with 20 additions and 9 deletions

View file

@ -2138,14 +2138,25 @@ nsRefreshDriver::IsWaitingForPaint(mozilla::TimeStamp aTime)
if (mWaitingForTransaction) { if (mWaitingForTransaction) {
if (mSkippedPaints && aTime > (mMostRecentTick + TimeDuration::FromMilliseconds(mWarningThreshold * 1000))) { if (mSkippedPaints && aTime > (mMostRecentTick + TimeDuration::FromMilliseconds(mWarningThreshold * 1000))) {
// XXX - Bug 1303369 - too many false positives. // Optimization: Don't block as aggressively while waiting for compositor.
//gfxCriticalNote << "Refresh driver waiting for the compositor for " // Track elapsed time and start allowing frames through sooner to prevent 200ms+ freezes.
// << (aTime - mMostRecentTick).ToSeconds() // Original code would double threshold, but we cap faster blocking at lower time.
// << " seconds."; if (mWarningThreshold < 1) {
mWarningThreshold *= 2; mWarningThreshold = 1;
} else {
mWarningThreshold *= 2;
}
} }
mSkippedPaints = true; mSkippedPaints = true;
// Optimization: Allow frames through periodically instead of blocking all frames.
// Uses a timeout-based approach where if we've been waiting too long, allow partial frames.
// This prevents visible 200ms+ freezes during compositor transaction stalls.
if (aTime > (mMostRecentTick + TimeDuration::FromMilliseconds(50))) {
// If more than 50ms has passed, allow some frames through
// This keeps the UI responsive during compositor delays
return false;
}
return true; return true;
} }

View file

@ -1298,7 +1298,7 @@ pref("javascript.options.mem.high_water_mark", 128);
pref("javascript.options.mem.max", -1); pref("javascript.options.mem.max", -1);
pref("javascript.options.mem.gc_per_zone", true); pref("javascript.options.mem.gc_per_zone", true);
pref("javascript.options.mem.gc_incremental", true); pref("javascript.options.mem.gc_incremental", true);
pref("javascript.options.mem.gc_incremental_slice_ms", 25); pref("javascript.options.mem.gc_incremental_slice_ms", 10);
pref("javascript.options.mem.gc_generational", true); pref("javascript.options.mem.gc_generational", true);
pref("javascript.options.mem.gc_compacting", true); pref("javascript.options.mem.gc_compacting", true);
pref("javascript.options.mem.log", false); pref("javascript.options.mem.log", false);
@ -1320,7 +1320,7 @@ pref("javascript.options.mem.gc_low_frequency_heap_growth", 150);
pref("javascript.options.mem.gc_dynamic_heap_growth", true); pref("javascript.options.mem.gc_dynamic_heap_growth", true);
pref("javascript.options.mem.gc_dynamic_mark_slice", true); pref("javascript.options.mem.gc_dynamic_mark_slice", true);
pref("javascript.options.mem.gc_refresh_frame_slices_enabled", true); pref("javascript.options.mem.gc_refresh_frame_slices_enabled", true);
pref("javascript.options.mem.gc_allocation_threshold_mb", 40); pref("javascript.options.mem.gc_allocation_threshold_mb", 20);
pref("javascript.options.mem.gc_min_empty_chunk_count", 1); pref("javascript.options.mem.gc_min_empty_chunk_count", 1);
pref("javascript.options.mem.gc_max_empty_chunk_count", 30); pref("javascript.options.mem.gc_max_empty_chunk_count", 30);
@ -2808,7 +2808,7 @@ pref("editor.positioning.offset", 0);
pref("dom.use_watchdog", true); pref("dom.use_watchdog", true);
pref("dom.max_chrome_script_run_time", 30); pref("dom.max_chrome_script_run_time", 30);
pref("dom.max_script_run_time", 15); pref("dom.max_script_run_time", 10);
// Automatically terminate non-responsive scripts if script_run_time expires. // Automatically terminate non-responsive scripts if script_run_time expires.
pref("dom.always_stop_slow_scripts", false); pref("dom.always_stop_slow_scripts", false);
@ -2831,7 +2831,7 @@ pref("idle_queue.long_period", 50);
// period, which makes the point in time that we expect to become busy // period, which makes the point in time that we expect to become busy
// again be: // again be:
// now + idle_queue.min_period + layout.idle_period.time_limit // now + idle_queue.min_period + layout.idle_period.time_limit
pref("idle_queue.min_period", 3); pref("idle_queue.min_period", 1);
// Hang monitor timeout after which we kill the browser, in seconds // Hang monitor timeout after which we kill the browser, in seconds
// (0 is disabled) // (0 is disabled)