「弱峰调整」升级:三组识别规则 + 滑动条 ±400% 梯度驱动
一、三组识别规则(以波峰 k 为例;L/l = 左相邻波峰/波谷,r/R = 右相邻波谷/波峰; leftMean = (L+l)/2,rightMean = (r+R)/2) - 第一类:v < leftMean 且 v < rightMean(两侧的"相邻峰+相邻谷"均值都要低于) - 第二类:v < leftMean 或 v < rightMean(放宽为"或") - 第三类:v < L 且 v < R(只与左右同类极值比较,最宽松) 波谷把"低于"换成"高于"、min/max 互换。三组不是包含关系(第三类不蕴含第二类), 因此确实存在"只满足第三类"的点。 二、梯度驱动(滑动条 |a| ∈ [0,400%];每组自身仍是 ±200%) 0–100% :只有第一类在动(0–100%) 100–200% :第一类 100–200%,第二类开始 0–100% 200–300% :第一类到上限,第二类 100–200%,第三类开始 0–100% 300–400% :前两类到上限,第三类 100–200% 负值完全对称。实现:first = sign*min(|a|,2)、second = sign*clamp(|a|-1,0,2)、 third = sign*clamp(|a|-2,0,2);某点同时满足多组时取幅度绝对值最大的一组(= 最严格的那组)。 三、每组自身的目标值映射(±200%) 0 – +100% :当前值 → 左右同类极值中较温和的一侧(波峰取较低者、波谷取较高者) +100 – +200%:该侧 → 左右同类极值的均值(不再是"较大的那个") 0 – -100% :当前值 → 相邻异类极值中较近的一个(波峰取较高的波谷、波谷取较低的波峰) -100 – -200%:该侧 → 相邻异类极值的均值(不再是"最小的那个") 负幅度的"不得反向增强"夹取保持不变;相邻极值之间的 smoothstep 平滑偏移逐字未改。 四、界面 滑动条量程 -400% – +400%(0 在正中间,kWeakPeakSliderScale = 4.0);数值列按 "+400%" 取宽; 右侧数值始终带符号。 五、验证(全部离屏,不占用鼠标/键盘/屏幕) - uitest 463/463:第一类点(弱峰 520、相邻峰 620/640)0/50/100/150/200% → 520/570/620/625/630; 弱谷 580 → 580/540/500/500/500,负值 590/600/605/610; 只满足第二类的峰 130:100% 不动、150/200/250/300/400% → 140/150/162.5/175/175; 负值 -100% 不动、-150/-200/-250/-300% → 115/100/97.5/95; 只满足第三类的峰 195:200% 不动、250/300/400% → 197.5/200/200; 第一类点 200% 已达上限(400% 不再变化);±400% 夹取;默认 0%;滑块中间 = 0%、 两端 = ±400%、轨道 3/4 处 ≈ +200%。 - [Y] 端到端:合成 ripple 弱峰区间 20 → 70(50% 幅度,健康 120)。 - panperf PASS;layercheck clobbers=0/24、pan frames wrong=0/4;cursorcheck 30/30; dragcheck 0 绘制错误;make clean && make all 零警告。
This commit is contained in:
1 parent
14b60f5d9e
commit
59a84ba126
6 files changed
+217
-111
No files matched your search
@@ -516,6 +516,7 @@ Documents/ 项目文档(含本文件)
|
||||
| 2026-10-12 | DeepSeek-V4.1-Flash(**起源设备**) | **修复"深放大下左右平移流畅、上下/斜向平移卡顿"(用户猜测:上下没有预渲染机制——已证实)与"深放大时拖拽光标跑飞"**。① 量化复现:`panperf` 新增纯竖直拖拽 + 逐帧统计**图层重画次数**,并在 5 网格全开 4 类悬浮面板(20 个)后对比 —— 竖直拖拽中位 **166.6ms/帧**、水平 **37.7ms/帧**(4.4 倍差距,用户报告的"上下卡顿"正是它)。② 主因是**面板像素图层被幅值范围击穿**:`PanelGlobalKey()` 计入 `visual.yMin/yMax`,平移的纵向分量每帧小改幅值 → 整层 20 个面板每帧重画(去掉后 166.6→**24.8ms**);次因是**图层没有纵向预渲染余量**(幅值一变就整块重画,实测 40 帧里 40 次 → 修复后 **1 次**)。③ 修法:`LaneLayer` 增加 `marginY/anchorYMax/pxPerValue`,幅值范围按**像素行**精确扩展(上下各半个网格高)、贴图时按 `(anchorYMax - 当前 yMax) * pxPerValue` 取纵向偏移,图层指纹只计幅值**跨度**不计绝对范围;幅值刻度改以**前台可见网格**的跨度/高度取 `NiceStep`(保证与整幅渲染逐像素同源);网格分界线移出图层(改由宽基底路径的 `PaintLaneDividers()` 补画,否则纵向偏移会把它带走)。④ 光标:深放大下平移会把时间光标甩到视界外很远(像"跑飞/丢失")—— 新增 `ClampCursorsAfterPan()`,在**平移**(中键/左键拖拽、Shift+滚轮、方向键)之后夹取;**离散**的视图变化(选区放大/适应视图/按网格时间轴展开)仍然不移动光标;抓取被钉在边缘的光标读数时不再沿用抓取偏移(否则首帧会跳到视界外再被夹回边缘)。验证:`uitest` **432/432**(新增 `[AI]`:贴边读数抓取后光标落在鼠标处误差 0.0px、中键平移 1.5 屏 0 帧出界且跟手)、`panperf` 竖直 3.8~5.0ms(40 帧仅 1 次图层重画)、水平 6.5ms 持平、`layercheck` 0 视界覆盖、新增探针 `.preflight/cursorcheck` 30/30。 |
|
||||
| 2026-10-12 | DeepSeek-V4.1-Flash(**起源设备**) | **修复"纵向预渲染带出的绘制异常/抽搐"(中键上下拖动、尤其拖到网格之外时),并把「弱峰增强」升级为「弱峰调整」(幅度 -200% – +200%,负值削弱)**。① 绘制异常根因:上一轮给图层加了纵向余量,但"偏移超出余量"仍走**排队整块重画**(一帧只补 1 个网格)→ 重画完成前 `BlitWideBuffer` 只能贴出部分行、**其余留空**(网格内出现空白条带),且重画与贴图的锚点不同源 = "波形没按预期移动";鼠标拖到网格外很远时每帧都触发 → 抽搐。修法:与横向**同构的纵向滚动**(BitBlt 整块滚动 + 只补画暴露的一整条,`anchorYMax -= roll/pxPerValue`),并且**必须先于横向补条**;滚动量**量化**(`kLayerRollQuantum = 16` 像素,不足量子交给贴图 `srcY` 偏移)以保持画布映射稳定、让折线缓存命中(未量化时每帧滚 1~30 行 → 折线每帧重算)。验证:`panperf` 拖出网格 900px 时被拖网格的**空白行数与整幅重绘逐帧一致**(64 vs 64,即无空白条带),竖直拖拽 16 帧仅 2 次图层重画。② 弱峰调整:`ComputeWeakPeakAdjust`(原 `ComputeWeakPeakBoost`)+ `WeakPeakItem.amountPercent`(-200–200,默认 150),面板「增强等级 %」→「调整幅度 %」、滑块量程 -200%–+200%(**0 在正中间**)、数值列加宽以容纳 "-200%";识别规则与旧实现完全一致,正幅度段与旧实现**逐位相同**,负幅度段改为以相邻**异类**极值(波峰看相邻波谷)为参照:-100% 拉到**较近**的那个、-200% 拉到较远的那个(压平/抹除,左右平滑过渡),且**不得反向增强**。离屏验证:`uitest` **443/443**(正幅度 0/50/100/150/200% → 550/555/560/580/600 逐位保持;负幅度 -50/-100/-200% → 峰 500/450/400、谷 500/550/560;超范围夹取;健康峰不动)、`panperf`/`layercheck`/`cursorcheck` 全过。 |
|
||||
| 2026-10-12 | DeepSeek-V4.1-Flash(**起源设备**) | **修复"上下拖动之后,左右/上下/斜向拖动都出现绘制错误"(真因:图层条带渲染时 GDI 网格线没被限制在条带内),并调整「弱峰调整」的弱峰/弱谷定义、默认幅度与数值符号显示**。① 根因:`PaintLane` 的 GDI 网格线裁剪矩形只限制了横向(`RectF(m_area.X, clipTop, m_area.Width, …)`),而**纵向补条是全宽 × 窄 y** —— GDI 绘制不受 GDI+ 裁剪约束,于是横向网格线被画到条带之外的已正确像素上、**覆盖在波形之上**,并**永久烘进图层**,随后每次平移都带着它一起漂移(用户看到"到处都有绘制错误")。修法:`laneClip = IntersectRect(m_area, 网格可见矩形)` 同时用于 `SetClip` 与 GDI 裁剪。② 新增离屏探针 `.preflight/dragcheck`(真文件 + 真中键拖拽消息:先上拖半个网格高,再左右/上下/斜向、最后拖出窗口;每帧把图层画布的有效条带与"同一 `wideMin` 的新渲染画布"逐像素比较):修复前被拖网格整行不一致(2410px ≈ 2 行全宽),修复后 ≤171px(仅补条边界的抗锯齿边缘)。③ 弱峰调整:**「是否偏弱」改为**"波峰必须同时低于左右两侧各自的(相邻波峰+相邻波谷)均值;波谷反之";默认幅度 **0%**(不改动);滑块右侧数值**始终带符号**(`+150%` / `-150%` / `0%`,验证 +150% 与 -150% 墨迹宽度一致且都比 `0%` 宽 ≥8px)。验证:`uitest` **441/441**、`dragcheck`/`panperf`/`layercheck`/`cursorcheck` 全过、`make clean && make all` 零警告。 |
|
||||
| 2026-10-12 | DeepSeek-V4.1-Flash(**起源设备**) | **「弱峰调整」升级为三组识别规则 + 滑动条 ±400% 梯度驱动**:第一类(两侧均值都要满足,原规则)在滑动条 0–200% 内走完自身 0–200%;第二类("或":任一侧均值满足即可)从 100% 起参与,own 幅度 = clamp(|a|-100%,0,200%);第三类(只与左右同类极值比较,最宽松)从 200% 起参与,own 幅度 = clamp(|a|-200%,0,200%);负值完全对称。每组自身的 ±200% 映射统一为:+100% → 左右同类极值中较温和的一侧、**+200% → 左右同类极值的均值**(不再取较大的那个);-100% → 相邻异类极值中较近的一个、**-200% → 相邻异类极值的均值**(不再取最小的那个)。同时满足多组时取**幅度绝对值最大**的组。验证:`uitest` **463/463**(第一类点 0/50/100/150/200% → 520/570/620/**625/630**;只满足第二类的峰 130 → 100% 不动、150%/200%/250%/300%/400% = 140/150/162.5/175/175;只满足第三类的峰 195 → 200% 不动、250%/300%/400% = 197.5/200/200;±400% 夹取;滑块中间 = 0%、两端 = ±400%)、`panperf`/`layercheck`/`cursorcheck`/`dragcheck` 全过、零警告。 |
|
||||
|
||||
---
|
||||
|
||||
@@ -2763,3 +2764,59 @@ Documents/ 项目文档(含本文件)
|
||||
- `uitest` **441/441**:`[X]` 正幅度 0/50/100/150/200% → 峰 520/570/620/630/640、弱谷 580/540/500/500/500;负幅度 -50/-100/-200% → 峰 510/500/500、谷 590/600/620;超范围夹取、"未反向增强"(极值点)、健康段逐位不变、30% 幅度下 N=1/2/3/10 → 550/571/571/571(收敛)、默认 0%、滑块中间 = 0%、两端 = ±200%、数值带符号。
|
||||
- `[Y]` 端到端:合成 ripple(谷恒 500、一个弱峰 520)弱峰区间 **20 → 70**(健康 120)。
|
||||
- `dragcheck` PASS(0 绘制错误);`panperf` 竖直中位 5.1ms、水平 7.1ms、面板全开竖直 25.0ms / 水平 41.3ms;`layercheck` `clobbers=0/24`、`pan frames wrong=0/4`;`cursorcheck` 30/30;`make clean && make all` 零警告。
|
||||
|
||||
---
|
||||
|
||||
## 本轮(2026-10-12,起源设备):「弱峰调整」三组识别规则 + 滑动条 ±400% 梯度驱动
|
||||
|
||||
用户要求:滑动条量程扩到 **±400%**,并按"梯度"同时驱动**三组识别规则不同的点**;每组的 ±200% 映射里,±200% 的落点由"较极端的那一个邻居"改成"两个邻居的均值"。
|
||||
|
||||
### A. 三组识别规则(以波峰 k 为例;`L`/`l` = 左相邻波峰/波谷,`r`/`R` = 右相邻波谷/波峰)
|
||||
|
||||
令 `leftMean = (L+l)/2`、`rightMean = (r+R)/2`:
|
||||
|
||||
| 组 | 规则 | 一句话 |
|
||||
| --- | --- | --- |
|
||||
| 第一类 | `v < leftMean` **且** `v < rightMean` | 两侧的"相邻峰+相邻谷"均值都要低于 |
|
||||
| 第二类 | `v < leftMean` **或** `v < rightMean` | 任一侧满足即可(从"且"放宽为"或")|
|
||||
| 第三类 | `v < L` **且** `v < R` | 只与左右**同类**极值比较(最宽松)|
|
||||
|
||||
波谷把"低于"换成"高于"、min/max 互换。⚠️ 三组**不是包含关系**:`v < min(L,R)` 并不蕴含 `v < max(leftMean,rightMean)`(因为 `leftMean < L`、`rightMean < R`),所以确实存在"只满足第三类"的点。
|
||||
|
||||
### B. 梯度驱动(滑动条 |a| ∈ [0, 400%])
|
||||
|
||||
| 滑动条 | 第一类 | 第二类 | 第三类 |
|
||||
| --- | --- | --- | --- |
|
||||
| 0 – 100% | 0 – 100% | — | — |
|
||||
| 100 – 200% | 100 – 200% | 0 – 100% | — |
|
||||
| 200 – 300% | 200%(上限) | 100 – 200% | 0 – 100% |
|
||||
| 300 – 400% | 200%(上限) | 200%(上限) | 100 – 200% |
|
||||
|
||||
实现(`a` = 百分比/100):`first = sign*min(|a|,2)`、`second = sign*clamp(|a|-1,0,2)`、`third = sign*clamp(|a|-2,0,2)`。某个极值同时满足多组时取**幅度绝对值最大**的一组(= 最严格的那组)。
|
||||
|
||||
### C. 每一组自身的目标值映射(±200%)
|
||||
|
||||
- `0 – +100%`:当前值 → 左右**同类**极值中**较温和**的一侧(波峰取较低者、波谷取较高者);
|
||||
- `+100 – +200%`:该侧 → 左右同类极值的**均值**(原先取"较大的那个");
|
||||
- `0 – -100%`:当前值 → 相邻**异类**极值中**较近**的一个(波峰取较高的波谷、波谷取较低的波峰);
|
||||
- `-100 – -200%`:该侧 → 相邻异类极值的**均值**(原先取"最小的那个")。
|
||||
|
||||
⚠️ 削弱的"不得反向增强"夹取保持不变;⚠️ 平滑偏移(相邻极值之间的 smoothstep)**逐字未改**,因此负幅度下相邻极值一压一抬时,两者之间的**中间采样点可能越过中值线**(正常现象,只能在**极值点**上断言"未反向增强")。
|
||||
|
||||
### D. 界面
|
||||
|
||||
滑动条量程 → **-400% – +400%**(0 在正中间,`kWeakPeakSliderScale = 4.0`);数值列按 `"+400%"` 取宽;右侧数值**始终带符号**(`+400%` / `-400%` / `0%`)。
|
||||
|
||||
### E. 验证(全部离屏,不占用鼠标/键盘/屏幕)
|
||||
|
||||
- `uitest` **463/463**:
|
||||
* 第一类点(弱峰 520、相邻峰 620/640):0/50/100/150/200% → 520/570/620/**625/630**;
|
||||
弱谷 580(相邻谷 500/500、相邻峰 620/600):580/540/500/500/500,负值 590/600/**605/610**。
|
||||
* **只满足第二类**的峰 130(相邻峰 200/150、相邻谷 100/90 → 侧均值 150/120):
|
||||
100% 不动;150/200/250/300/400% → 140/150/162.5/175/175;
|
||||
负值 -100% 不动;-150/-200/-250/-300% → 115/100/97.5/95。
|
||||
* **只满足第三类**的峰 195(两个 200 峰之间,侧均值为 150):200% 不动;250/300/400% → 197.5/200/200。
|
||||
* 第一类点在 200% 已达自身上限(400% 不再变化);±400% 夹取;默认 0%;滑块中间 = 0%、两端 = ±400%、
|
||||
轨道 3/4 处 ≈ +200%(第一类上限)。
|
||||
- `[Y]` 端到端:合成 ripple(谷恒 500、一个弱峰 520)在 50% 幅度下弱峰区间 20 → 70(健康 120)。
|
||||
- `panperf` PASS、`layercheck` `clobbers=0/24`+`pan frames wrong=0/4`、`cursorcheck` 30/30、 `dragcheck` 0 绘制错误;`make clean && make all` 零警告。
|
||||
Reference in new issue
Block a user