作者: 雨色
版本: v2.1.4
适配: SM8650 (8 Gen3 / Adreno750) · SM8750 (8 Elite / Adreno830) · SM8850 (8 Elite Gen5 / Adreno840)
游戏中把 GPU 地板抬到你设置的档位(默认 680MHz)并锁住上限,系统 governor 在地板以上自由调频;退出游戏 8 秒后自动恢复。
- ✅ WebUI 档位选择改按下标命中:此前前端按 MHz 值匹配下拉项,配置值不在设备频表时(如 8e5 上默认的 680)一个选项都命中不了,浏览器会静默选中第一项 = 最高频,一保存就把地板钉在 1200MHz
- ✅ 保存即吸附:写盘前强制走
gb_map_floor/gb_map_ceil,配置里的值必然是设备真实档位,下次打开必然命中 - ✅ 回显生效值:提示不再显示"请求值",而是「生效值 + 档位号」;发生吸附 / 夹取时追加说明;保存后自动回读
- ✅ 修复浏览器降级通道:
main.js的sh()在非 KSU 通道下未替换__MODPATH__,路径正则失配 →config.sh的读与存被静默降级成status.sh(表现为下拉框为空、保存无效) - ✅ 频表口径统一(跨 SoC):
available_frequencies顺序不保证降序(devfreq 表常见升序),统一sort -nr归一化,保证 index0 = 最高频 = pwrlevel 0,并与num_pwrlevels做条目数对齐校验 - ✅ 窗口一致性保护:上限档位高于地板时(无解区间)自动对齐到上限档位(等效锁频),并明确提示
- ✅ 状态卡新增「地板档位 n / N」:直接看到硬件当前的
min_pwrlevel
- ✅ 事件驱动游戏识别:
proc_monitor.sh监听am_proc_start/am_proc_died写入state/game_proc,主循环直接读状态,去掉每轮的pidof轮询 - ✅ 保留启动兜底扫描:开机时若已有目标游戏在运行,仍能识别
- ✅ WebUI 包名来源统一:状态 / 配置 / 日志三处统一读
state/game_proc
- ✅ 安装期节点探测按实际平台路径:复用运行时引擎
lib/platform.sh(多路径 + 平台自适应),8e5 安装时不再误报"未检测到 KGSL 节点",明确提示"devfreq 空壳由 GMU DCVS 接管属正常" - ✅ 热路径零 fork 化:节点读写 / 配置读取 / 进程校验全部走 shell 内建(
read/echo/$SECONDS),游戏轮询 统一 0.3s(实测每轮含地板+上限共 6 路校验 ≈ 73μs,CPU 占用 <0.02%,比旧版 1s 轮询的几十次 fork 还低一个量级) - ✅ 上限护栏同频:
max_pwrlevel/max_freq/max_gpuclk/gpu_max_clock四路同样每 0.3s 检测,其他游戏/模块拉低上限后 0.3s 内拉回 - ✅ 配置热加载 / 状态文件只在变化时写,减少 0.3s 轮询下的 IO
- ✅ 修复 WebUI 页脚版本号不一致
- ✅ 三通道地板接管:
min_pwrlevel(档位)+devfreq/min_freq(Hz)+/sys/kernel/gpu/gpu_min_clock(MHz)同步写入,覆盖 8g3 / 8e5 全部节点布局 - ✅ 上限常驻保护:
max_pwrlevel/max_gpuclk/gpu_max_clock/max_freq四路护栏,防止游戏或原厂栈拉低上限 - ✅ 游戏运行 1 秒校验(原 5 秒),压制原厂游戏栈(
opgs_daemon等)的抢写 - ✅ 写后回读自检:被驱动丢弃时输出
WARN floor write rejected - ✅ 节点不存在自动跳过:8e5 无 devfreq 节点时零空转
- ✅ monitor 进程树治理:重启不再累积孤儿进程(原每次 +2)
- ✅ 空变量写保护:节点路径缺失时拒绝写入,防止误写根目录
- ✅ WebUI 面板:状态 / 档位自定义 / 实时日志
- min_pwrlevel 档位接管(实测 13 分钟+ 不被系统覆盖,对比 min_freq 几秒即被覆盖)
- 三平台自适配 + 按处理器平台区分安装
- 双事件监听(am_proc_start 启动 + am_proc_died 退出 + 校验兜底)
- 异常残留自清理(上次崩溃残留的档位,启动时自动恢复)
游戏启动 → 三通道同步写入地板:
min_pwrlevel(档位号)
devfreq/min_freq(Hz,节点存在时)
/sys/kernel/gpu/gpu_min_clock(MHz,节点存在时)
游戏运行 → 每 0.3 秒只读校验(零 fork,偏离才重写);governor 在地板以上自由调频
同时守卫上限:max_pwrlevel / max_gpuclk / gpu_max_clock / max_freq
游戏退出 → 8 秒迟滞 → 恢复系统默认档位(num_pwrlevels-1)
| 场景 | GPU 地板 |
|---|---|
| 王者荣耀 / 永劫无间运行中(前台/后台/小窗) | 目标档位(默认 680MHz) |
| 所有目标游戏退出后 | 系统默认(约 231MHz) |
1. KernelSU / Magisk / APatch 中安装 zip
2. 重启生效
3. WebUI: http://127.0.0.1:8778(管理器内嵌通道或浏览器)
- 状态:平台 / 实际地板 / 地板档位 / 目标地板 / 目标上限 / 当前频率 / 实际上限 / 游戏状态 / 温度
- 档位:下拉框列出设备真实档位(每项标注档位号)→ 保存即吸附生效(游戏运行中 0.3s 内应用;非游戏态不写地板,进游戏后生效)
- 日志:实时查看运行日志
保存时会自动吸附:你选的 MHz 若不在设备频表上,会落到最近的可用档位,界面明确回显「生效值 + 档位号」。 配置值与设备档位不一致时,档位区会给出 ⚠ 提示。
编辑 /data/adb/modules/g750-boost/games.txt,一行一个包名(建议末尾留空行)。
/data/adb/modules/g750-boost/boost.log
| 通道 | 节点 | 单位 | 8g3 | 8e5 | 说明 |
|---|---|---|---|---|---|
| 主 | /sys/class/kgsl/kgsl-3d0/min_pwrlevel |
档位号 | ✅ | ✅ | 最可靠,实测长时间不被覆盖 |
| 软下限 | <kgsl>/devfreq/min_freq |
Hz | ✅ | ❌ 无节点 | 第三方调频 App 走这里,必须同步 |
| 内核 | /sys/kernel/gpu/gpu_min_clock |
MHz | ✅ | ✅ | msm_perf / 性能工具常用接口 |
8e5 (SM8850) 上
devfreq设备虽注册但无频率节点(gen8 把调频决策移到 GMU DCVS, 且 DCVS 节点全部只读)。代码按"节点文件存在"探测,不存在自动跳过,无空写。min_pwrlevel/min_clock_mhz/gpu_min_clock在 8e5 上指向同一后端,写一个另两个跟随。
| 节点 | 单位 | 8g3 | 8e5 |
|---|---|---|---|
max_pwrlevel |
档位号 | ✅ | ✅ |
max_gpuclk |
Hz | ✅ | ✅ |
/sys/kernel/gpu/gpu_max_clock |
MHz | ✅ | ✅ |
<kgsl>/devfreq/max_freq |
Hz | ✅ | ❌ 无节点 |
available_frequencies 的 index = pwrlevel。模块会先把频表强制降序归一化(不同 SoC / devfreq 表顺序不保证),再用 num_pwrlevels 做条目数对齐校验。
- 地板:目标频率 → 选择 ≥ 目标的最小档位(如 700 → 720)
- 上限:目标频率 → 选择 ≤ 目标的最大档位(如 400 → 366)
- 保存时写入的是吸附后的值,所以 WebUI 里显示的永远是设备真实档位
- 启动保存系统默认档位(num_pwrlevels-1)
- 退出 / 禁用 / 卸载 / 异常(trap)全部恢复
- 崩溃残留:下次启动自动清理
| 平台 | 档位表(MHz) |
|---|---|
| SM8650 | 903 / 834 / 770 / 720 / 680 / 629 / 578 / 500 / 422 / 366 / 310 / 231 |
| SM8850 (8e5) | 1200 / 1050 / 967 / 902 / 826 / 726 / 646 / 578 / 539 / 500 / 461 / 422 / 382 / 342 / 282 / 222 / 191 / 160 |
| SM8750 | 运行时自动读取 |
- WebUI 档位选择改按档位下标命中,修复"配置值不在频表时静默选中最高频"
- 保存时强制吸附到设备真实档位,写盘值必为可用档位
- 回显生效值 + 档位号;保存后回读;吸附 / 夹取附加提示
- 修复浏览器通道未替换
__MODPATH__(导致config.sh被降级为status.sh) - 频表强制降序归一化 + 与
num_pwrlevels对齐校验(跨 SoC 一致性) - 上限档位高于地板时窗口对齐(等效锁频)
- WebUI 状态卡新增「地板档位」
- 事件驱动游戏识别(
am_proc_start/am_proc_died→state/game_proc),去掉 pidof 轮询 - 保留启动兜底扫描
- WebUI 包名来源统一到
state/game_proc
- 安装期节点探测重构:按实际平台路径探测(复用运行时引擎),8e5 不再误报
- 热路径零 fork 化:内建 read/echo 替代 cat/命令替换,游戏轮询统一 0.3s(实测每轮 73μs)
- 上限护栏同频 0.3s:四路上限节点每轮检测,拉低后 0.3s 内恢复
- 修复:WebUI 页脚版本号 v2.1.0 → v2.1.2
- 修复:启动 banner 版本号与 module.prop 一致(v2.1.2 / versionCode 11)
- 三通道地板接管(min_pwrlevel / devfreq min_freq / kernel gpu_min_clock)
- 上限四路护栏(max_pwrlevel / max_gpuclk / gpu_max_clock / max_freq)
- 游戏运行 1 秒校验 + 写后回读自检
- 修复:节点缺失时可能误写根目录(空变量写保护)
- 修复:proc_monitor 进程树泄漏(重启累积孤儿进程)
- 修复:启动 banner 版本号与 module.prop 不一致
- 8e5 (SM8850) 全节点实测定稿:devfreq 空壳、GMU DCVS 只读,均自动跳过
- 新增上限档位接管(max_pwrlevel)+ WebUI 上限下拉
- 频率表多路径读取(freq / level 双模式)+ 单位归一化
- 重构:min_pwrlevel 档位接管(替代 min_freq 主通道)
- 三平台自适配与安全模式
- WebUI 档位自定义
- 双事件监听(start + died)
- 异常残留自清理
- am_proc_start 事件监听 + 精确匹配
- games.txt 末行无换行修复
- 纯进程检测(前台/后台/小窗一致)
License: MIT
作者: 雨色