设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间13 现在时间13 缓存数据 到现在一共是295天,有了人生中第一张迷你专辑,我期许自己这不会是句号,只会是个逗号,会一直一直一直突破的,直到我唱不动的那天。

到现在一共是295天,有了人生中第一张迷你专辑,我期许自己这不会是句号,只会是个逗号,会一直一直一直突破的,直到我唱不动的那天。 -- 一种原谅

查看: 871|回复: 0

Android13实时刷新频率的实现代码(完整代码)

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:6
  • 最近打卡:2024-03-18 15:03:53
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
35
主题
31
精华
0
金钱
115
积分
70
注册时间
2023-9-29
最后登录
2025-5-31

发表于 2025-5-31 06:51:27 | 显示全部楼层 |阅读模式
1.jpeg

设置->开发者选项->显示刷新频率
packages/apps/Settings/src/com/android/settings/development/ShowRefreshRatePreferenceController.java
  1. public class ShowRefreshRatePreferenceController extends DeveloperOptionsPreferenceController
  2.         implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
  3.     ......
  4.     private static final int SETTING_VALUE_QUERY = 2;
  5.     private static final int SETTING_VALUE_ON = 1;
  6.     private static final int SETTING_VALUE_OFF = 0;
  7.     @VisibleForTesting
  8.     static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
  9.     @VisibleForTesting
  10.     static final int SURFACE_FLINGER_CODE = 1034;
  11.     private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
  12.     private final IBinder mSurfaceFlinger;
  13.     ......
  14.     @Override
  15.     public boolean onPreferenceChange(Preference preference, Object newValue) {
  16.         final boolean isEnabled = (Boolean) newValue;
  17.         writeShowRefreshRateSetting(isEnabled);
  18.         return true;
  19.     }
  20.     @Override
  21.     public void updateState(Preference preference) {
  22.         updateShowRefreshRateSetting();
  23.     }
  24.     ......
  25.     @VisibleForTesting
  26.     void updateShowRefreshRateSetting() {
  27.         // magic communication with surface flinger.
  28.         try {
  29.             if (mSurfaceFlinger != null) {
  30.                 final Parcel data = Parcel.obtain();
  31.                 final Parcel reply = Parcel.obtain();
  32.                 data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
  33.                 data.writeInt(SETTING_VALUE_QUERY);
  34.                 mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data, reply, 0 /* flags */); // 调用 SurfaceFlinger::onTransact 中 1034 方法
  35.                 final boolean enabled = reply.readBoolean();    // 通过 SurfaceFlinger 获取 mRefreshRateOverlay != null判断显示是否打开
  36.                 ((SwitchPreference) mPreference).setChecked(enabled);
  37.                 reply.recycle();
  38.                 data.recycle();
  39.             }
  40.         } catch (RemoteException ex) {
  41.             // intentional no-op
  42.         }
  43.     }
  44.     @VisibleForTesting
  45.     void writeShowRefreshRateSetting(boolean isEnabled) {   // 设置打开显示刷新频率
  46.         try {
  47.             if (mSurfaceFlinger != null) {
  48.                 final Parcel data = Parcel.obtain();
  49.                 data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
  50.                 final int showRefreshRate = isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF;
  51.                 data.writeInt(showRefreshRate);
  52.                 mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data,
  53.                         null /* reply */, 0 /* flags */);
  54.                 data.recycle();
  55.             }
  56.         } catch (RemoteException ex) {
  57.             // intentional no-op
  58.         }
  59.         updateShowRefreshRateSetting();
  60.     }
  61. }
复制代码
RefreshRateOverlay实际Layer显示刷新频率
frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
  1. namespace {
  2.     ......
  3. status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
  4.                                     uint32_t flags) {
  5.     if (const status_t error = CheckTransactCodeCredentials(code); error != OK) {
  6.         return error;
  7.     }
  8.     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
  9.     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
  10.         CHECK_INTERFACE(ISurfaceComposer, data, reply);
  11.         IPCThreadState* ipc = IPCThreadState::self();
  12.         const int uid = ipc->getCallingUid();
  13.         if(code == 8002) {
  14.             reply->writeInt32(mScheduler->getDfrcFps());
  15.             return NO_ERROR;
  16.         }
  17.         if (CC_UNLIKELY(uid != AID_SYSTEM
  18.                 && !PermissionCache::checkCallingPermission(sHardwareTest))) {
  19.             const int pid = ipc->getCallingPid();
  20.             ALOGE("Permission Denial: "
  21.                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
  22.             return PERMISSION_DENIED;
  23.         }
  24.         int n;
  25.         switch (code) {
  26.             ......
  27.             case 1034: {
  28.                 auto future = mScheduler->schedule([&] {
  29.                     switch (n = data.readInt32()) {
  30.                         case 0:
  31.                         case 1:
  32.                             FTL_FAKE_GUARD(mStateLock,
  33.                                            enableRefreshRateOverlay(static_cast<bool>(n)));
  34.                             break;
  35.                         default: {
  36.                             reply->writeBool(
  37.                                     FTL_FAKE_GUARD(mStateLock, isRefreshRateOverlayEnabled()));
  38.                         }
  39.                     }
  40.                 });
  41.                 future.wait();
  42.                 return NO_ERROR;
  43.             }
  44.             ......
  45. void SurfaceFlinger::enableRefreshRateOverlay(bool enable)
  46. {
  47.     for (const auto& [ignored, display] : mDisplays) {
  48.         if (display->isInternal() && !display->isVirtual()) {
  49.             if (enable) {
  50.                 auto fpsRange = display->refreshRateConfigs().getSupportedRefreshRateRange();
  51.                 mRefreshRateOverlay = std::make_shared<RefreshRateOverlay>(fpsRange, mRefreshRateOverlaySpinner);
  52.             } else {
  53.                 mRefreshRateOverlay.reset(); //disable RefreshRateOverlay
  54.             }
  55.             display->enableRefreshRateOverlay(mRefreshRateOverlay);
  56.         }
  57.     }
  58. }
  59.             ......
复制代码
初始化RefreshRateOverlay
frameworks\native\services\surfaceflinger\RefreshRateOverlay.cpp
  1. RefreshRateOverlay::RefreshRateOverlay(FpsRange fpsRange, bool showSpinner)
  2.       : mFpsRange(fpsRange),
  3.         mShowSpinner(showSpinner),
  4.         mSurfaceControl(SurfaceComposerClient::getDefault()
  5.                                 ->createSurface(String8("RefreshRateOverlay"), kBufferWidth,
  6.                                                 kBufferHeight, PIXEL_FORMAT_RGBA_8888,
  7.                                                 ISurfaceComposerClient::eFXSurfaceBufferState)) {
  8.     if (!mSurfaceControl) {
  9.         ALOGE("%s: Failed to create buffer state layer", __func__);
  10.         return;
  11.     }
  12.     createTransaction(mSurfaceControl)
  13.             .setLayer(mSurfaceControl, INT32_MAX - 2)
  14.             .setTrustedOverlay(mSurfaceControl, true)
  15.             .apply();
  16. }
复制代码
到此这篇关于Android13实时刷新频率的实现代码的文章就介绍到这了,更多相关Android刷新频率内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表