QGraphicsView图形视图框架使用(五)渲染优化

这篇具有很好参考价值的文章主要介绍了QGraphicsView图形视图框架使用(五)渲染优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


当视图中的复杂图元比较多的时候,图形框架应用的性能会下降很多。这时候,我们就需要对默认的渲染策略进行调整从而提升用户体验。图形视图框架的优化方向主要分为以下几种:
1.调整图元的二叉树结构
2.对图元的绘制函数进行缓存
3.优化视图渲染
4.采用OpenGL进行渲染

下面分别介绍一下几种优化策略

调整图元二叉树

在图元视图框架内部,各个Item的位置采用二叉树数据结构来进行存储。这种数据结构的优势是是查询比较快,也就是通过items()或者itemAt()来定位查找图元的时候会比较快,这对于图元的碰撞检测也是很有帮助的。但是这种数据结构也有问题,就是如果移动了一个图元,那么框架就需要更新整个二叉树,如果图元比较多的时候这个更新操作是很耗时的。

如果图元比较多,且你不需要图元的位置信息二叉树的时候,可以通过下面的函数来禁用索引信息,从而提升视图的渲染性能。

scene()->setItemIndexMethod(QGraphicsScene::NoIndex);

没有位置信息二叉树的时候,调用items()或者itemAt()查找元素的时候,就需要遍历所有的元素进行查找,如果图元比较多的话,查找也会引发性能问题。所以这个配置要根据自己项目的具体场景选择是否开启。

如果无法完全放弃二叉树索引,我们也可以通过setBspTreeDepth()修改二叉树的深度来优化性能,不过这个参数设置也要和具体场景结合起来。

绘制缓存

如果某个图元的绘制函数是很耗时的,我们可以开启该图元的缓存模式来进行优化,默认的情况,缓存模式是被关闭的。缓存模式开启的函数如下:

//@1缓存模式
//@2逻辑换存的大小
void QGraphicsItem::setCacheMode(CacheMode mode, const QSize &logicalCacheSize = QSize())

常见的缓存模式如下表所示:

模式 说明
NoCache 默认缓存模式被禁用,每次图元需要重绘的时候 QGraphicsItem::paint()函数都会被调用。
ItemCoordinateCache 给图元指定一个QSize()大小的缓存,缓存里面的图像可以用来进行后续的绘制和位移变换。如果想调整缓存图像的质量和分辨率,可以通过调用setCacheMode()分配一块更大的空间。
DeviceCoordinateCache 绘制设备级别的缓存优化,主要适用于那些可以移动,但不会发生位移变化(旋转、缩放、剪切)的图元。如果图元发生了位移变化,那么缓存会自动更新。和ItemCoordinateCache不同 DeviceCoordinateCache不需要指定缓存空间大小,它始终以最高质量进行渲染。

视图优化

默认的情况下QGraphicsView在绘制背景和图元的时候会保护pianter的绘制状态。如果我们通过setPen()或者setBrush()修改了绘制状态,该状态会被一直保持,如果图元比较多的时候该绘制状态保持操作是比较耗时的,View中每个图元都需要执行对应的操作。我们可以通过下面的配置来禁用这种配置:

setOptimizationFlag(DontSavePainterState, true); 

在禁用了自动绘制状态保持之后,我们就需要负责对painter()的状态进行控制了。禁用了自动绘制状态保持之后,标准控件也会影响painter()的状态。因此,如果同时使用标准图元和自定义图元,保持默认行为或设置 DontSavePainterState之后,在每次paint()绘制完毕的时候都需要将画笔和画刷恢复默认值。

默认情况下如果图元开启了抗锯齿操作,渲染的时候由于差值的影响很可能渲染的范围就超出了图元的边界,这就导致了渲染范围增大,从而影响了渲染性能。我们可以通过下面的配置来禁用边界以外的渲染行为:

setOptimizationFlag(DontAdjustForAntialiasing, true); 

启用了该配置之后,抗锯齿渲染便不再渲染边界以外的图形,从而提升渲染性能。这个配置的副作用就是,以抗锯齿的模式绘制的图元在移动时候,会在Scene上留下绘制轨迹。

除了上面的配置之外,还可以通过指定QGraphicsView的渲染更新范围来优化图形框架的性能。对应的配置接口如下:

setViewportUpdateMode(ViewportUpdateMode mode);

更新模式分为五种分别如下:

模式 说明
FullViewportUpdate 更新整个viewport中的图元
MinimalViewportUpdate 只更新需要更新的图元
SmartViewportUpdate QGraphicsView会寻找最优的更新模式
BoundingRectViewportUpdate Qt检测需要重绘的区域,然后在viewport上寻找一个矩形范围,将所有需要重绘的区域包含进去,对找到的矩形范围进行更新。
NoViewportUpdate 当场景改变时, QGraphicsView永远不会更新它的视口,用户控制所有更新。

