
PerfKit
纯参数型性能调节:日志堆栈、阴影距离、纹理 mip、线程/异步上传。默认不改帧率,全部可在 cfg 里单独开关。PerfKit
GTFO 的纯参数型性能调节。不改任何游戏数据、不打 Harmony 补丁、不碰存档, 只调整 Unity 的全局画质/日志参数。所有项目都能在配置文件里单独开关。
配置文件:BepInEx\config\local.perfkit.cfg(首次启动后生成)
默认配置
[1-Log]
StripLogStackTrace = true # 关掉 Log/Warning/Assert 的堆栈追踪
StripExceptionStackTrace = false # Exception 保留,方便排查
[2-Shadows]
Enabled = true
DistancePercent = 65 # 阴影距离 = 原来的 65%
[3-Textures]
Enabled = true
MipOffset = 1 # 相对游戏自身设定再降一档
[4-Threads] # 原 GTFOThreadRelief 的功能
JobWorkerCount = 0 # 0 = 不修改
AsyncUploadBufferMB = 0 # 0 = 不修改
AsyncUploadTimeSliceMs = 0 # 0 = 不修改
AsyncUploadPersistentBuffer = false
[5-Misc]
TargetFrameRate = 0 # 0 = 不修改
VSyncCount = -1 # -1 = 跟随游戏内设置
DisableVSyncWhenCapping = false # 锁帧时是否自动关 VSync
ReapplySeconds = 0 # 0 = 只在启动时应用一次
配置文件里每一行上面都有中英双语的注释。
每一项到底改了什么
| 配置项 | 作用 | 视觉影响 | 收益 |
|---|---|---|---|
StripLogStackTrace |
Application.SetStackTraceLogType 设为 None |
无 | 小(纯省 CPU) |
StripExceptionStackTrace |
同上,连 Exception 也关 | 无 | 小,但出错时排查变难 |
DistancePercent |
QualitySettings.shadowDistance 按比例缩放 |
远处阴影消失 | 大(GPU) |
MipOffset |
QualitySettings.masterTextureLimit,相对于启动时游戏自身的值 |
贴图和 UI 变软 | 中(显存/带宽) |
JobWorkerCount |
JobsUtility.JobWorkerCount |
无 | 通常为零(Unity 默认已是上限,只允许调低) |
AsyncUploadBufferMB |
纹理上传环形缓冲 | 无 | 小,多占内存 |
AsyncUploadTimeSliceMs |
每帧上传时间片 | 无 | 小,可能增加单帧耗时 |
TargetFrameRate |
Application.targetFrameRate |
无 | 稳帧、降温 |
VSyncCount |
QualitySettings.vSyncCount |
无(可能有撕裂) | 降延迟 |
三项预设
保守(几乎看不出来):DistancePercent=85、MipOffset=0、其余默认
平衡(默认):DistancePercent=65、MipOffset=1
激进(低配机):DistancePercent=40、MipOffset=2
默认不锁帧。
TargetFrameRate = 0表示完全不干预帧率,交给游戏自己的垂直同步。 想要锁帧才需要改它,并且必须同时处理垂直同步(见上文「锁帧为什么可能不生效」)。
⚠
MipOffset是相对于游戏自身设定的。如果你在游戏里把纹理调成"低", 游戏本身可能已经把masterTextureLimit设成 2,这时MipOffset=1会变成 3。 想看基准值就搜日志里的纹理基准 =。⚠ 纹理降档对隐形敌人(Shadow 类)的可辨识度可能有轻微影响,因为这类敌人靠很细微的 明暗/形变变化才能看见。介意的话把
[3-Textures] Enabled设成false,性能收益主要来自阴影那一项。⚠
VSyncCount默认-1(跟随游戏内设置)。不建议在公开发布版里强制关闭垂直同步 —— 部分玩家会出现画面撕裂。要改请让玩家自己在 cfg 里改。
锁帧为什么可能不生效(重要)
Unity 的硬性规则:只要 vSyncCount > 0,Application.targetFrameRate 就被完全忽略。
GTFO 默认垂直同步是开的,所以只填 TargetFrameRate 不会有任何效果。
两种做法:
① 在游戏内把垂直同步关掉,再填 TargetFrameRate = 60
② 或者:TargetFrameRate = 60 + DisableVSyncWhenCapping = true(由 MOD 代关)
另外注意:锁帧只对“帧率高于上限”的情况有用。如果机器本来就跑不到 60, 锁 60 等于没锁。想稳帧应该锁在略低于实际平均值的数(比如平均 50 就锁 45)。
定期复查会不会卡顿
不会。ReapplySeconds > 0 时,复查只处理阴影距离、日志堆栈、帧率上限这三类廉价项;
绝不会再去改纹理 mip —— 运行时改 masterTextureLimit 会触发全部贴图重新上传,那才是卡顿的来源。
发现值没被改回去时也不会重复写,所以正常情况下它什么都不做。
默认 ReapplySeconds = 0(只应用一次,零额外开销);想防止被别的 MOD 覆盖再调大。
兼容性
- 只改
Application/QualitySettings的全局值,不碰任何 GameData 数据块, 所以和改武器、敌人、地图、UI 的 MOD 都不冲突。 - MOD 地图不受影响:这些参数是全局画质,不会改变地图逻辑、光照数据或生成。
- 如果同时装了别的画质类 MOD(比如 LowSpecGaming),把
ReapplySeconds设成0, 否则两边会互相覆盖,谁后写谁赢。 - 原
GTFOThreadRelief.dll的功能已并入[4-Threads],不要两个一起装。
怎么确认生效
BepInEx\LogOutput.log 会成对打印「应用前 / 应用后」的真实数值:
[PerfKit] 启动时:VSync=1 targetFrameRate=-1 shadowDistance=200 masterTextureLimit=2
[PerfKit] 阴影距离 200 -> 130 m
[PerfKit] 纹理基准 = 2
[PerfKit] 纹理 mip 上限 2 -> 3
[PerfKit] 应用后:VSync=1 targetFrameRate=-1 shadowDistance=130 masterTextureLimit=3
[PerfKit] 完成。
对照两行快照就知道每一项到底有没有写进去。如果 TargetFrameRate 填了但应用后仍是 -1,
日志里会有一条 warning 告诉你原因。
三行分别对应:阴影缩放、纹理基准(游戏自身的值)、实际写入的 mip 上限。 没看到对应行说明那一项没启用,或者日志被别的 MOD 刷掉了。
与其他优化 MOD 的关系
- Performance Traffic Control(PTC):完全不冲突。PTC 处理的是逐对象的敌人阴影、 尸体/布娃娃预算、雾气与植被渲染;PerfKit 处理的是全局画质参数。两者没有交集, 只是收益会叠加时互相稀释。
- 如果 PTC 的
[Performance.EnemyVisuals] Enabled打开(默认关),它会在压力高时 关闭敌人阴影投射;对隐形敌人的辨识可能有影响,按需决定。
版本记录
v1.1.0 | 2026-10-20 | 锁帧失效时明确告警并新增 DisableVSyncWhenCapping;复查不再触碰纹理(避免贴图重传卡顿);
默认改为只应用一次;配置说明改为中英双语;新增应用前/后数值快照日志
v1.0.1 | 2026-10-20 | 纹理改为"相对游戏自身设定"的偏移量,修掉把画质调高反了的问题
v1.0.0 | 2026-10-20 | 首版:日志堆栈 / 阴影距离 / 纹理 mip / 线程与异步上传
卸载
删掉 PerfKit.dll 即可,设置会在下次启动时回到游戏默认。不留存档痕迹。