QML与QWidget的流畅度
简单来说:
QWidget 是 CPU 绘图时代的产物,而 QML(Qt Quick) 是 GPU 绘图时代的产物。
所以在动画、透明效果、缩放、旋转、大量元素移动等场景下,QML 往往比 QWidget 流畅得多。
1. QWidget 是怎么画出来的?
先看 QWidget 的工作方式。
例如:
QPushButton QLabel QTableView QTreeView这些控件都继承自 QWidget。
当窗口需要刷新时:
paintEvent()会被调用。
例如:
void MyWidget::paintEvent(QPaintEvent *) { QPainter p(this); p.drawRect(...); p.drawText(...); p.drawPixmap(...); }流程:
CPU ↓ QPainter绘图 ↓ 生成像素 ↓ 写入内存缓冲区 ↓ 提交给窗口系统 ↓ 显示器本质上:
QWidget = CPU Raster Paint即:
CPU负责画每一个像素2. QWidget 为什么动画容易卡?
假设一个按钮从:
x=0移动到:
x=500动画 60FPS。
每一帧:
清空背景 ↓ 重新画按钮 ↓ 重新画文字 ↓ 重新画边框 ↓ 重新