夸克等安卓 WebView 主动限制 requestAnimationFrame 帧率至 20–30fps,实为智能省电与后台节流策略所致;关闭「智能省电模式」、禁用 Background tabs throttling、启用 Canvas OOP rasterization 并重启可提升至 48fps。

为什么 requestAnimationFrame 实际只有 20–30fps?
不是浏览器坏了,也不是手机太旧,而是夸克、UC、部分安卓 WebView 主动把 requestAnimationFrame 钉死在低帧率——背后是省电策略和后台节流在起作用。你写的循环逻辑没问题,但系统根本不给你调度机会。
- 进夸克 > 设置 > 浏览器设置 > 高级设置,关闭「智能省电模式」
- 地址栏输入
quark://flags,搜throttle,把Background tabs throttling设为Disabled - 同样在
quark://flags中搜canvas,启用Canvas OOP rasterization - 改完必须重启夸克才生效;实测《HexGL》类游戏帧率可从
22fps拉到48fps
canvas.getContext('2d') 越画越卡?
夸克对 canvas.getContext('2d') 做了深度干预:限制绘制节奏、抑制高频调用、甚至插帧丢帧。这不是 bug,是它刻意为之的“保续航”行为。
- 优先迁移到
WebGL渲染(哪怕只是画几个 sprite),夸克对 WebGL 的钳制明显更松 - 避免在
requestAnimationFrame回调里做 DOM 查询或大量计算,拆到Web Worker中执行 - 初始化时传入配置:
canvas.getContext('2d', { willReadFrequently: false }),关掉不必要的像素读取支持 -
ctx.imageSmoothingEnabled = false,禁用缩放抗锯齿;drawImage 尽量用整数倍缩放
video 标签播 RTSP 或 HLS 卡住不动?
HTML5 原生不支持 rtsp://,所谓“播放”全是靠服务端转流。卡顿大概率出在转流链路或前端加载姿势上,不是你代码写错了。
- 没引入
hls.js就直接给,Chrome 会静默失败,控制台报DOMException: The element has no supported sources - HLS 切片设成
-hls_time 10(默认值)会导致首屏慢、拖动卡;局域网建议压到2秒,但别低于1.5 - 前端必须加
preload="none"和autoplay muted,否则 Chrome 70+ 会挂起play(),画面冻结 - 用
curl -I -H "Range: bytes=0-999" https://yoursite.com/video.mp4验证服务端是否返回206 Partial Content,否则 MSE 和拖拽全失效
页面切换后越来越卡?内存泄漏藏在哪?
不是动画太花哨,而是旧页面的 canvas、定时器、事件监听器没清理干净,堆里堆了一堆 Detached DOM 节点,每次切换都触发重排重绘。
立即学习“前端免费学习笔记(深入)”;
- 打开
quark://inspect(需先连点「关于夸克」7 次激活开发者模式),进 Memory → Take heap snapshot,切两次页再拍一张,筛选Detached DOM tree - 检查是否在
mounted或useEffect里加了window.addEventListener('scroll', handler)却没配removeEventListener - Vue Router 切换前手动调用
document.querySelector('.page-current').remove(),别全指望框架自动卸载 - 避免在路由守卫里同步执行
querySelectorAll或操作大量 DOM,用performance.mark()包一下看看耗时是否集中在初始化阶段
quark://inspect 里的 FPS Meter 和 Layers 面板才是真相。











