| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android中可变帧率VRR -> 正文阅读 |
|
[移动开发]Android中可变帧率VRR |
Android 从Q开始实现对可变帧率(VRR:Variable Refresh Rate)的支持。本文以android Q 为基础介绍android VRR的实现, 与android S有部分差别,但大体流程相同。 帧率设置方式android 提供了几种方式设置fps:activity 设置帧率, setting 设置帧率, app黑名单方式限制高帧率, surfaceflinger debug接口设置帧率, 另外也考虑到了低电等情况。 这几种方式优先级由高到低如下:? 1.如果用SurfaceFlinger debug接口设置了帧率, 那么后续其他设置方式都不会其作用。 2. 如果进入低电量模式, 系统帧率范围为0-60fps, 后面的帧率设置不起作用。 3. 如果settings中设置了帧率, 那么settings中的帧率限定了系统fps的最大和最小值。 4. app设置自身的帧率, 该帧率如果超出setting 帧率设置区间范围, 不起作用。 5. 高帧率黑名单,该名单包含了不能跑在高帧率的package name, 在4没有设置的情况下, 会检测app是否在黑名单中,如果4中设置app 帧率, 则不再查看黑名单。 帧率设置APIapp 设置帧率:activity可根据自身特点, 设定适合自己的帧率, 该帧率设定的影响范围为本activity在主屏幕作为focus app显示期间。? api:?
Display.Mode.getRefreshRate();
WindowManager.LayoutParams.preferredDisplayModeId (android Q ) WindowManager.LayoutParams.preferredMinDisplayRefreshRate(android S新增) WindowManager.LayoutParams.preferredMaxDisplayRefreshRate(android S新增) Activity示例代码: public class MainActivity extends AppCompatActivity {? 相关流程如下:?
params.preferredDisplayModeId = mode.getModeId(); -->
relayoutWindow
? ??
app帧率黑白名单? ? ? ?特殊app, 是否可以跑在系统帧率下的问题, 可以通过黑白名单解决。 目前系统支持黑名单, 白名单需要framework作特别定制。 黑名单方式 目前android 中支持帧率黑名单设置, 即不能以高帧率跑的app名单, 名单中的app 跑在最低帧率, 其他app跑在默认帧率。? 两种方式可以创建该名单。?创建黑名单方式如下:
2. 添加相应名单到settings.config, 其中属性名为namespace+"/"+ name形式,值为包名list,?包名以逗号分割?,见附后示例。 其中: namespace :DeviceConfig.NAMESPACE_DISPLAY_MANAGER。 name:?DisplayManager.DeviceConfig.KEY_HIGH_REFRESH_RATE_BLACKLIST。 写该属性需要有权限:?Manifest.permission.WRITE_DEVICE_CONFIG 代码示例如下:
该settings数据存储位置:?/data/system/user/0/settings_config.xml, 示例内容:
无论是app自己请求帧率还是设立黑名单的方式, 在WMS都会通过调用RefreshRatePolicy.getPreferredModeId()函数获取到上面两种的设置。 在WMS刷新屏幕时,对于每个display, 按照Z order 从上向下的顺序, 依次调用RefreshRatePolicy.getPreferredModeId,去获取该窗口适合的display mode id (preferredModeID), getPreferredModeId首先检查app自身是否有要求的fps(即app api中介绍的设置params.preferredDisplayModeId), 如果有, preferredModeID 按app 自身要求给出, 如果没有再继续检查黑名单中是否有该app, 如果有的话, 按设定的系统最低帧率作为preferredModeID, 否则认为该window对于FPS没有特殊要求。 如果该display中多个窗口需要考虑preferredModeID, 则这些窗口中以Z order中最上层的window作为当前display的FPS, 然后按照app 设置帧率中提到的流程“WMS 调用(流程1.)“ 向displaymanagerservide 设置display mode ID . 例如display 0 上有以下窗口, z order 顺序上到下, 则最终按80设置该窗口的app 帧率:
调用getPreferredModeId()的流程如下(由底向上):
白名单方式 指明哪些app可以跑在最高帧率, 其他app默认为最低帧率。?该种方式可以使用以上类似方式设定。接口需要定义,建议为以下:
namespace 同黑名单:DeviceConfig.NAMESPACE_DISPLAY_MANAGER。 name:?DisplayManager.DeviceConfig.KEY_HIGH_REFRESH_RATE_WHITELIST ="high_refresh_rate_whitelist"; settings中设置帧率settings 中设定帧率为全局帧率,限定了系统的最高帧率和最低帧率,?系统默认在该帧率区间运行, app请求的帧率不能突破settings限定。 修改如下setting值,会修改系统的fps, DisplayModeDirector.java?中主动监听下面settings值的变化,然后通过surfacecontrol 设置到surfaceflinger, 相应流程后面介绍。? low?power?mode 的帧率范围为(0-60fps), 具有最高优先级。优先级由高到低: low?power?mode->settings -> app request. private final?Uri?mPeakRefreshRateSetting?= private?final?Uri?mMatchContentFrameRateSetting?= adb命令修改settings帧率 adb shell settings put system peak_refresh_rate 90 通过SurfaceFlinger transacation 1035设定fps使用该方法后, surfaceflinger 认为进入了debug mode, 不在接受上述两种方法设定的fps adb :?adb shell service call SurfaceFlinger 1035 i32 X?//X 为surfaceflinger中displaymode ID, 通常为Display.Mode.getModeId 减1.? X 设为负值, 可以解除debug mode 帧率切换frameworks层实现从上面的API 介绍中可以看到, 无论从APP、黑名单、还是Settings,? 最后的设置都会调用到DisplayManagerService ,这一段的实现和代码逻辑可以参看Android 10 (Android Q)中的屏幕刷新率(display refresh rate)切换方法和策略_刷新率_方法_display_Android - 1024问 FPS 默认值设定启动设备时, 硬件以最高帧率初始化, 后续在displaymanagerservice ready 之后, 该逻辑见SettingsObserver.updateRefreshRateSettingLocked@ frameworks/base/services/core/java/com/android/server/display/DisplayModeDirector.java a.?如果settings中Settings.System.PEAK_REFRESH_RATE 和 Settings.System.MIN_REFRESH_RATE(FPS 最高值, 最低值), 则以该区间设置FPS。 如果settings中没有设置最高值peak_refresh_rate,则以系统默认值作为最高值。? b.?系统默认值, 首先从资源文件中读取默认FPS,? 该资源ID:config_defaultPeakRefreshRate@values/config.xml。 如果Settings.Config 中设置了“ DeviceConfig.NAMESPACE_DISPLAY_MANAGER/DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT”, 则以该值作为系统默认值。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 2:28:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |