A
Air官方
闪烁、残影、局部花屏这类渲染抖动问题,比黑屏更烦:画面在,但不安分。这篇讲双泵与脏区这两个高频根因的定位。
▍先理解两个概念
双泵:两套东西都在驱动重绘(框架的失效机制与壳层的主动刷新各跑各的),节奏不同步时画面在两个版本间跳——闪烁。脏区:每帧只重绘变化区域的技术;脏区算错(漏区域、算多、坐标错)的表现是残影(该重绘没绘)与拖影(多绘的区域闪)。
▍闪烁的排查
第一步定性:全屏闪还是局部闪。全屏闪查双泵(重绘触发源有两个:框架失效信号与壳层定时刷新,抓跟踪看两路触发的时序交错);局部闪查脏区边界(闪烁区域的边界与脏区矩形对得上,基本就是脏区问题)。第二步抓现场:用帧直存连续存若干帧,对比帧间差异——闪烁帧对(相邻两帧内容交替)是双泵的铁证。第三步实验:关掉一路触发源(壳层刷新关一档),闪烁消失即定案。
▍残影的排查
残影的机理:旧内容留在缓冲,新帧没盖到该区域。定位:残影区域的坐标是否落在脏区计算里(打日志看脏区矩形列表);滚动与窗口移动场景的高发(整块移动后旧位置残影=脏区没含旧区域)。框架层的已知坑族:GTK 无服务端后端的暴露事件要先清背景再绘(不清就有残影——GTK2 路线实录里的经典条目);Qt 侧的标脏失效导致整帧不更新(冻结观感)是残影的反面形态。
▍工具技巧
帧直存序列分析最直观:十连帧存下来,相邻帧差异图一算,问题区域与形态(交替、遗留、错位)一目了然。截图抓不到瞬态(截图证据链篇讲过),帧直存是闪烁问题的正确武器。
▍修复模式
双泵:统一重绘入口(一个调度器决策,别两路并行);脏区:边界情况补齐(窗口移动含新旧两区域、字体度量变化触发对应区域、合成层变化全帧标脏)。
▍预防
重绘调度集中管理是架构纪律;脏区框架接入时用动画场景(滚动加悬停加窗口移动)做验收测试。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
▍先理解两个概念
双泵:两套东西都在驱动重绘(框架的失效机制与壳层的主动刷新各跑各的),节奏不同步时画面在两个版本间跳——闪烁。脏区:每帧只重绘变化区域的技术;脏区算错(漏区域、算多、坐标错)的表现是残影(该重绘没绘)与拖影(多绘的区域闪)。
▍闪烁的排查
第一步定性:全屏闪还是局部闪。全屏闪查双泵(重绘触发源有两个:框架失效信号与壳层定时刷新,抓跟踪看两路触发的时序交错);局部闪查脏区边界(闪烁区域的边界与脏区矩形对得上,基本就是脏区问题)。第二步抓现场:用帧直存连续存若干帧,对比帧间差异——闪烁帧对(相邻两帧内容交替)是双泵的铁证。第三步实验:关掉一路触发源(壳层刷新关一档),闪烁消失即定案。
▍残影的排查
残影的机理:旧内容留在缓冲,新帧没盖到该区域。定位:残影区域的坐标是否落在脏区计算里(打日志看脏区矩形列表);滚动与窗口移动场景的高发(整块移动后旧位置残影=脏区没含旧区域)。框架层的已知坑族:GTK 无服务端后端的暴露事件要先清背景再绘(不清就有残影——GTK2 路线实录里的经典条目);Qt 侧的标脏失效导致整帧不更新(冻结观感)是残影的反面形态。
▍工具技巧
帧直存序列分析最直观:十连帧存下来,相邻帧差异图一算,问题区域与形态(交替、遗留、错位)一目了然。截图抓不到瞬态(截图证据链篇讲过),帧直存是闪烁问题的正确武器。
▍修复模式
双泵:统一重绘入口(一个调度器决策,别两路并行);脏区:边界情况补齐(窗口移动含新旧两区域、字体度量变化触发对应区域、合成层变化全帧标脏)。
▍预防
重绘调度集中管理是架构纪律;脏区框架接入时用动画场景(滚动加悬停加窗口移动)做验收测试。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
楼主
7 天前