Android UI架构(十)--App请求切换帧率(1).md

2023-10-30

参考资料

  1. https://zhuanlan.zhihu.com/p/142212769?from_voters_page=true

前言

在了解HWC工作之前,我觉得还是有必要看看Android一次完整的Vsync帧率切换的流程,从App发起请求开始。

背景

随着手机屏幕硬件能力的提升,越来越多的厂商提供支持多档次刷新率的Android设备。
而在Android Q上也是支持App指定当前屏幕帧率的,也有一套帧率分辨率切换的逻辑。

查看设备可支持的刷新率和分辨率

使用命令:
adb shell dumpsys display dump |grep -A 10 -iE “mSupportedModes”

这里设备使用的是OnePlus8Pro,结果如下:

mSupportedModes=
      DisplayModeRecord{mMode={id=1, width=1080, height=2376, fps=60.000004}}
      DisplayModeRecord{mMode={id=2, width=1440, height=3168, fps=120.00001}}
      DisplayModeRecord{mMode={id=3, width=1440, height=3168, fps=60.000004}}
      DisplayModeRecord{mMode={id=4, width=1080, height=2376, fps=120.00001}}

可以看到是有四种模式:

  1. 1080 + 60Hz
  2. 2K + 120Hz
  3. 2K + 60Hz
  4. 1080 + 120Hz

App设置设备帧率

Android Q及以下版本

在Android Q或更低版本上,可以通过指定当前Window的帧率来设置屏幕刷新率,如选择设备可支持的最高刷新率:

var highestMode: Display.Mode = mWindowManager!!.defaultDisplay.supportedModes[0]
for (mode in mWindowManager!!.defaultDisplay.supportedModes) {
    if (mode.refreshRate > highestMode.refreshRate) {
        highestMode = mode
    }
}

wmParams!!.preferredDisplayModeId = highestMode.modeId

Android R

Google建议利用可变刷新率

在较旧的 Android 版本 (Android 11 之前) 中并不存在 setFrameRate API,这时应用仍然可以通过直接将WindowManager.LayoutParams.preferredDisplayModeId设置为Display.getSupportedModes中的可用模式之一来影响刷新率。

从 Android 11 开始,我们不建议大家采用这种方法,因为平台会不知道应用的渲染意图。

例如,如果一个设备支持 48Hz、60Hz 和 120Hz,屏幕上有两个应用分别调用 setFrameRate(60, …) 和 setFrameRate(24, …),那么平台可以选择 120Hz 来同时满足这两个应用。

而如果这些应用使用了preferredDisplayModeId,它们很可能会把模式设置为 60Hz 和 48Hz,那这时平台就无法使用 120Hz 了。
这时平台只能从 60Hz 或 48Hz 中选择一个,从而影响到另一个应用的显示效果。

  1. 获取刷新率:

    1. SDK
      通过 DisplayManager.DisplayListener 注册一个显示监听器,并通过 Display.getRefreshRate 查询刷新率。
    2. NDK
      使用 AChoreographer_registerRefreshRateCallback 注册回调 (API 级别30)。
  2. 设置刷新率应用可以调用以下方法之一:

    1. SDK
      1. Surface.setFrameRate
      2. SurfaceControl.Transaction.setFrameRate
    2. NDK
      1. ANativeWindow_setRrameRate
      2. ASurfaceTransaction_setFrameRate
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android UI架构(十)--App请求切换帧率(1).md 的相关文章

  • java.lang.IllegalArgumentException:此组件要求您指定有效的 android:textAppearance 属性

    我的布局文件之一中有一个 com google android material button MaterialButton 组件 当我使用最新版本的 Material Components 库 com google android mat
  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • Android 中多个蓝牙连接的自定义 UUID

    我有一个 Android 设备作为服务器连接到多个蓝牙 Android 客户端 我了解 UUID 的概念以及它的独特之处 我的问题是 我可以为连接到我的服务器的所有客户端使用相同的 UUID 吗 如果没有 我如何以编程方式为我的客户端生成
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • fetchUuidsWithSdp 的奇怪 UUID 逆转

    我有一个在树莓派上运行的 python 蓝牙服务器 使用 PyBluez 我在服务器中使用的uuid是 8f86d132 4ab8 4c15 b8df 0b70cf10ea56 我正在打电话device fetchUuidsWithSdp
  • Android WebView里面的ScrollView只滚动scrollview

    在我的应用程序中 我有一个 ScrollView 其中包含一些线性视图 一些文本视图和一个 Webview 然后是其他线性布局等 问题是 WebView 不滚动 Scroll 仅侦听 ScrollView 有什么建议么
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 在 Android 应用程序资源中使用 JSON 文件

    假设我的应用程序的原始资源文件夹中有一个包含 JSON 内容的文件 我如何将其读入应用程序 以便我可以解析 JSON See 开放原始资源 http developer android com reference android conte

