当前位置: 首页 > wzjs >正文

佛山行业网站建设优秀网站网页设计

佛山行业网站建设,优秀网站网页设计,孝感建设局网站,像美团这种网站怎么做Choreographer 深度解析 一、Choreographer 核心概念 Choreographer 是 Android 系统中协调动画、输入和绘制时序的关键组件,它通过 VSYNC 信号来同步 UI 操作。 1. 核心职责 帧同步:协调应用与显示刷新率(通常60Hz)回调调度&…

Choreographer 深度解析

一、Choreographer 核心概念

Choreographer 是 Android 系统中协调动画、输入和绘制时序的关键组件,它通过 VSYNC 信号来同步 UI 操作。

1. 核心职责

  • 帧同步:协调应用与显示刷新率(通常60Hz)
  • 回调调度:管理以下回调类型的执行时序:
    • CALLBACK_INPUT(输入事件)
    • CALLBACK_ANIMATION(动画)
    • CALLBACK_INSETS_ANIMATION(插入动画)
    • CALLBACK_TRAVERSAL(视图遍历/绘制)
    • CALLBACK_COMMIT(帧提交)

2. VSYNC 机制

// 简化的VSYNC请求流程
Choreographer.getInstance().postFrameCallback(new FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {// 在下一个VSYNC信号时执行}
});

二、关键源码解析(基于Android 13)

1. 初始化流程

// 单例获取
public static Choreographer getInstance() {return getInstance(Looper.myLooper());
}private static final ThreadLocal<Choreographer> sThreadInstance =new ThreadLocal<Choreographer>() {@Overrideprotected Choreographer initialValue() {Looper looper = Looper.myLooper();return new Choreographer(looper, VSYNC_SOURCE_APP);}};

2. 回调队列管理

// 回调类型定义
private static final int CALLBACK_INPUT = 0;
private static final int CALLBACK_ANIMATION = 1;
// ...其他类型// 使用CallbackQueue数组管理不同优先级队列
private final CallbackQueue[] mCallbackQueues;

3. 帧回调处理

void doFrame(long frameTimeNanos, int frame) {// 1. 计算掉帧情况final long jitterNanos = frameTimeNanos - mLastFrameTimeNanos;if (jitterNanos >= mFrameIntervalNanos) {final long skippedFrames = jitterNanos / mFrameIntervalNanos;if (skippedFrames >= SKIPPED_FRAME_WARNING_LIMIT) {Log.i(TAG, "Skipped " + skippedFrames + " frames! ");}}// 2. 按顺序执行各阶段回调doCallbacks(CALLBACK_INPUT, frameTimeNanos);doCallbacks(CALLBACK_ANIMATION, frameTimeNanos);doCallbacks(CALLBACK_INSETS_ANIMATION, frameTimeNanos);doCallbacks(CALLBACK_TRAVERSAL, frameTimeNanos);doCallbacks(CALLBACK_COMMIT, frameTimeNanos);
}

三、高级应用技巧

1. 精确帧率监控

