Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)

这篇具有很好参考价值的文章主要介绍了Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

前一篇文章Android 进阶——图形显示系统之底层图像显示原理小结(一)介绍了关于Android 图形显示系统的基础理论,相信你对于Android的图形显示系统中图形界面渲染刷新机制有了更深的了解,接下来进一步讲解VSync和Choreography的联系和作用。

一、VSync 信号的产生概述

VSync 可以提升Android 图形显示效果,VSync信号一般是由底层硬件直接产生并由显示驱动程序向应用层上报,但是为了兼容在不支持硬件VSync 机制设备上也能高效地展示Android,也提供了软件模拟方案产生VSync信号——通过HWComposer(模拟硬件显示设备的类)在间隔固定时间(纳秒级别)发送消息给EventHandler处理。

1、HWComposer

在HWComposer的构造函数里,初始化EventHandler进而动态装载HWComposer的硬件模块初始化硬件回调上下文指针。

由SurfaceFlinger 去创建和管理

HWComposer::HWComposer(const sp<SurfaceFlinger>& flinger)
    : mFlinger(flinger),
      mAdapter(),
      mHwcDevice(),
      mDisplayData(2),
      mFreeDisplaySlots(),
      mHwcDisplaySlots(),
      mCBContext(),
      mEventHandler(nullptr),
      mVSyncCounts(),
      mRemainingHwcVirtualDisplays(0)
{
	...
    loadHwcModule();
}

当HWComposer::vsync函数触发时就模拟发送VSync 模拟信号(消息)。

void HWComposer::vsync(const std::shared_ptr<HWC2::Display>& display,
        int64_t timestamp) {
   
		...
    mEventHandler->onVSyncReceived(disp, timestamp);
}

2、EventHandler

class HWComposer
{
   
    public:    
    class EventHandler {
   
            friend class HWComposer;
            virtual void onVSyncReceived(int32_t disp, nsecs_t timestamp) = 0;
            virtual void onHotplugReceived(int32_t disp, bool connected) = 0;
        protected:
            virtual ~EventHandler() {
   }
        };
    ...
}

思考:系统是否是永远按着固定的频率16 ms 发送一次Vsync信号呢?

二、Choreographer

1、Choreographer概述

前面我们知道仅仅依靠VSync 机制无法确保最优的显示效果,因为绘制是随机的,我们必须要还要制定一些规则控制绘制,于是乎Android 引入了一个很艺术的角色——Choreographer 中文意思是编舞者,顾名思义对舞蹈动作进行编排控制(此处老外还是挺浪漫的把UI的绘制看成是一场舞蹈,而Choreography 就是这场舞蹈动作的编舞者),Choreographer 处理VSync 信号并指导CPU/GPU开始计算/绘制,确保了收到VSync 信号时才开始进行绘制,避免了绘制的随机性。简而言之Choreographer监听处理VSync信号通知并协调应用进行屏幕刷新,即实现了 “Drawing with VSync”

Google在Android 4.1系统中对Android Display系统进行了优化:在收到VSync pulse后,将马上开始下一帧的渲染。即一旦收到VSync通知,CPU和GPU就立刻开始计算然后把数据写入Buffer。通常应用层不会直接使用Choreographer,而是使用更高级的API,例如动画和View绘制相关的ValueAnimator.start()、View.invalidate()等,业界一般通过Choreographer来监控应用的帧率。文章来源地址https://www.toymoban.com/news/detail-689404.html

2、 触发Choreographer的创建

2.1、Activity启动后通过ActivityThread#handleResumeActivity触发Activity#onResume方法回调

final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
   
        ActivityClientRecord r = mActivities.get(token);
        // TODO Push resumeArgs into the activity for consideration
        r = performResumeActivity(token, clearHide, reason);//触发onResume方法
        if (r != null) {
   
            final Activity a = r.activity;
            if (r.window == null && !a.mFinished && willBeVisible) {
   
                r.window = r.activity.getWindow();
                View decor = r.window.getDecorView();
                decor.setVisibility(View.INVISIBLE);
                ViewManager wm = a.getWindowManager();
                WindowManager.LayoutParams l = r.window.getAttributes();
                a.mDecor = decor;
                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
                if (r.mPreserveWindow) {
   
                    a.mWindowAdded = true;
                    r.mPreserveWindow = false;
                    ViewRootImpl impl = decor.getViewRootImpl();
                    if (</

到了这里,关于Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android11.0 修改系统默认显示大小

    系统设置中的显示大小调整的就是屏幕密度,调整的越小,屏幕显示的内容就越多。 在系统中都会有定义一个默认的屏幕密度 设置中显示大小相关内容 源码:/packages/apps/Settings/res/xml/display_settings.xml 源码:/packages/apps/Settings/src/com/android/settings/display/ScreenZoomSettings.java 密度缩

    2024年02月09日
    浏览(64)
  • Android T 远程动画显示流程其二——系统侧动画启动流程

    接着上篇文章分析 Android T 远程动画显示流程其一 下面,我们以从桌面点击一个应用启动的场景来分析远程动画的流程,窗口添加的流程见Android T WMS窗口相关流程 这里我们从AppTransitionController.handleAppTransitionReady方法开始跟踪代码流程 代码路径:framework/services/core/java/com/and

    2024年03月28日
    浏览(46)
  • Android打开系统相机或从相册中选择图片并显示

    xml代码 展示  java代码 实机演示  

    2024年02月11日
    浏览(56)
  • 解决Mac系统android monitor启动时卡住,显示白屏的问题

    清安装1.8版本的jdk,java1.8版本以上不支持android monitor;如果你电脑上安装有java 11等高级别的版本,请自行搜索,如果在mac上安装多jdk,以及如何切换到1.8版本上 请更新SWT插件,下载地址; 1.打开网页,点击4.9 跳转到另外的网页  2.跳转到的网页如下所示意   3. 点击下载此版

    2024年02月12日
    浏览(38)
  • Android 12.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

     在android12.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析

    2024年02月09日
    浏览(59)
  • Android 12.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

      在android12.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右滑

    2024年02月09日
    浏览(94)
  • Android 10.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

      在android10.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右滑

    2023年04月09日
    浏览(66)
  • Android 11.0 系统修改usb连接电脑mtp和PTP的显示名称

      在11.0的系统产品rom定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的方法来解决这个问题 MTP的全称

    2024年01月17日
    浏览(56)
  • Android如何实现地图定位?Android studio+百度地图API+Android6.0系统实现地图显示、地址设置、点击地图定位功能(详细)

    文章说明: 本文初衷是为了记录毕设学习过程,避免忘记操作流程。该功能是毕业设计的Android软件端的功能之一,本文将从获取百度地图密钥(AK)开始,详细地对地图定位配置和相关代码进行说明, 文末将附上实现该功能的代码。后续等答辩完成会把整个Android端代码上传

    2024年02月03日
    浏览(64)
  • Android 10.0 SystemUI定制之通过系统属性控制锁屏页面通知栏显示与隐藏功能实现

    在10.0的系统产品开发中,在一些SystemUI的系统定制化开发中,在对锁屏页面的通知栏在某些情况下不需要显示通知栏,所以就需要 在systemui的通知栏布局页面中,通过属性来控制是否在锁屏页面的时候显示通知,具体就分析下systemui然后开发相关功能 在systemui系统中最主要的

    2024年02月04日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包