派生的QPainterPath,QPainter性能迅速下降
Derived QPainterPath, QPainter performance degrading quickly
我目前正在尝试将我的QPainter对象封装到可重用的类中,可能相互派生。这使他们能够以任何他们喜欢的方式改变画家,有自己的孩子画画等:
我有DrawArc
从QPainterPath
衍生出来的
DrawArc::DrawArc() : QPainterPath()
{}
void DrawArc::paint(QPainter* painter)
{
painter->save();
//...
arcTo(/*...*/);
lineTo(/*...*/);
painter->translate(QPoint(100,100));
painter->drawPath(*dynamic_cast<QPainterPath*>(this));
painter->restore();
}
以及源自DrawArc
的DrawBeam
DrawBeam::DrawBeam() : DrawArc()
{}
void DrawBeam::paint(QPainter* painter)
{
painter->save();
//...
painter->setPen(QPen(color, 4));
painter->setBrush(brush);
DrawArc::paint(painter);
painter->restore();
}
在实际的小部件中,我正在执行以下操作
BeamWidget::BeamWidget(QWidget* parent) : QWidget(parent)
{
DrawBeam* mybeam = new DrawBeam();
}
void BeamWidget::paintEvent(QPaintEvent * /* event */)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
mybeam->paint(&painter);
}
但是,我在几秒钟(或几百次重绘)后看到painter->drawPath(*dynamic_cast<QPainterPath*>(this));
性能急剧下降。其余过程中的其他所有内容似乎都运行良好,但是当我启用该行时,性能会迅速下降。
此外,从DrawArc
绘画衍生的所有元素似乎有时会失去其 QBrush 风格,即使设置了setAutoFillBackground(true);
仍然可见......
我发现这与我只创建一次对象有关,然后在每次运行paint()
期间向其添加arcTo
和其他几行。由于我无法刷新 QPainterPath,因此路径只会变得越来越长,越来越长。
这就解释了为什么旧线没有被刷新以及为什么画笔是交替的(每次我重新绘制同样的东西时,我都会与路径本身形成一个新的交点,而根据设计,没有被填充)。
我像这样修复它:
void DrawArc::paint(QPainter* painter)
{
painter->save();
//...
QPainterPath path = QPainterPath(*this);
path.arcTo(/*...*/);
path.lineTo(/*...*/);
painter->translate(QPoint(100,100));
painter->drawPath(path);
painter->restore();
}
因此,在每个绘图操作中,我都会创建当前路径的副本,将所需的所有线条添加到其中并绘制该行。退出paint
后,该绘制的路径将被丢弃。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 派生的QPainterPath,QPainter性能迅速下降