Skip to content

免费版 BPF自定义线程

这篇只按免费版当前真实 bin/cpu/<拓扑>.json 写法解释字段。

1. 线程文件在哪

免费版当前主路径通常是:

  1. bin/cpu/6+2.json
  2. bin/cpu/6+1.json
  3. bin/cpu/4+4.json
  4. bin/cpu/4+3+1.json
  5. bin/cpu/3+4+1.json
  6. bin/cpu/2+3+2+1.json

这些文件当前就是免费版 BPF自定义线程 主配置。

2. 当前真实结构

免费版当前主结构是:

json
{
  "version": 3,
  "apps": [
    {
      "friendly": "示例游戏",
      "packages": ["com.demo.game"],
      "main": { "match": ["UnityMain"], "cpus": "6-7", "fifo": 1 },
      "gfx": { "match": ["UnityGfx*"], "cpus": "4-5", "rr": 10 },
      "worker": { "match": ["*worker*"], "limit": 2, "cpus": "4-5", "rr": 5 },
      "extra:[Thread-*]": { "limit": 1, "cpus": "1-4" },
      "other": { "cpus": "1-4" }
    }
  ]
}

3. 顶层字段逐个解释

version

  • 当前免费版拓扑线程 JSON 版本号
  • 现有文件主线是 3

apps

  • 线程规则数组
  • 每一项代表一组应用或常驻进程的线程分配规则

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

friendly

  • 规则显示名
  • 只用于区分规则组,主要给人看

packages

  • 这组规则匹配哪些包名或进程名
  • 普通前台应用写包名
  • 常驻规则也可能直接写进程名,例如 surfaceflinger

scope

  • 可选字段
  • 现有免费版主要见到:
    • foreground
    • persistent
  • 不写时一般按前台应用规则理解
  • 写成 persistent 时表示常驻进程规则

main / gfx / render / worker / other

  • 这是免费版当前主角色字段
  • 它们不是文档抽象名,而是 JSON 里直接存在的真实键

extra:[pattern]

  • 手写补充线程规则
  • pattern 就写在 key 里
  • 用来承接主角色之外的特殊线程,或者主角色名额之外的同名线程

5. 每个角色对象里能写什么

免费版当前角色对象和 extra:[pattern] 里常见字段是:

  1. match
  2. limit
  3. cpus
  4. clusters
  5. nice
  6. rr
  7. fifo

match

  • 要匹配的线程名
  • 可以写单个字符串,也可以写字符串数组
  • 当前源码支持这些常见写法:
    • 普通包含匹配:"GameThread"
    • 通配匹配:"UnityGfx*""*worker*"
    • 精确匹配:"=renderengine"
    • 带排名后缀:"Thread-*@1""Thread-*@1-2"

limit

  • 最多命中多少个线程
  • 常用于 workerextra
  • main 最常见的语义仍然是只占关键主名额

cpus

  • 指定线程绑到哪些 CPU
  • 当前配置常见写法:
    • "7"
    • "6-7"
    • "1-4"
    • "2,4,5-6"

clusters

  • 指定线程优先落到哪类簇
  • 免费版现有文件里常见值有:
    • big
    • top

nice

  • 常规优先级偏移
  • 适合轻微调节

rr

  • SCHED_RR 实时优先级
  • 当前预置里经常给关键渲染链或工作线程使用

fifo

  • SCHED_FIFO 实时优先级
  • 只适合极少量关键线程

6. main 的真实语义

main 不是"把所有同名线程都吞进去"。

当前应该按这条理解:

  1. main 是主角色入口
  2. 它只占主规则名额
  3. 同线程名出现多条时,不会把所有同名线程都算成 main
  4. 剩余同名线程可以继续流向 extra:[pattern]other

7. 当前优先级怎么理解

最稳的理解顺序是:

  1. main / gfx / render / worker
  2. extra:[pattern]
  3. other

其中:

  • 主角色优先
  • extra 用来补专项
  • other 负责兜底

8. 免费版当前真实边界

  • 免费版线程篇只讲 BPF自定义线程
  • 免费版当前没有独立的 fas.json
  • 所以不要把 FAS 字段、FPS 档位字段写进免费版线程 JSON

9. 一句话理解

免费版当前线程专项可以直接记成:

先用 main / gfx / render / worker 抓主角色,再用 extra:[pattern] 补特殊线程,最后统一回落到 other