随机推荐

  • 设计模式之工厂方法模式

    定义 定义一个用于创建对象的接口 让子类决定实例化哪个类 使用场景 在任何需要生成复杂对象的地方 都可以使用工厂方法模式 复杂对象适合使用工厂模式 public interface Car public void make public v
  • db2实现两个数相减_DB2中求两个日期之间相差多少个月?

    DB2中怎么来求两个日期之间相差多少个月呢 今天在工作中遇到一个问题 就是怎么在DB2中怎么来求两个日期之间相差多少个月呢 结果找到一个方法如下 在DB2中两个日期之间相减会等到一个整数总共有六种情况分别是 select date 2010
  • HTML登录页面

    第一步 构建HTML框架 简介 本文用最通俗的语言 一步步教会大家CSS构建登录页面 首先构建HTML框架 包含用户名 密码 记住密码 注册这几个功能 如果大家HTML不牢固 请看我的这篇博客 https blog csdn net qq
  • nginx系列(十七)nginx下的gzip与vary、预压缩、缓存、反向代理的结合

    size xx large 前言 size 在http的协议里 为了减少网络传输 允许将报文进行gzip压缩以后再传输 虽然网络传输体积减小了 但是服务器压缩和浏览器的解压缩消耗了CPU的计算 后来出现了预压缩技术 就是提前把静态文件进行g
  • Coordinate Attention 论文阅读

    Coordinate Attention 论文阅读 背景 研究表明通道注意力可以显著提升了模型性能 但是在以往的工作中通常忽略了位置信息 而位置信息对于生成空间注意力非常重要 为了利用位置信息 Coordinate Attention 将位
  • 关于示波器引入50HZ工频干扰的解释

    前几天 小白在实验室工作时 听到同事抱怨示波器有问题 上前查看 才知道 小白的那位同事在测量信号波形时 实际与理想相差甚远 在探头什么也不接的情况下 发现示波器本身也存在波形信号 于是乎 便有了前述说的抱怨 由于没有保存当时的波形 事后小白
  • 浏览器输入url后经历的过程(详细)

    页面加载流程 DNS查询 TCP连接 发送HTTP请求 服务器处理HTTP请求并返回HTTP报文 浏览器解析并render页面 HTTP连接断开 1 DNS查询 浏览器查看浏览器缓存 gt 系统缓存 gt 查找本地host文件 gt 本地D
  • vue 中 ref 、$refs 的用法

    ref 的三种用法 1 ref 加在普通的元素上 用this ref name 获取到的是dom元素 2 ref 加在子组件上 用this ref name 获取到的是组件实例 可以使用组件的所有方法 3 如何利用 v for 和 ref
  • 凸优化及拉格朗日对偶问题

    只记录机器学习方法中需要用到的最优化知识 不做系统总结 持续更新ing 文章目录 1 凸优化 1 凸集 2 凸性条件 3 凸规划 4 凸规划性质 5 凸优化问题 2 拉格朗日函数及其对偶问题 1 拉格朗日函数 含KKT条件 2 拉格朗日对偶
  • pnpm:简介

    一 概念 performant npm 意味 高性能的 npm pnpm由npm yarn衍生而来 解决了npm yarn内部潜在的bug 极大的优化了性能 扩展了使用场景 被誉为 最先进的包管理工具 二 特点 速度快 节约磁盘空间 支持m
  • keras测试环境搭建

    使用的是windows 22h2 在windows中测试 目前看 如果所有用到的库都是pip可以安装的 就可以在windows测试 考虑cuda cudnn对于操作系统的影响太大了 所以只测试了DirectML 安装python3 8 安装
  • 密码爆破总结

    密码爆破经验分享 什么是密码爆破 密码爆破 通过不断输入密码试错 直到成功为止 密码爆破原理 原理 通过不断请求连接 修改连接中的参数 把对应密码的参数遍历字典 自己创建 或者网上获取 根据连接返回的参数来确定是否爆破成功 总结 建立连接
  • MacOS提示【您没有权限来打开应用程序“XXX”。】的完美解决办法

    前言 在 macOS Big Sur 系统下运行一些注册机类的应用程序 大概率会提示 您没有权限来打开应用程序 XXX 请联系您的电脑或网络管理员以获得帮助 信息 具体如下图 下面给出解决办法 说明 本人电脑为新款 MacBook Pro
  • vuex内容及使用详解

    Vuex是什么 Vuex 是一个专为 Vue js 应用程序开发的状态管理模式 它采用集中式存储管理应用的所有组件的状态 并以相应的规则保证状态以一种可预测的方式发生变化 说起状态管理模式 就不得不提起一个名词 单向数据流 单向数据流 在V
  • ubuntu vi/vim退出文件

    要退出 但是不保存 按esc先 然后输入 q 回车键即可退出 无法退出 则在 q 加入一个叹号回车键就行了 要退出保存的 则输入 wq 强制保存退出 则输入 wq 看到此时已经退出 在等待命令状态 以nano开头编辑文件的 则要退出 按 C
  • SQL Server学习之复合索引

    概要什么是单一索引 什么又是复合索引呢 何时新建复合索引 复合索引又需要注意些什么呢 本篇文章主要是对网上一些讨论的总结 一 概念单一索引是指索引列为一列的情况 即新建索引的语句只实施在一列上 用户可以在多个列上建立索引 这种索引叫做复合索
  • GPT系列模型技术路径演进

    目录 前言 Transformer GPT 1 BERT GPT 2 GPT 3 InstructGPT ChatGPT GPT 4 类ChatGPT产品 Google Bard 诗人 facebook LLaMA 羊驼 复旦 MOSS 清
  • 源码安装ODOO12

    要从源码安装 Odoo 我们首先要从 GitHub 上克隆一套 Odoo 源代码 mkdir home tderp conda envs odoo12 odoo dev 在odoo12虚环境下创建工作目录 cd home tderp con
  • linux怎么打开.o文件,Linux下文件I/O操作的相关知识

    Linux文件I O主要指的是文件的输入输出 很多初学者对文件的I O不是很了解 Linux文件I O的操作较多 下面小编就给大家详细介绍下Linux文件I O linux 文件I O教程 1 一 文件描述符 对内核而言 所以打开的文件都通
  • Android UI架构(十)--App请求切换帧率(1).md

    文章目录 参考资料 前言 背景 查看设备可支持的刷新率和分辨率 App设置设备帧率 Android Q及以下版本 Android R 参考资料 https zhuanlan zhihu com p 142212769 from voters