class FrameMonitor : Choreographer.FrameCallback {private var lastFrameTime = 0Lprivate val choreographer = Choreographer.getInstance()override fun doFrame(frameTimeNanos: Long) {val currentTime = System.currentTimeMillis()if (lastFrameTime > 0) {val frameTime = currentTime - lastFrameTimeif (frameTime > 16) { // 60Hz下每帧应≈16.67msLog.w("FrameDrop", "Frame delayed: ${frameTime}ms")}}lastFrameTime = currentTimechoreographer.postFrameCallback(this)}
}

2. 自定义动画调度

// 创建高优先级动画调度器
public void scheduleAnimation(Animator animator) {Choreographer.getInstance().postCallback(Choreographer.CALLBACK_ANIMATION,() -> animator.doAnimationFrame(Choreographer.getInstance().getFrameTime()),null);
}

3. 性能优化实践

优化点1:减少Traversal回调负担

// 避免在绘制阶段做耗时操作
view.doOnPreDraw {// 轻量级操作post {// 耗时操作延后执行heavyOperation()}
}

优化点2:批量更新动画

// 合并多个属性动画到单个回调
ValueAnimator.setFrameDelay(0); // 使用系统默认帧率
Choreographer.getInstance().postFrameCallback(frameTime -> {animatorSet1.doTrame(frameTime);animatorSet2.doTrame(frameTime);
});

四、Choreographer 工作流程图

应用程序Choreographer显示系统postCallback()请求VSYNC信号VSYNC事件执行doFrame()处理输入执行动画视图遍历loop[回调处理]应用程序Choreographer显示系统

五、常见问题解决方案

1. 主线程卡顿检测

fun setupFrameMonitor() {val handler = Handler(Looper.getMainLooper())val monitor = object : Runnable {override fun run() {val start = SystemClock.uptimeMillis()Choreographer.getInstance().postFrameCallback {val cost = SystemClock.uptimeMillis() - startif (cost > 50) { // 阈值可根据需求调整reportJank(cost)}}handler.postDelayed(this, 1000) // 每秒检测一次}}handler.post(monitor)
}

2. 动画掉帧优化

// 使用SurfaceView替代普通View进行复杂动画
surfaceHolder.lockCanvas().apply {// 在此直接绘制surfaceHolder.unlockCanvasAndPost(this)
}// 通过Choreographer控制帧率
fun startCustomAnimation() {val choreographer = Choreographer.getInstance()val callback = object : Choreographer.FrameCallback {override fun doFrame(frameTimeNanos: Long) {updateAnimation(frameTimeNanos)choreographer.postFrameCallback(this) // 维持动画循环}}choreographer.postFrameCallback(callback)
}

六、平台差异说明

特性Android 4.1 (Jelly Bean)Android 5.0 (Lollipop)Android 12+
VSYNC 同步引入Project Butter支持三重缓冲动态刷新率支持
回调类型基础3种类型增加INSETS类型新增COMMIT阶段
帧延迟检测简单日志警告完善的Jank统计集成到Perfetto

掌握Choreographer的工作原理,可以帮助开发者:

  1. 构建更流畅的UI体验
  2. 精准定位性能瓶颈
  3. 实现自定义动画引擎
  4. 优化应用功耗表现
http://www.dtcms.com/wzjs/300869.html

相关文章:

  • 素材网站 源码软考培训机构哪家好一点
  • 表白网站建设北京seo优化哪家公司好
  • 微信网站制作免费广州市疫情最新
  • 政务性网站制作公司宁波seo网络推广渠道介绍
  • 网站如何做导航条下拉菜单网站关键词优化有用吗
  • 阿里巴巴吧网站怎么做河北搜索引擎优化
  • 网站建设行业分析2023b站免费推广入口
  • 东莞代理记账seo宣传
  • 佛山建设外贸网站佛山关键词排名效果
  • 做网站文章要一篇一篇的写吗seo搜索引擎优化软件
  • 哪里的佛山网站建设谷歌 google
  • 邯郸网站建设纵横seo网站推广技术
  • 做书一般在哪个网站下载素材上海关键词优化方法
  • 广西建网站公司3a汽车集团公司网络营销方案
  • 什么网站空间稳定指数运算公式大全
  • 深圳横岗疫情自然搜索优化
  • 做企业网站用drupal7bt磁力搜索神器
  • 东莞十大公司排名百度seo排名主要看啥
  • 衡水移动网站建设价格优化营商环境条例心得体会
  • 乌鲁木齐网站外包百度seo怎么关闭
  • 湖寮做网站淘宝店铺推广方式有哪些
  • 网站建设i如何用google搜索产品关键词
  • 网站由什么组成百度统计平台
  • 有后台的网站模版seo推广策划
  • 免费软件站kj6699的seo综合查询
  • 柬埔寨做赌博网站免费网络推广网址
  • 创建公司网站需要准备哪些素材百度搜索官方网站
  • busy bee wordpress优化设计六年级下册数学答案
  • 别人用我公司营业执照备案做网站成都网站建设系统
  • 动易做网站石家庄热搜