如何让安卓应用在必须主线程执行重任务时跳过更多帧
安卓主线程阻塞实现更多跳帧的方案
Choreographer跳帧日志I/Choreographer: Skipped 55 frames.的触发逻辑为:当主线程连续阻塞时长超过单帧绘制阈值(60fps设备为16.6ms,120fps高刷设备为8.3ms)时,系统会统计错过的Vsync信号数量作为跳帧数输出。在你必须将所有任务放在主线程执行、不允许使用多线程的前提下,要实现更多跳帧,本质就是延长主线程的单次连续阻塞时长,具体可按以下方式操作:
- 合并所有主线程重负载任务为单段执行:如果你当前将任务拆分为多个小块、通过
Handler.post分段提交到主线程消息队列,主动给绘制任务让出了执行间隙,直接移除拆分逻辑,将所有计算、IO操作合并为单块串行执行,任务耗时越久,主线程阻塞时间越长,跳帧数越高。 - 直接在主线程当前调用栈同步执行任务:不要通过
IdleHandler、Choreographer.postFrameCallback这类时机回调执行任务,这类回调会自动避开绘制窗口,减少阻塞时长。直接将重负载任务放在主线程当前执行逻辑中同步调用,全程独占主线程资源。 - 屏蔽任务执行期间的主线程插队操作:执行重负载任务过程中,避免触发
View.invalidate()、属性动画、用户输入响应这类高优先级主线程任务,这类操作会打断你的长耗时任务,让Choreographer有机会完成绘制、降低跳帧数量。
内容的提问来源于stack exchange,提问作者Dmitriy Sitnikov
相关产品推荐
相关产品推荐

