Qt提升绘制效率,绘制加速。

news2024/12/23 13:55:02

在我们绘制一些复杂逻辑且数据量巨大的图形时,经常会出现流畅性问题,本文就是来进行讲解如何提升绘制效率的。
实现思路:
场景1:我们绘制多个静态图形和绘制一张图片哪个更快。很明显绘制多个图形的时候要慢很多。所以我们将多个图形变成一张图片就能实现加速。
绘制10000个圆:

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    QRect imgrect(0,0,rect().width()/2,rect().height()/2);
    p.setBrush(Qt::red);

    for (int i = 0; i < 10000; ++i) {
        p.drawEllipse(imgrect.width()/4,imgrect.height()/4,imgrect.width()/2,imgrect.height()/2);
    }
}

cpu占用在20%以上。
在这里插入图片描述
将10000个圆变成一张图片:

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    resize(600,600);
    drawImg();    
}
void Widget::drawImg()
{
    QImage img(rect().width()/2,rect().height()/2,QImage::Format_ARGB32);
    QPainter p(&img);
    p.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);
    //填充背景,如果不做填充则会出现背景显示问题。
    img.fill(QColor("#300000ff"));

    p.setBrush(Qt::red);
    for (int i = 0; i < 10000; ++i) {
        p.drawEllipse(img.width()/4,img.height()/4,img.width()/2,img.height()/2);
    }

    p.end();

    _img = img;
}
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawImage(QRect( rect().width()/4,rect().height()/4,rect().width()/2,rect().height()/2 ),_img);
}

cpu占用不到1%。
在这里插入图片描述

场景2:绘制多个动态图形和将多个动态图形变成多张图片,效率还会有提升吗?
绘制1000个动态图形。

void Widget::timerEvent(QTimerEvent *event)
{
    _index++;
    update();
}
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    QRect imgrect(0,0,rect().width()/2,rect().height()/2);
    p.setBrush(Qt::red);

    for (int i = 0; i < 10000; ++i) {
        p.drawPie(imgrect.width()/4,imgrect.height()/4,imgrect.width()/2,imgrect.height()/2,0,_index*16);
    }
}

cpu占用10%~20%左右。
请添加图片描述

将1000个动态图形绘制成多张图片。

void Widget::timerEvent(QTimerEvent *event)
{
    _index++;
        drawImg();
    update();
}
void Widget::drawImg()
{
    QImage img(rect().width()/2,rect().height()/2,QImage::Format_ARGB32);
    QPainter p(&img);
    p.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);
    //填充背景,如果不做填充则会出现背景显示问题。
    img.fill(QColor("#300000ff"));

    p.setBrush(Qt::red);
    for (int i = 0; i < 1000; ++i) {
        p.drawPie(img.width()/4,img.height()/4,img.width()/2,img.height()/2,0,_index*16);
    }

    p.end();

    _img = img;
}
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawImage(QRect( rect().width()/4,rect().height()/4,rect().width()/2,rect().height()/2 ),_img);
}

似乎没有什么提升。
请添加图片描述

但是将多个动态图形绘制成一张图片,我们可以控制图片生成速度来减少cpu。

void Widget::timerEvent(QTimerEvent *event)
{
    _index++;
    if (_index % 2 == 0)
        drawImg();
    update();
}

void Widget::drawImg()
{
    QImage img(rect().width()/2,rect().height()/2,QImage::Format_ARGB32);
    QPainter p(&img);
    p.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);
    //填充背景,如果不做填充则会出现背景显示问题。
    img.fill(QColor("#300000ff"));

    p.setBrush(Qt::red);
    for (int i = 0; i < 1000; ++i) {
        p.drawPie(img.width()/4,img.height()/4,img.width()/2,img.height()/2,0,_index*16);
    }

    p.end();

    _img = img;
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawImage(QRect( rect().width()/4,rect().height()/4,rect().width()/2,rect().height()/2 ),_img);
}

