Qt的双缓冲技术(double buffering)

Qt的双缓冲技术(double buffering)Qt的双缓冲技术(doublebuffering)是Qt绘画机制的一部分,是一种在Qt4中被全面采用的技术。其核心是:把一个窗口部件渲染到一个脱屏pixmap(off-screenpixmap)中,然后再把这个pixmap复制到显示屏幕上。这样做的目的是用于消除屏幕的闪烁并且因而界面会显得更漂亮。Qt4中,Qt会自动处理这些情况,所以在普通的绘画中,我们不必要关注这些内容。QT取消双

大家好,又见面了,我是你们的朋友全栈君。

      Qt的双缓冲技术(double buffering)是Qt绘画机制的一部分,是一种在Qt4中被全面采用的技术。其核心是:把一个窗口部件渲染到一个脱屏pixmap(off- screen pixmap)中,然后再把这个pixmap复制到显示屏幕上。这样做的目的是用于消除屏幕的闪烁并且因而界面会显得更漂亮。Qt4中,Qt会自动处理这些情况,所以在普通的绘画中,我们不必要关注这些内容。

QT取消双缓冲的方法是setAttribute( Qt::WA_PaintOnScreen)



      在更详细的说明这一技术前,gemfield需要简单介绍一下Qt的绘画机制。Qt的绘画机制本质上是提供了2个工具:QPainter和 QPaintDevice,分别代表人类世界的画笔和画板。Gemfield要完成一次绘画,就必须有个画笔(QPainter),另外,还得解决画笔画在哪儿(画板,QPaintDevice)的问题。Qt中的画板是QPaintDevice,当然,gemfield用到的都是它的子类,也就是具体哪种画板:它们是:QWidget、 QImage、QPicture、 QPixmap等,也就是每一个可见的控件(QWidget的子类)都是画板(在其paintEvent()里绘画)。




      那么gemfield本文开始处提到的双缓冲技术是怎么做到消除屏幕闪烁的呢?其核心原因有2点:




      1、 把核心的绘制工作转到屏幕之外完成,而在屏幕显示的时候,只是简单的内存复制。


      2、 只对窗口部件的一部分进行重绘时,另外一部分就不需要重绘,也变成了简单的内存复制——将当前界面不需要重绘的像素复制到脱屏像素,再在脱屏像素上完成剩余的绘制,再通过内存复制映射到屏幕显示上。




      Gemfield再通过一个叫做GemfieldFuwaArrow的程序(内含一个简单的绘制函数,其运行在SYSZUXpad上)简单介绍一下:




void SYSZUXArrow::syszuxRotate(float angle)


{



this_angle=angle;


refreshPixmap();


update();


}




      1、 当SYSZUXpad通过总线接收到的角度有变化时,就调用refreshPixmap()函数来进行重新绘制,不过这是在脱屏的pixmap上进行绘制。然后再调用update()来执行paintEvent()。




void SYSZUXArrow::refreshPixmap()


{



pixmap->fill(this,0,0);


this_width=width();//控件的宽度


this_height=height();//控件的高度


QColor this_color(127, 0, 127);//颜色


static const QPoint syszux_arrow[3] = {



QPoint(this_width/2, 10),


QPoint(this_width/2+5, 20),


QPoint(this_width/2-5, 20)


};//箭头的坐标


QPainter painter(pixmap);


painter.initFrom(this);


painter.setRenderHint(QPainter::Antialiasing, true);


QPen pen(Qt::white);


painter.setPen(pen);


painter.drawLine(0,this_height/2,this_width,this_height/2);//x


painter.drawLine(this_width/2,0,this_width/2,this_height);//y


QPen syszux_pen(this_color,2);


//QPainter painterArrow(pixmap);


painter.setRenderHint(QPainter::Antialiasing, true);


painter.setPen(syszux_pen);


painter.translate(this_width/2,this_height/2);


painter.setBrush(this_color);


painter.rotate(this_angle);


painter.translate(-this_width/2,-this_height/2);


painter.drawLine(this_width/2,this_height/2,this_width/2,20);


int a=(this_height/2.0-10)-((this_height/2-20)/100.0*gemfield_percent);


painter.drawEllipse(this_width/2-10,a,20,20);


painter.drawConvexPolygon(syszux_arrow, 3);


}




      2、在refreshPixmap()函数中,pixmap->fill(this,0,0);函数使用this控件的背景色或背景图片来填充当前脱屏的这个pixmap,后面两个参数是偏移量,也就是this左上角的点映射到pixmap上的哪里。这里是0,就表明完全重合、一模一样。 painter.initFrom(this);函数可以设置painter所使用的画笔、背景色、字体,让其和this控件一样。




