作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

Scene Graph 的优势

在Qt5中推出了一个新的渲染底层 Scene Graph,来替代Qt4时期的 Graphics View。如果大家使用过Qt5的 Qt Quick 模块,你会感觉 Qt Quick 的画面渲染速度和效率比Qt4的 GraphicsView 来说好了很多。主要原因是在渲染部分精简了渲染堆栈,并且充分利用显卡加速,将渲染负担转移到GPU来进行,实现了负载均衡。

Scene Graph 是直接构建在OpenGL之上的,因此 Scene Graph 对于OpenGL开发者来说要熟悉一些,而从来没有接触过OpenGL开发的开发者就有些为难了,幸好Qt在其之上有 QQuickPaintedItem 等方便的类,它可以像QPainter那样对其进行渲染操作。

使用Qt的 Scene Graph 来开发应用,为了提升性能要点是批量渲染。这是由OpenGL的特性决定的,因为通过OpenGL,将以往CPU串行的部分并行化,从而大大提升渲染效率,再加上OpenGL本质上是一个巨大的状态机,在进行批量渲染的时候,可以有效地减少OpenGL状态切换所带来的性能开销,同时OpenGL预留的一些状态,需要开发者有基本的认知,由于OpenGL是一个开放的标准,因此考虑到兼容性,其采用了C/S架构。C端即CPU部分,S端对应GPU。在顶点和纹理数据从C端传入S端之前,会在C端形成一个缓冲区(一说缓存)。正确地设置缓冲区的数量和大小,可以为应用程序的性能提升带来很大的帮助。

Qt Quick 中的渲染

渲染如何具体工作可以参考官方文档:Qt Quick Scene Graph Default Renderer

如何在 Qt Quick Scene Graph 中实现自定义几何可以参考官方文档:Scene Graph - Custom Geometry

如何定义场景图材料可以参考官方文档:Scene Graph - Simple Material

如何在Qt Quick场景下渲染OpenGL可以参考官方文档:Scene Graph - OpenGL Under QML

Qt Quick 渲染循环

渲染循环有三种方式:basic,windows 和 threaded。其中 basic 和 windows 是单线程,而 threaded 是指定线程内渲染。Qt会根据情况自动选择使用哪种方式。当性能不满足,或者出于测试考虑时,可以强制启动QSG_RENDER_LOOP。

windows 和 threaded 方式非常依赖于OpenGL将交换间隔设定为1。一些显卡驱动允许用户覆盖或关闭这个值,并忽略Qt的修改请求。但如果没有这个设置,会导致交换间隔太短,CPU满负荷运转。如果知道系统不能自动调整 vsync-based,请手动设置 QSG_RENDER_LOOP=basic 来启动 basic 渲染方式。

  1. threaded 渲染方式
    threaded 渲染方式使用独立线程来渲染,由于使用多线程,性能得到显著提升,且界面反馈更加流畅。其简易示意图如下:

  2. 非 threaded 渲染方式 (basic 和 windows)
    这两种方式使用单线程渲染,但写代码时要按照threaded渲染方式来写,方便日后移植。其简易示意图如下:

  3. 查看自己电脑上的渲染方式

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QLoggingCategory>int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);QLoggingCategory::setFilterRules(QStringLiteral("qt.scenegraph.general=true"));qSetMessagePattern("%{category}: %{message}");QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}运行结果:
qt.scenegraph.general: threaded render loop
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.scenegraph.general: texture atlas dimensions: 1024x512
qt.scenegraph.general: R/G/B/A Buffers:   8 8 8 8
qt.scenegraph.general: Depth Buffer:      24
qt.scenegraph.general: Stencil Buffer:    8
qt.scenegraph.general: Samples:           0
qt.scenegraph.general: GL_VENDOR:         Intel
qt.scenegraph.general: GL_RENDERER:       Intel(R) UHD Graphics 630
qt.scenegraph.general: GL_VERSION:        4.5.0 - Build 24.20.100.6345
qt.scenegraph.general: GL_EXTENSIONS:     略
qt.scenegraph.general: Max Texture Size: 16384
qt.scenegraph.general: Debug context:    false

可以看到我使用的是 threaded 渲染方式,画面垂直同步花费了 16.67 ms。

其他

请参考 QML 渲染之 Scene Graph 详解