控制图片生成速度后,cpu明显降低。
请添加图片描述
通过以上两个场景,得出结论,不管是绘制多个或者逻辑复杂的静态图形还是绘制多个动态图形时,都可以通过生成图片的形式来提升绘制效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web漏洞分析-文件解析及上传(上)

随着互联网的迅速发展&#xff0c;网络安全问题变得日益复杂&#xff0c;而文件解析及上传漏洞成为攻击者们频繁攻击的热点之一。本文将深入研究文件解析及上传漏洞&#xff0c;通过对文件上传、Web容器IIS、命令执行、Nginx文件解析漏洞以及公猫任意文件上传等方面的细致分析&…

* demo、源码、桌面端软件

demo demohttps://bidding-m.gitee.io/maptalks-test-next/#/ 源码 源码https://gitee.com/bidding-M/maptalks-test-next 桌面端 桌面端https://gitee.com/bidding-M/map-collection/blob/master/apps/maptalks-win-0.0.1-x64.exe

中洺科技-数据标注创就业浪潮

平凡的事不能普通的做那么就有所不同。这也是我们在这波新的AI浪潮中做副业、创业时应该思考的。 正如一些业内从业者所说&#xff0c;数据标注行业本身的利润其实非常有限。如果现在招聘专职数据标注人员的成本太高&#xff0c;只做标注项目的公司就太难立足了&#xff0c;数据…

微信小程序(一) —— 常见组件

文章目录 &#x1f380;项目基本组成结构&#x1f4e2;常见的视图容器类组件viewscroll-viewswiper和swiper-item使用viewscroll-viewswiper和swiper-itemswiper标签属性 &#x1f336;️常用的基础内容组件textrich-text &#x1f4ee;其他常用组件buttonimagenavigator &…

简易的JS逆向解码

在实战的漏洞挖掘中阅读JS有以下几个作用&#xff1a; 1.JS中存在插件名字&#xff0c;根据插件找到相应的漏洞直接使用 通过控制台大致阅读网站JS代码发现此网页引用了北京的一家公司的代码&#xff0c;并且使用了h-net的框架&#xff0c;接下来我们可以百度这家公司或者是这…

基于C/C++的rapidxml加载xml大文件 - 上部分翻译

RAPIDXML手册 版本 1.13 版权所有 &#xff08;C&#xff09; 2006&#xff0c; 2009 Marcin Kalicinski有关许可证信息&#xff0c;请参阅随附的文件许可证 .txt。 目录 1. 什么是 RapidXml&#xff1f; 1.1 依赖性和兼容性1.2 字符类型和编码1.3 错误处理1.4 内存分配1.5 …

HTML---基础

文章目录 目录 文章目录 前言 一.HTML概述 二.HTML相关概念 HTML作用域 HTML标签 HTML转译字符 总结 前言 一.HTML概述 HTML&#xff08;超文本标记语言&#xff09;是一种用于创建网络页面的标记语言。它以标记的形式编写&#xff0c;该标记描述了文档的结构和内容。HTML…

黑苹果之网卡篇

今天主要来聊一下黑苹果如何选择网卡 黑苹果对硬件的要求比较局限&#xff0c;可以用的无线网卡也比较少&#xff0c;而且很多也已经涨价&#xff0c;这里就结合自己的使用经验&#xff0c;简单分享几款比较好用的黑苹果无线网卡方案。 一、BCM94360系列 如果想要稳定、省心&am…

【K8S 系列】认识k8s、k8s架构

一、什么是k8s? Kubernetes 简称 k8s&#xff0c;是支持云原生部署的一个平台&#xff0c;k8s 本质上就是用来简化微服务的开发和部署的&#xff0c;用于自动化部署、扩展和管理容器化应用的开源容器编排技术。对于传统的docker其实也提供了容器编排的技术docker-compose&…

gdb本地调试版本移植至ARM-Linux系统

