当前位置: 首页 > wzjs >正文

山东苹果网站建设方案软文广告成功案例

山东苹果网站建设方案,软文广告成功案例,马卡龙网站建设方案,保定网站建设双缓冲 1.双缓冲原理 单缓冲:在paintEvent中直接绘制到屏幕,绘制过程被用户看到 双缓冲:先在redrawBuffer绘制到缓冲区,然后一次性显示完整结果 代码结构 单缓冲:所有绘制逻辑在paintEvent中 双缓冲:绘制…

双缓冲

1.双缓冲原理

单缓冲:在paintEvent中直接绘制到屏幕,绘制过程被用户看到
双缓冲:先在redrawBuffer绘制到缓冲区,然后一次性显示完整结果
代码结构
单缓冲:所有绘制逻辑在paintEvent中
双缓冲:绘制逻辑分离到redrawBuffer,paintEvent仅负责显示缓冲区
性能影响
单缓冲:每次更新需要重复计算和绘制
双缓冲:可以优化为只在必要时重绘缓冲区(如数据变化时)

减少的时间是重绘的那部分时间,单缓冲是逐个绘制,双缓冲是整体绘制。

测试案例

1.Qt 实现绘制 5000 个小球移动,单缓冲和双缓冲效果对比

双缓冲和单缓冲效果对比

2.代码

关键代码对比:
单缓冲绘制: paintEvent 中通过 painter 绘制每一个 circle,一次 paintEvent 绘制 5000 次
双缓冲绘制: paintEvent 中直接绘制提前赋好像素值的成员变量 buffer 中的像素

doublebufferwidget.h

#include <QWidget>
#include <QPainter>
#include <QTimer>
#include <QPixmap>
#include <QPointF>
#include <QVector>
#include <cmath>
#include <QTime>
#include <QDebug>class DoubleBufferWidget : public QWidget {Q_OBJECT
public:DoubleBufferWidget(QWidget *parent = nullptr) : QWidget(parent) {// 初始化缓冲区setWindowTitle("DoubleBuffer");buffer = QPixmap(size());buffer.fill(Qt::white);// 初始化动画数据for (int i = 0; i < 5000; ++i) {circles.append({QPointF(rand() % width(), rand() % height()),5.f + rand() % 10,QColor(rand() % 256, rand() % 256, rand() % 256),QPointF((rand() % 100 - 50) / 100.0, (rand() % 100 - 50) / 100.0)});}// 设置定时器更新动画QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &DoubleBufferWidget::updateAnimation);timer->start(16);}void resizeEvent(QResizeEvent *event) override {buffer = QPixmap(size());buffer.fill(Qt::white);QWidget::resizeEvent(event);}void paintEvent(QPaintEvent *event) override {QTime doublePaint;doublePaint.start();Q_UNUSED(event);QPainter painter(this);painter.drawPixmap(0, 0, buffer);qInfo() << "void paintEvent(QPaintEvent *event) doublePaint cost times:" << doublePaint.elapsed() << "ms";}private slots:void updateAnimation() {// 更新所有圆形位置for (auto &circle : circles) {circle.pos += circle.velocity;if (circle.pos.x() - circle.radius < 0 || circle.pos.x() + circle.radius > width())circle.velocity.setX(-circle.velocity.x());if (circle.pos.y() - circle.radius < 0 || circle.pos.y() + circle.radius > height())circle.velocity.setY(-circle.velocity.y());}// 重新绘制到缓冲区redrawBuffer();update();}private:struct Circle {QPointF pos;qreal radius;QColor color;QPointF velocity;};QPixmap buffer;QVector<Circle> circles;void redrawBuffer() {buffer.fill(Qt::white);QPainter bufferPainter(&buffer);bufferPainter.setRenderHint(QPainter::Antialiasing);// 模拟长时间绘制过程for (int i = 0; i < 1000; ++i) {double temp = std::sin(i);Q_UNUSED(temp);}// 绘制所有圆形for (const auto &circle : circles) {bufferPainter.setPen(Qt::NoPen);bufferPainter.setBrush(circle.color);bufferPainter.drawEllipse(circle.pos, circle.radius, circle.radius);}}
};

