Skip to content

FAS 帧感知

这篇只按当前真实 bin/cpu/fas.json 与运行时代码解释 FAS。

1. 先说结论

按当前仓库磁盘内容:

  • 付费版有独立的 bin/cpu/fas.json
  • 免费版当前没有 bin/cpu/fas.json

所以官网文档不能再把 FAS 写成免费版的常改主线功能。

2. FAS 是做什么的

FAS 当前负责:

  1. 感知前台应用帧率节奏
  2. 识别应该按哪个目标 FPS 档位运行
  3. 把目标 FPS、margin_fpskp 提供给运行时控制层

它不是线程分配文件。

3. 主要文件

FAS 当前主文件是:

  1. bin/cpu/fas.json

当前真实结构主要包含:

  1. defaults
  2. apps
  3. projects
  4. _murong_remote

其中真正参与运行时主逻辑的核心是:

  1. defaults
  2. apps

4. 顶层字段逐个解释

defaults

  • 全局默认 FAS 参数
  • 当前主线字段:
    • default_target_fps
    • base_margin_fps
    • kp

apps

  • 应用级 FPS 档位配置数组

projects

  • 当前文件里会保留这个数组
  • 但现阶段主运行时重点不是它

_murong_remote

  • 这是 APK/远端同步留下的元数据区
  • 当前常见内容有:
    • config_version
    • synced_at
    • managed_packages
    • watermark

文档应明确写出:它不是运行时核心控制字段。

5. defaults 里的字段逐个解释

default_target_fps

  • 默认目标 FPS
  • 当应用没有更具体的档位时,会回落到这里

base_margin_fps

  • 默认帧率余量
  • 运行时会用它修正目标 FPS 的控制边界

kp

  • 默认比例控制系数
  • 用来决定误差反馈有多激进

6. apps[] 里的字段逐个解释

friendly

  • 应用显示名

package

  • 应用包名
  • 当前 fas.json 这里主字段是单数 package,不是 packages

fps_profiles

  • 该应用支持的 FPS 档位列表

7. fps_profiles[] 里的字段逐个解释

target_fps

  • 这条档位的目标 FPS

margin_fps

  • 该档位覆盖的帧率余量
  • 没写时,运行时会回落到默认 margin 逻辑

kp

  • 该档位覆盖的控制系数
  • 没写时,运行时会回落到全局默认 kp

fallback

  • 是否把这条档位作为回退档位
  • 当当前 FPS 无法精确匹配时,运行时会优先选择合适的回退档位

8. 当前运行时怎么选档

按当前代码,FAS 主要会:

  1. 先按包名找到应用
  2. 再根据当前 FPS 在 fps_profiles 里选最接近的目标档
  3. 如果没法直接命中,就用带 fallback: true 的档位兜底
  4. 如果某档没写 margin_fpskp,就回落到 defaults

所以文档里应该把 fallback 解释成"回退档位",而不是泛泛写成备用标记。

9. 什么时候该改 FAS

适合:

  1. 某个游戏 FPS 档识别不准
  2. 某个游戏明明锁 60,却总按更高档去跑
  3. 想给特定游戏补 120 / 144 / 165 等档位
  4. 想微调该档位的 margin_fpskp

不适合:

  1. 想改单个线程绑核
  2. 想改 main / gfx / render / worker
  3. 想改模式频率上限下限

这些应该去线程篇或动态调频篇。

10. 一句话理解

FAS 帧感知就是:

fas.json 里的 defaults + apps[].fps_profiles[] 去告诉运行时"当前应用该按哪个目标 FPS 档位控制",它当前是付费版独立配置,不是免费版主线文件。