Qt新渲染底层Scene Graph研究(一)

Qt新渲染底层Scene Graph研究(一)

Qt 5提出了一个新的渲染底层,以替代Qt4时期的Graphics View,这个渲染底层就是Scene Graph。其实这个底层的作用和Open Scene Graph是差不多的,但是由于是不同的团队进行开发的,所以两者没有必然的联系。Scene Graph主要利用OpenGL ( ES )2的渲染优势,在2D和3D以非常流畅的速度进行渲染,满足日益增长的界面效果需求,同时Scene Graph预留了各种各样的接口,满足大家定义显示和渲染效果的需要。

蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43063219。欢迎同行前来探讨。

如果大家使用过Qt 5的Qt Quick模块,你会感觉QtQuick的画面渲染速度和效率比Qt 4的GraphicsView来说好很多。当然Qt Graphics View在指定OpenGL渲染context为OpenGL时,差距可能小一些,但也较为明显。这一块儿,主要在渲染部分精简了渲染堆栈,并且充分利用显卡加速,将渲染负担转移到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端形成一个缓冲区(一说缓存),我们常说的VBO、FBO和PBO就是这一类缓冲区。正确地设置缓冲区的数量和大小,可以为应用程序的性能提升带来很大的帮助。

Qt的Scene Graph在Qt 5.1到Qt5.2时有一个质的飞跃,因为其内部采用了新的Scene Graph渲染器。在Qt中,渲染器是可以替换的,所以说Qt 5.1之前采用的渲染器和Qt 5.2采用的渲染器是很不一样的。Qt官方当时做了一个性能测试,测试表明,OpenGL的API调用次数得到了显著的降低。其中采用了很多先进的思想比如说纹理图集(TextureAtlas)。一句话,Scene
Graph总体的目标就是批量、批量再批量。

最后,介绍一下如何使用环境变量来进行对Qt的Scene Graph进行可视化检测。Qt的Scene Graph通过QSG_VISUALIZE来检测其渲染。

1、 测试批量渲染

通过指定QSG_VISUALIZE=batches来检查批量渲染情况,相同颜色标明其作了批量渲染。场景的颜色数越少,批量渲染就越好,渲染的效率就越高。

2、 测试裁剪情况

通过指定QSG_VISUALIZE=clip来检查裁剪情况。因为Item有一个clip的选项,如果打开的话,那么会通过较鲜艳的红色斜线显示出来。图中左上角的图像表示设置了Item::clip = true。

3、 测试全景绘制效果

这是一个非常直观且非常炫的效果。通过指定QSG_VISUALIZE=overdraw来检查在三维视图中各个图元的显示情况。所显示的图元都集中在x∈[0,Screen.width],y∈[0,Screen.height],z∈[0,1]的立方体中。如果发现自己创建的Item没有在视口中显示,看看在这种情况是不是跑到视口外面去了呢。

所用的程序均来自我制作的全平台独立游戏《十日驱鬼记》。下载链接参见:这里

时间: 2024-10-04 16:05:35

Qt新渲染底层Scene Graph研究(一)的相关文章

Qt新渲染底层Scene Graph研究(三)

Qt新渲染底层Scene Graph研究(三) 上一篇文章介绍了Qt Quick和SceneGraph的一些理论上的内容.这也是我最新的研究成果.接下来我要介绍一下如何使用Scene Graph来制作一些好玩的效果.这也是我进行一次SceneGraph的尝试. 我的目标是希望在Scene Graph这一套渲染框架下实现一个带有纹理的立方体,并且旋转.花了几天,虽然不是那么满意,但是已经告一段落了. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/articl

Qt新渲染底层Scene Graph研究(二)

上一篇文章初步介绍了Qt新渲染底层Scene Graph,我们该如何利用这个框架为应用程序增添绚丽的效果呢?首先,我们要明确利用Scene Graph开发的目的是什么.如果是简单的,纯粹的显示2D图形界面,那么直接利用构建在Scene Graph之上的Qt Quick和Qt Quick Widget即可.如果觉得Qt Quick为我们提供的功能不够,在QML这一层无法很好地实现,那么我们或许需要考虑更低一层的Scene Graph了.一个使用Scene Graph的常见需求就是实现3D模型的渲染

