问题描述
在实现歌词界面向上滑入的动画效果时,发现动画过程中界面显示不全,且存在明显的画面重叠现象。
代码片段
cpp
//初始化上移对象
lrcAnimation = new QPropertyAnimation(lrcPage, "geometry", this);
lrcAnimation->setDuration(250);
lrcAnimation->setStartValue(QRect(10, 10+lrcPage->height(), lrcPage->width(), lrcPage->height()));
lrcAnimation->setEndValue(QRect(10, 10, lrcPage->width(), lrcPage->height()));
现象显示

根本原因分析
最初怀疑是动画时长(250ms)过短导致的渲染问题,但调整时长后问题依旧。
深入排查后发现,真正的原因是窗口阴影效果的性能开销:
| 配置项 | 初始值 | 修改后 |
|---|---|---|
| 阴影模糊半径 (BlurRadius) | 10 | 20 |

当阴影半径从10增大到20时:
- 阴影区域扩大,需要更大的渲染范围
- 阴影效果需要频繁重绘刷新
- 与属性动画(geometry变化)叠加,导致CPU负载激增
- 渲染管线无法及时完成每一帧的绘制,产生画面撕裂和重叠
解决方案
将阴影模糊半径改回较小的值(如10),在视觉效果和性能之间取得平衡:

修改后的现象

经验总结
- Qt的
QGraphicsDropShadowEffect性能开销与模糊半径正相关------半径越大,每帧渲染越耗时 - 动画+特效组合需谨慎------属性动画会触发频繁重绘,叠加复杂特效容易产生性能瓶颈
- 调试时应隔离变量------先排除动画参数(时长、缓动曲线),再检查特效配置