免费版 BPF自定义线程
这篇只按免费版当前真实 bin/cpu/<拓扑>.json 写法解释字段。
1. 线程文件在哪
免费版当前主路径通常是:
bin/cpu/6+2.jsonbin/cpu/6+1.jsonbin/cpu/4+4.jsonbin/cpu/4+3+1.jsonbin/cpu/3+4+1.jsonbin/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
- 可选字段
- 现有免费版主要见到:
foregroundpersistent
- 不写时一般按前台应用规则理解
- 写成
persistent时表示常驻进程规则
main / gfx / render / worker / other
- 这是免费版当前主角色字段
- 它们不是文档抽象名,而是 JSON 里直接存在的真实键
extra:[pattern]
- 手写补充线程规则
pattern就写在 key 里- 用来承接主角色之外的特殊线程,或者主角色名额之外的同名线程
5. 每个角色对象里能写什么
免费版当前角色对象和 extra:[pattern] 里常见字段是:
matchlimitcpusclustersnicerrfifo
match
- 要匹配的线程名
- 可以写单个字符串,也可以写字符串数组
- 当前源码支持这些常见写法:
- 普通包含匹配:
"GameThread" - 通配匹配:
"UnityGfx*"、"*worker*" - 精确匹配:
"=renderengine" - 带排名后缀:
"Thread-*@1"、"Thread-*@1-2"
- 普通包含匹配:
limit
- 最多命中多少个线程
- 常用于
worker或extra main最常见的语义仍然是只占关键主名额
cpus
- 指定线程绑到哪些 CPU
- 当前配置常见写法:
"7""6-7""1-4""2,4,5-6"
clusters
- 指定线程优先落到哪类簇
- 免费版现有文件里常见值有:
bigtop
nice
- 常规优先级偏移
- 适合轻微调节
rr
SCHED_RR实时优先级- 当前预置里经常给关键渲染链或工作线程使用
fifo
SCHED_FIFO实时优先级- 只适合极少量关键线程
6. main 的真实语义
main 不是"把所有同名线程都吞进去"。
当前应该按这条理解:
main是主角色入口- 它只占主规则名额
- 同线程名出现多条时,不会把所有同名线程都算成
main - 剩余同名线程可以继续流向
extra:[pattern]或other
7. 当前优先级怎么理解
最稳的理解顺序是:
main / gfx / render / workerextra:[pattern]other
其中:
- 主角色优先
extra用来补专项other负责兜底
8. 免费版当前真实边界
- 免费版线程篇只讲
BPF自定义线程 - 免费版当前没有独立的
fas.json - 所以不要把 FAS 字段、FPS 档位字段写进免费版线程 JSON
9. 一句话理解
免费版当前线程专项可以直接记成:
先用
main / gfx / render / worker抓主角色,再用extra:[pattern]补特殊线程,最后统一回落到other。
