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

VSync中的VsyncConfiguration机制

首先看下其定义:此类封装了不同刷新率的垂直同步配置。根据所使用的刷新率以及是否在 OpenGL 中进行合成,不同的偏移量将有助于降低延迟。此类会跟踪设备所处的模式,并在需要时返回相应的偏移量。

classVsyncConfiguration{public:virtual~VsyncConfiguration()=default;virtualVsyncConfigSetgetCurrentConfigs()const=0;virtualVsyncConfigSetgetConfigsForRefreshRate(Fps fps)const=0;virtualvoidreset()=0;virtualvoidsetRefreshRateFps(Fps fps)=0;virtualvoiddump(std::string&result)const=0;};

virtualVsyncConfigSetgetCurrentConfigs()const=0;

获取当前的 VSYNC 配置集。

调用此方法会返回一个VsyncConfigSet结构体。这个结构体包含了在当前屏幕刷新率下,系统处于不同状态(Late、Early、Early GL)时的 App 偏移量和 SF 偏移量。SurfaceFlinger 的调度器(Scheduler)需要用这个方法的返回值来设定即将到来的 VSYNC 唤醒时间。

VsyncConfigSetgetConfigsForRefreshRate(Fps fps)

获取指定刷新率下的 VSYNC 配置集。

与上一个方法不同,系统可能需要查询非当前刷新率的配置。例如,当系统准备从 60Hz 切换到 120Hz 时,调度系统需要提前知道 120Hz 下对应的 Phase Offsets 是多少,以便平滑过渡。传入参数fps,返回对应刷新率的配置集。

voidreset()

重置内部状态。将 VSYNC 偏移量配置重置为初始状态。通常在一些关键生命周期事件中使用,比如:

  • 设备刚刚启动或屏幕热插拔(Display Hotplug)时。
  • 系统属性(System Properties)中的 VSYNC 偏移量调试参数被修改,需要重新加载时。
voidsetRefreshRateFps(Fps fps)

更新当前活动的屏幕刷新率。

当 SurfaceFlinger 真正完成了屏幕刷新率的切换(例如 90Hz 降到了 60Hz),它会调用这个方法通知VsyncConfiguration。这样,VsyncConfiguration内部的状态就会更新,随后再调用getCurrentConfigs()时,返回的就是新刷新率(60Hz)对应的偏移量参数了。

voiddump(std::string&result)

导出调试信息。

这是 Android 系统服务的标准调试机制。当你通过 ADB 命令行运行adb shell dumpsys SurfaceFlinger时,SurfaceFlinger 会遍历其所有核心组件的dump方法。这个方法会将VsyncConfiguration当前记录的刷新率、各状态的 Offset 纳秒值等内部信息,追加到result字符串中,方便开发者排查掉帧或延迟问题。

另外可以看到这个类里都是虚函数,其与子类的关系如下:


impl/VsyncConfiguration

这是相位偏移和持续时间的通用实现方式。PhaseOffsets 和 WorkDuration 都继承自此类,并实现了constructOffsets方法。

classVsyncConfiguration:publicscheduler::VsyncConfiguration{public:explicitVsyncConfiguration(Fps currentFps);// Returns early, early GL, and late offsets for Apps and SF for a given refresh rate.VsyncConfigSetgetConfigsForRefreshRate(Fps fps)constoverrideEXCLUDES(mLock){std::lock_guardlock(mLock);returngetConfigsForRefreshRateLocked(fps);}// Returns early, early GL, and late offsets for Apps and SF.VsyncConfigSetgetCurrentConfigs()constoverrideEXCLUDES(mLock){std::lock_guardlock(mLock);returngetConfigsForRefreshRateLocked(mRefreshRateFps);}// Cleans the internal cache.voidreset()overrideEXCLUDES(mLock){std::lock_guardlock(mLock);mOffsetsCache.clear();}// This function should be called when the device is switching between different// refresh rates, to properly update the offsets.voidsetRefreshRateFps(Fps fps)overrideEXCLUDES(mLock){std::lock_guardlock(mLock);mRefreshRateFps=fps;}// Returns current offsets in human friendly format.voiddump(std::string&result)constoverride;protected:virtualVsyncConfigSetconstructOffsets(nsecs_t vsyncDuration)const=0;VsyncConfigSetgetConfigsForRefreshRateLocked(Fps fps)constREQUIRES(mLock);mutableftl::SmallMap<Fps,VsyncConfigSet
http://www.jsqmd.com/news/543732/

相关文章:

  • Docker、Docker Compose、Docker Swarm、Kubernetes网络与服务暴露详解
  • 【CVPR26-单彩峰-南京大学】O2MAG:用于异常检测的单样本高保真异常图像生成
  • 华硕笔记本电池拯救计划:3个实战场景让你的电池寿命翻倍 [特殊字符]
  • Zotero文献管理神器:Style插件这些隐藏功能你可能不知道
  • SEO_五个常见的SEO错误及解决办法分享
  • 隔声罩隔声量仿真:从理论到实践
  • SEO_2024年最新SEO策略与趋势深度解析(442 )
  • Python AI 用例工具正在淘汰这4类开发者——2024 Q2招聘数据揭示:掌握工具链编排能力者薪资溢价达67%
  • NaViL-9B效果实测:支持‘请将图中文字翻译为英文,并描述整体场景’
  • 动漫追番工具Mikan Project:开源客户端实现个性化番剧管理新体验
  • 直击博鳌 | 百度沈抖:正视具身智能三大挑战,产业爆发是渐进过程,没有“ChatGPT时刻”
  • Unity Shader 齐次坐标与透视除法理解 SV_POSITION 的 w 分量
  • CasRel模型惊艳效果:同一实体对(马云-阿里巴巴)识别7种关系
  • SmolVLA惊艳效果:‘Return to home position’指令触发6关节同步归零动画
  • 5个步骤掌握CAD_Sketcher:Blender参数化设计的终极指南
  • untrunc:视频文件修复的解决方案与实战指南
  • iBeebo:重新思考移动社交体验的轻量化开源方案
  • Antares ESP32 MQTT轻量库:工业级MQTT客户端封装
  • Python 3.15 JIT性能翻倍实录(官方未公开的--enable-jit=profile模式深度解密)
  • Wan2.2-I2V-A14B企业落地:汽车4S店车型介绍短视频自动化生产系统
  • Java ArrayList中按对象属性查找元素的正确姿势
  • Ryujinx开源项目:跨平台Switch游戏模拟解决方案
  • Win11Debloat系统优化工具:提升Windows效率的全面解决方案
  • vLLM-v0.17.1效果展示:vLLM 0.17.1对Long Context(256K)支持验证
  • OpenClaw定时任务:nanobot自动化日程管理
  • 电子系统接口设计与电路符号解析
  • LingBot-Depth效果展示:稀疏深度数据补全惊艳案例集
  • OpenClaw问题排查指南:GLM-4.7-Flash接口连接失败解决方案
  • Kubernetes 存储性能优化:从持久卷到存储类
  • Phi-4-Reasoning-Vision快速部署:Kubernetes双卡节点调度与资源预留配置