移植ncurses库 本文使用的ncurses版本为ncurses-5.9.tar.gz 下载地址&#xff1a;https://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz 1. 将ncurses压缩包拷贝至Linux主机或使用wget命令下载并解压 tar-zxvf ncurses-5.9.tar.gz 2. 解压后进入到ncurses-5.9目录…

【人工智能Ⅰ】实验8:DBSCAN聚类实验

实验8 DBSCAN聚类实验 一、实验目的 学习DBSCAN算法基本原理&#xff0c;掌握算法针对不同形式数据如何进行模型输入&#xff0c;并结合可视化工具对最终聚类结果开展分析。 二、实验内容 1&#xff1a;使用DBSCAN算法对iris数据集进行聚类算法应用。 2&#xff1a;使用DBS…

论文阅读——GroupViT

GroupViT: Semantic Segmentation Emerges from Text Supervision 一、思想 把Transformer层分为多个组阶段grouping stages&#xff0c;每个stage通过自注意力机制学习一组tokens&#xff0c;然后使用学习到的组tokens通过分组模块Grouping Block融合相似的图片tokens。通过这…

CSPNet: A New Backbone that can Enhance Learning Capability of CNN(2019)

文章目录 -Abstract1 Introduction2 Related workformer work 3 Method3.1 Cross Stage Partial Network3.2 Exact Fusion Model 4 Experiments5 Conclusion 原文链接 源代码 - 梯度信息重用&#xff08;有别于冗余的梯度信息&#xff09;可以减少计算量和内存占用提高效率&am…

二、结合各种图形库实现各种demo(11-20)

demo地址https://bidding-m.gitee.io/maptalks-test-next/#/ 11、isects 12、right click menu 13、infoWindow 14、image marker 15、multi image marker 16、vector-marker-fill 17、line-gradient-arrow 18、rotated-marker-with-line 19、smoothness-line 20、polygon 欢迎…

“集爱三湘 传递温情”旺旺送温暖公益活动在开福东风路街道办举行

&#xff08;通讯员&#xff1a;吴康&#xff09;用真情传递爱的力量&#xff0c;用行动践行善的约定。12月12日上午&#xff0c;湖南大旺食品有限公司长沙分公司联合湖南省朝阳公益基金会在开福区东风路街道办举行“集爱三湘 传递温情”旺旺送温暖活动&#xff0c;旨在扎实做好…

链表基础知识(一、单链表)

一、链表表示和实现 顺序表的问题及思考 问题&#xff1a; 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当…

Live800:客服5大场景高满意度话术有这些

客服作为企业与消费者之间的桥梁&#xff0c;其服务质量往往直接影响到消费者对企业的印象和忠诚度。因此&#xff0c;提高客服满意度一直是企业所关注的重要问题。那么&#xff0c;客服在哪些场景下能够让消费者感到满意呢&#xff1f;今天&#xff0c;我们就来探讨一下客服5大…

MySQL笔记-第11章_数据处理之增删改

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第11章_数据处理之增删改1. 插入数据1.1 实际问题1.2 方式1&#xff1a;VALUES的方式添加1.3 方式2&#xff1a;将查询结果插入到表中 2. 更…

【Web】一张动图告诉你,输入网址之后,发生了什么事情?

让我们一步一步地来看这个过程。 步骤1&#xff1a; 用户在浏览器中输入一个URL&#xff08;比如www.csdn.net&#xff09;&#xff0c;然后按下回车键。首先&#xff0c;我们需要将这个URL转换成一个IP地址。通常&#xff0c;这个映射关系会被存储在缓存中&#xff0c;因此浏…

Linux基本操作指令

哈喽小伙伴们&#xff0c;从这篇文章开始&#xff0c;在学习数据结构的同时&#xff0c;我们开启一个新的篇章——Linux操作系统的学习&#xff0c;这将会是又一个新的开始&#xff0c;希望小伙伴们能够认真细心&#xff0c;不要掉队哦。 目录 一.什么是Linux 二.为什么要学习…