Qt Quick 渲染机制相关推荐

  1. Qt Quick 渲染之 Scene Graph 详解

    作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 简介 在 Qt widget 中的渲染方式是传统的命令式绘图系统,使用 QPainter 依次为每个界面 ...

  2. 技术干货 | 基于 Qt Quick Plugin 快速构建桌面端跨平台组件

    导读:桌面端的 UI 开发框架对比移动端.Web 端的成熟方案,一直处于不温不火的状态.随着疫情掀起的风波,桌面端在线教育.视频会议等需求不断涌现.本文将围绕 Qt Quick 的优势来介绍如何快速创 ...

  3. QT实现Qt Quick和three.js渲染和实现QML3D控件

    QT实现Qt Quick和three.js渲染和实现QML3D控件 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 结合Qt Quick和three.js渲染. 演示 ...

  4. 如何利用Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?

    Qt组件推荐: QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows.Linux和Ma ...

  5. 测试Qt Quick在各个平台上的3D渲染性能

    测试Qt Quick在各个平台上的3D渲染性能 Qt是一个跨平台的GUI框架,它的QtQuick更是支持结合OpenGL原生的代码进行渲染.我想将我以前写的程序整合到QtQuick上来,看看渲染效果是 ...

  6. Qt Widgets、QML、Qt Quick的概念与区别

    1 QML 和 Qt Quick 是什么关系? 从概念上区分 QML 是一种用户界面规范和标记语言,它允许开发/设计人员创建高性能.流畅的动画和具有视觉吸引力的应用程序. 这里,主要涉及两点: 用户界 ...

  7. Qt Quick 和 Widgets 的对比

    Qt Quick 和 Widgets 的对比 概念: Qt Quick : QML 类型 和 功能的标准库 Qt Quick 模块:提供可视化组件,模型视图支持,动画框架以及用于构建用户界面的更多功能 ...

  8. Qt quick性能提升[通俗易懂]

    Qt quick性能优化 使用时间驱动 避免定时轮询: 使用信号槽形式: 使用多线程 C++; QML WorkerScript元件: 使用Qt Quick Compiler 只需要再PRO文件中添加 ...

  9. Qt Widgets、QML、Qt Quick 的区别

    作者: 一去.二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在接触 Qt 之后,很多人难免会有一些疑惑: Q1:QML 和 Qt Quick 之间有什么区别? Q2:QtQuick ...

最新文章

  1. 段页式存储管理方式的定义
  2. hibernate之HQL传中文参数乱码 解决办法
  3. std::cout char + int
  4. JQuery 总结(1) 选择器的使用
  5. Web Components 入门实例教程
  6. 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
  7. Unity C# Job System介绍(四) 并行化Job和故障排除(完结)
  8. L1-078 吉老师的回归 (15 分)-PAT 团体程序设计天梯赛 GPLT
  9. matlab保存矩阵为txt,matlab保存矩阵成txt
  10. rose 生产java代码m_rose 生成代码
  11. 【人物志】美团技术委员会前端通道主席洪磊:爱折腾的斜杠青年
  12. linux环境vmd安装,Ubuntu下VMD安装
  13. 异构计算-1-10x10:一种异质性和提高能量效率的通用架构方法
  14. 零基础学Python需要用到哪些软件?
  15. 8/11 Perl和Postgresql联合在京交流会 Perl6项目经理远道参加
  16. 流程图,梳理基本流和备选流,编写测试用例
  17. word骨灰级水平,赶紧留一份
  18. 树莓派网线直连海康威视摄像头
  19. 人脸识别4-百度商用方案调研
  20. 老贾笔记--轻轻松松oracle之logmnr篇[吃顿饭的功夫学恢复误删除(delete)的数据]

热门文章

  1. 苹果iOS被曝安全漏洞:一条短信可让手机死机
  2. Ubuntu 安装和使用MySQL
  3. 刷机后mi android不动,小米MIflash平台刷机报错问题解决方案小米刷机错误解决方法...
  4. 2018.11.28——DBSCAN用于聚类、异常点检测
  5. amd服务器如何修改睿频,amd自动睿频怎么开 amd开启睿频教程
  6. JavaWeb之动态页面技术jsp显示商品列表
  7. java项目配置maven的setting文件访问阿里云仓库下载jar包
  8. while循环及for循环
  9. [机器学习入门笔记] 1. 周志华. 《机器学习》
  10. 导入博客等渠道文章到公众号并进行格式布局-详细教程