qt新进程工作目录的设置(工作目录确实是被子进程继承的,但也可以设置)

经过试验,qt启动一个新的进程时,这个进程的工作目录是继承父进程的,无论是通过start还是startDetached来启动. 其实对于linux系统,qt底层应该也是调用fork.exec之类的函数,对于fork,参看apue中文版第三版,有以下解析: 在f o r k之后处理文件描述符有两种常见的情况:(1) 父进程等待子进程完成.在这种情况下,父进程无需对其描述符做任何处理.当子进程终止后,它曾进行过读.写操作的任一共享描述符的文件位移量已做了相应更新.(2) 父.子进程各自执行不同的程序

Jdbc Url 设置allowMultiQueries为true和false时底层处理机制研究

一个mysql jdbc待解之谜 关于jdbc  url参数 allowMultiQueries 如下的一个普通JDBC示例: String user ="root"; String password = "root"; String url = "jdbc:mysql://localhost:3306"; Connection conn = java.sql.DriverManager.getConnection(url , user, pas

Scene Graph 基本概念

三种指标 PredCls:在有Bounding Box和Object Label的情况下对物体间Relation预测实验. SGCls:在有Bounding Box的情况下,对Object Lable的预测和物体间Relation预测的实验. SGGen:直接对Bounding Box,Object Label和物体间Relation预测的实验. 原文地址:https://www.cnblogs.com/wuminda/p/12332942.html

跨平台显示MMD模型

过年了,祝大家喜气洋洋,心想事成! 然后呢,过年后,依然进行Qt以及3D的研究.最近翻出以前的技术研究成果,并且花了将近一个月,成功地在移动平台上显示MMD模型了. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43912325.欢迎同行前来探讨. 首先,花了几周的时间,将MMD模型脚本化,也就是说,可以使用QML定义一个MMD类,指定参数即可显示.这里的移植参照了以前写QML和C++混合的经验,写起来还算好,不过有的时候也

Qt3升至Qt4需要注意的几件事项浅谈

公司以前的项目是用Qt3写的,随着时间的推移慢慢显示出Qt3有多方面的限制,因此先公司决定用Qt4来改写这个项目,并为软件添加新功能,在此背景先编写此文章. 先扯一下没用的:gotfocus是获得焦点时触发,Lostfocus是失去焦点的时候触发.比如:新建两个文本框,当点击第一个文本框的时候,则触发第一个文本框的getfocus事件,表示第一个文本框获得了焦点,可以进行操作了.然后鼠标点击第二个文本框的时候,第一个文本框首先触发lostfocus事件,标明它已经失去焦点,无法进行操作.同时第二

Qt 3D的研究(二)

上一篇文章给大家看了很多Qt 3D的例子,如果大家有Qt 3D的源代码,就会发现,开发这些例子,花费的代码还真不少.这就是不一样的地方,Qt 3D毕竟和三维图形打交道,多了一个维度,问题的难度变得更大了. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43801957.欢迎同行前来探讨. 研究了多日的Qt 3D,我了解到为了适应跨平台.不同的着色器编译器标准.多重渲染目标,Qt 3D提出了很多的方案,创新了许多的概念,这多多

论文:利用深度强化学习模型定位新物体(VISUAL SEMANTIC NAVIGATION USING SCENE PRIORS)

这是一篇被ICLR 2019 接收的论文.论文讨论了如何利用场景先验知识 (scene priors)来定位一个新场景(novel scene)中未曾见过的物体(unseen objects).举例来说,在「厨房」这一场景中,有一张图片显示「苹果」在冰箱的储物架上,同为水果的物体,如「橙子」,会出现在场景的哪个位置呢?论文提出了用基于强化学习的方法来定位「橙子」. 论文:VISUAL SEMANTIC NAVIGATION USING SCENE PRIORS 论文作者:Wei Yang , X