void SYSZUXArrow::paintEvent(QPaintEvent *)


{



QPainter painter(this);


painter.drawPixmap(0,0,*pixmap);


}




      3、 通过把pixmap复制到窗口部件的(0,0)位置来完成整个图形的绘制工作。




      其实,在这样一个简单的绘图工作中,这样的技术大可不必。而且随着半导体技术的进步,双缓冲所能发挥出的功能相对减少。




      另外一个不容忽视的问题是,使用双缓冲技术会增加系统的负载。因为相比普通的绘制,它多出了一些工作。比如在SYSZUXpad上运行  GemfieldFuwaArrow程序时,双缓冲时cpu的利用率是50%,而没有采用双缓冲时,cpu的利用率是37%。




      其实这也说明了一个本质的问题,界面的绚烂总是靠硬件性能的提升获得的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143445.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机机房装修规范_设备机房设计规范

    计算机机房装修规范_设备机房设计规范等级:文件732KB格式rar1.0.1本规范宗旨,修改原规范第1.0.1条。  采暖、通风与空调工程是基本建设领域中一个不可缺少的组成部分,它对改善劳动条件、提高生活质量、合理利用和节约能源及资源、保护环境、保证产品质量以及提高劳动生产率,都有着十分重要的意义。本次规范修订从节能、环保、安全、卫生等方面结合了近十年来国内外出现的新技术、新设备、新材料与设计、科研新成果,对有关设计标准、技术…

    2022年9月28日
    0
  • eve模拟器上虚拟服务器,没有真机怎么做实验?EVE模拟器了解一下

    eve模拟器上虚拟服务器,没有真机怎么做实验?EVE模拟器了解一下网络很重要的一个环节就是大量的实践操作,通过教程学习知识点,再用实践来验证这些知识学会了没有,如此反复。这样的问题也随之而来,初学网络连概念都刚刚建立,怎么才能接触到网络设备:交换机、路由器、防火墙等等?既然避免不了实验测试,离不开实验环境,这就给大家推荐一款最好用的模拟器——eve模拟器。EVE模拟器已经不仅可以模拟网络设备,也可以运行一切虚拟机。理论上,只要能将虚拟机的虚拟磁盘格式转换为qco…

    2022年6月11日
    47
  • ETH挖矿显卡选型和矿机配置

    ETH挖矿显卡选型和矿机配置以太坊显卡挖矿指南1.显卡篇挖矿靠显卡核心计算,所以AMD显卡比NVIDA卡更高效。选择AMD卡,要求显卡显存大于2G,推荐购买4G显存显卡.目前市面上可购选择的显卡品牌型号还有速度.蓝宝石-影驰-技嘉-索泰-讯景-微星-迪兰-盈通#显卡型号操作系统挖矿速度驱动版本显卡功耗

    2025年5月23日
    0
  • webpack配置文件_reconfig

    webpack配置文件_reconfig前言上一篇文章我们使用webpack打包成功了,但是每次都要自己手动输入打包的文件地址和打包到哪里去的地址,非常麻烦,所以这里介绍使用配置文件进行打包webpack.config.js首先我们创

    2022年7月31日
    4
  • ts 视频下载[通俗易懂]

    ts 视频下载[通俗易懂]importurllib.requestimportrequests,os,threadingfromCrypto.CipherimportAESfromsrc.Pacho.moviePa.tsdownloadimportaes_decodeclassm3u8down(object):def__init__(self,url,listheaders,dicheaders):self.url=url#这里的url是index.m3.

    2022年7月18日
    17
  • redis的问题_redis高级数据类型

    redis的问题_redis高级数据类型备注:针对基本问题做一些基本的总结,不是详细解答!1.Redis在项目中的主要作用是是什么?怎么用的?(应用场景)2.Redis支持的数据类型(必考)3.zset跳表的数据结构(必考)4.Redis的数据过期策略(必考)5.Redis的LRU过期策略的具体实现6.如何解决Redis缓存雪崩,缓存穿透问题7.Redis的持久化机制(必考)8.Redis的管道pipel…

    2022年8月20日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号