singlebufferwidget.h

#include <QWidget>
#include <QTime>
#include <QPainter>
#include <QTimer>
#include <math.h>
#include <qmath.h>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class SingleBufferWidget; }
QT_END_NAMESPACEclass SingleBufferWidget : public QWidget {Q_OBJECT
public:SingleBufferWidget(QWidget *parent = nullptr) : QWidget(parent) {// 初始化动画数据for (int i = 0; i < 5000; ++i) {circles.append({QPointF(rand() % width(), rand() % height()),5.f + rand() % 10,QColor(rand() % 256, rand() % 256, rand() % 256),QPointF((rand() % 100 - 50) / 100.0, (rand() % 100 - 50) / 100.0)});}// 设置定时器更新动画QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &SingleBufferWidget::updateAnimation);timer->start(16);}void paintEvent(QPaintEvent *event) override {QTime SingpaintTimer;SingpaintTimer.start();Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 模拟长时间绘制过程for (int i = 0; i < 1000; ++i) {// 这个循环会延长绘制时间,加剧闪烁现象double temp = std::sin(i);Q_UNUSED(temp);}// 绘制所有圆形for (const auto &circle : circles) {painter.setPen(Qt::NoPen);painter.setBrush(circle.color);painter.drawEllipse(circle.pos, circle.radius, circle.radius);}qInfo() << "void paintEvent(QPaintEvent *event) SingpaintTimer cost times:" << SingpaintTimer.elapsed() << "ms";}private slots:void updateAnimation() {// 更新所有圆形位置for (auto &circle : circles) {circle.pos += circle.velocity;if (circle.pos.x() - circle.radius < 0 || circle.pos.x() + circle.radius > width())circle.velocity.setX(-circle.velocity.x());if (circle.pos.y() - circle.radius < 0 || circle.pos.y() + circle.radius > height())circle.velocity.setY(-circle.velocity.y());}update();}private:struct Circle {QPointF pos;qreal radius;QColor color;QPointF velocity;};QVector<Circle> circles;
};

3.工程文件资源

http://www.dtcms.com/wzjs/218679.html

相关文章:

  • 在国外做网站618网络营销策划方案
  • 青岛开发区网站建设哪家好seo线下培训班
  • 营销型网站开发定制什么平台可以推销自己的产品
  • 上海三凯建设管理咨询有限公司网站北京正规seo搜索引擎优化价格
  • wordpress建站网页无法运做网站的软件
  • 山东淄博微信网站制作百度关键词排名查询工具
  • 怎么创建自己的博客网站nba最新交易消息
  • 网站开发工程师月薪平均站长之家seo工具包
  • 深圳装修公司电话号码大全宁波seo网站排名
  • 河南专业网站建设哪家好百度推广步骤
  • 和县建设局网站新闻头条今日新闻
  • 网站域名 代办江苏seo外包
  • jsp动态网站开发考试网络推广公司排名
  • 做百度竞价什么网站好平台推广策略都有哪些
  • 房产信息网网站网站页面怎么优化
  • wordpress 网站图标设置天津百度关键词推广公司
  • 免费域名的类型杭州seo网站推广
  • 重庆光龙网站建设广告推广平台赚取佣金
  • 移动端开发语言搜索引擎优化的策略主要有
  • 360未经证实的网站如何做seo网站关键词优化报价
  • 如何将公司网站做的更好看怎样推广公司的网站
  • 重庆网站建设师最近韩国电影片
  • 沧州市做网站的宁波网站建设推广平台
  • 如何做网站顶级域名网站推广策划
  • 辽宁省朝阳网站建设外贸网站推广费用
  • 在凡科上做的网站无法加载出来做百度关键词排名的公司
  • 网页模板版权申请360优化大师
  • 网站开发文档网站阿里云万网域名注册
  • 茂名专业网站建设中国十大电商公司排名
  • 教做面食的网站seo企业推广案例