如果图元比较多,找需要更新的图元的时间大于更新整个viewport更新的时间,我们可以选择FullViewportUpdate模式,相反如果找需要更新的图元的时间小于更新整个viewport的时间,我们可以选择MinimalViewportUpdate模式。

OpenGL渲染优化

QGraphicsView默认的viewport是基于QWidget的性能受限制,我们可以通过使用
OpenGL widget替代QWidget来提升渲染性能。对应的配置如下:

QGraphicsView view; 
view.setViewport(new QOpenGLWidget());

通常配置OpenGL替代QWidget能提升渲染性能,但Qt的图形视图框架并不是针对GPU设计的,并不能充分发挥GPU的性能。如果想使用可以利用GPU加速的图形框架,可以参考Qt Quick中对应的模块。

上面提到的优化策略,都是有局限性的,我们在实际使用的时候,要考虑自己的业务场景和软硬件性能,不能盲目套用,要不有可能对性能产生负面影响。最好能在优化前后对对应的指标进行测试,确保优化策略确实提升了性能。文章来源地址https://www.toymoban.com/news/detail-410913.html

到了这里,关于QGraphicsView图形视图框架使用(五)渲染优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QGraphicsView 如何让图形大小适配窗口

    setSceneRect是一个Qt中的函数,用于设置QGraphicsView中的场景矩形(QRectF)。 QGraphicsView是一个用于显示和编辑图形场景的控件,而setSceneRect函数用于设置场景矩形,即指定场景的可视区域的大小和位置。具体来说,它的作用有以下几个方面: 定义场景的大小:通过设置场景矩形

    2024年01月24日
    浏览(25)
  • Qt中QGraphicsView架构下实时鼠标绘制图形

    上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章节中最后展示的动画效果来看,今年主要讲述如何在QGraphicsView架构下,实时拖动鼠标绘制图形! 今天主要以矩形为例,再来看一下展示效果吧! 想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件

    2024年01月22日
    浏览(33)
  • 【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

    QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化 简介 本文介绍了QT模型视图代理框架中的QT表格控件和QT数据库模块中的QT数据库查询模型结合使用的一个应用实践案例:QT高性能表格控件分页展示千万行数据。本文介绍了这个应用实践案例的运行效果

    2024年02月14日
    浏览(29)
  • 前端(八)——深入探索前端框架中的Diff算法:优化视图更新与性能提升

    😊博主:小猫娃来啦 😊文章核心: 深入探索前端框架中的Diff算法:优化视图更新与性能提升 前端框架中的diff算法是一种比较两个虚拟DOM树之间差异的算法。在更新页面时,为了提高性能,前端框架通常会先生成新的虚拟DOM树,然后通过diff算法比较新旧虚拟DOM树的差异,

    2024年02月16日
    浏览(37)
  • 跟随chatgpt学习如何使用GLSL进行简单的图形渲染

    运行成功页面 一个简单的glsl小实验成功了,不过我想要这个三角形动起来。 修改后的script代码如下 运行成功截图 他现在就是一个游来游去的红色三角形了。太神奇了!~

    2024年01月18日
    浏览(32)
  • Python框架【模板继承 、继承模板实战、类视图 、类视图的好处 、类视图使用场景、基于调度方法的类视图】(四)

    👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🔥如果感觉博主的文章还不错的

    2024年02月11日
    浏览(41)
  • 界面开发框架Qt新手入门教程:Dir视图使用实例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 本示例演示了树形视图的用

    2024年02月08日
    浏览(30)
  • 图形学-(视图变换,投影变换)

    在 3 维物体变到二维平面的过程中,我们需要规定好相机的位置。对于相机所做的变换就是 视图变换 (Viewing/Camera transformation)。 我们需要对相机位置进行定义,对于一个相机我们要规定下面三个属性: 相机位置(视点)(Position) 相机拍摄方向(视线)(Look-at/Gaze direction) 相机

    2024年02月11日
    浏览(25)
  • 【SpringBoot】FreeMarker视图渲染

    目录 一、FreeMarker 简介 1.1 什么是FreeMarker? 1.2 Freemarker模板组成部分 1.3 为什么要使用FreeMarker 二、Springboot集成FreeMarker 2.1 配置 2.2 数据类型 2.2.1 字符串 2.2.2 数值 2.2.3 布尔值 2.2.4 日期 2.3 常见指令   2.3.2 assign 2.3.3 include ... 三、常见指令实现增删改查(综合案例)⭐ 3.1 后端

    2024年02月04日
    浏览(22)
  • SpringBoot之视图渲染技术

    在Spring Boot中,视图渲染技术用于将动态数据渲染到用户界面,生成最终的HTML、XML、JSON等文档,以便将其返回给客户端浏览器 Freemarker是一个Java模板引擎,用于生成基于模板的动态内容。它是一种用于生成文本输出的模板引擎,常用于Web应用程序开发中的视图层。 Freemarker的

    2024年02月03日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包