掌桥专利:专业的专利平台
掌桥专利
首页

一种基于OpenGL指令的渲染运行方法及系统

文献发布时间:2023-06-19 12:13:22


一种基于OpenGL指令的渲染运行方法及系统

技术领域

本发明涉及渲染优化处理领域,尤其涉及一种基于OpenGL指令的渲染运行方法及系统。

背景技术

目前,渲染引擎在渲染的过程本质上可以认为是CPU发送一系列的OpenGL相关的命令和命令相关的参数给GPU, GPU根据这些命令和参数绘制出相关的图像,而CPU在发送这些OpenGL相关命令和参数过程中不可避免的要执行很多的分支结构,函数跳转以及各种的CPU端的代码,使得渲染过程需要执行较大的代码量,导致渲染过程存在时间较长,效率较低等问题。

为了优化显示引擎的渲染效率,目前提出了各种优化方案,例如创建各种VBO(顶点缓冲区对像)、VAO(顶点数组对像)、EBO(顶点索引对像)、UBO(uniform 缓冲区对像)等缓存,通过这些预先在GPU创建的缓存,在绘制时即可以减少CPU和GPU之间的数据交互,提高显示的效率;又或者对相同显示属性的对像进行分类,每一类对像放在一起绘制,通过一些相同显示属性的分类,可以减少调用OpenGL的指令数量,也可以提高显示的效率。

但是无论是哪种渲染方式,其渲染过程中为了获取一帧所有的绘制命并发送给GPU,需要执行一遍完整的显示流程,这个过程在CPU端需要消耗大量的时间,使其CPU端的运行时间无法减少,导致更新过程中渲染效率依然无法进一步提高。

发明内容

为了克服现有技术的不足,本发明的目的之一在于提供一种基于OpenGL指令的渲染运行方法,在渲染的过程中大量减少CPU端的运行时间,提高整个渲染的效率。

本发明的目的之二在于提供一种基于OpenGL指令的渲染运行系统。

本发明的目的之三在于提供一种电子设备,执行上述渲染运行方法。

本发明的目的之四在于提供一种存储介质,执行上述渲染运行方法。

本发明的目的之一采用如下技术方案实现:

一种基于OpenGL指令的渲染运行方法,包括:

根据显示数据依次向绘制处理单元发送用于绘制渲染图像的绘制命令;

依次拦截并收集所有向绘制处理单元发送的绘制命令以进行条件判断,若当前帧所对应的绘制命令列表满足预设条件时,将当前帧所对应的绘制命令列表存储至数据容器中;

遍历所述数据容器中所有绘制命令,依次从所述数据容器中取出绘制命令发送至所述绘制处理单元以完成渲染图像的绘制操作。

进一步地,所述绘制处理单元根据绘制命令完成绘制操作的方法为:

预先对每个绘制命令的OpenGL函数创建对应的包裹函数;

向所述绘制处理单元发送绘制命令时所述绘制处理单元直接调用绘制命令对应的包裹函数,并在执行包裹函数的过程中调用OpenGL函数以进行渲染图像的绘制操作。

进一步地,主动拦截并收集所有向绘制处理单元发送的绘制命令的方法为:

在执行包裹函数并调用包裹函数对应的OpenGL函数时将OpenGL函数拦截下来,记录OpenGL函数名及其参数内容。

进一步地,判断当前帧的绘制命令列表是否满足预设条件的方法为:

将相邻两帧所对应的绘制命令列表进行比对,判断相邻两帧的绘制命令列表中的参数内容及函数名是否完全相同,若当前帧与其前一帧的参数内容或函数名不相同,且当前帧与其后续帧的参数内容、函数名完全相同时,则当前帧的绘制命令列表满足预设条件,并将当前帧所对应的函数名及参数内容均存储于数据容器中。

进一步地,在遍历数据容器中所有绘制命令时,按照OpenGL函数的调用顺序从数据容器中依次调用所述数据容器中存储的OpenGL函数名及其参数内容发送至所述绘制处理单元中。

进一步地,在所述包裹函数中定义有函数包变量,将包裹函数相关的OpenGL函数以及调用该包裹函数时传入的参数记录在函数包变量中,并将函数包变量存储在数据容器中。

进一步地,还包括:

执行渲染图像刷新操作时,仅对所述数据容器中的局部OpenGL函数及其参数内容进行更新,再对更新后的所述数据容器中的绘制命令进行帧循环。

本发明的目的之二采用如下技术方案实现:

一种基于OpenGL指令的渲染运行系统,包括:

发送模块,用于根据显示数据向绘制处理单元发送用于绘制渲染图像的绘制命令;

拦截模块,用于依次拦截并收集所有向绘制处理单元发送的绘制命令;

判断模块,用于将拦截收集所得的绘制命令列表进行条件判断,若当前帧所对应的绘制命令列表满足预设条件时,将当前帧所对应的绘制命令列表存储至数据容器中;

帧循环模块,用于从数据容器中取出绘制命令并依次发送至所述绘制处理单元以完成渲染图像的绘制操作。

本发明的目的之三采用如下技术方案实现:

一种电子设备,其包括处理器、存储器及存储于所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述的基于OpenGL指令的渲染运行方法。

本发明的目的之四采用如下技术方案实现:

一种存储介质,其上存储有计算机程序,所述计算机程序被执行时实现上述的基于OpenGL指令的渲染运行方法。

相比现有技术,本发明的有益效果在于:

本发明主动拦截并收集所有发往绘制处理单元的绘制命令,并将参数内容及函数名均不再发生变化的绘制命令列表存储在数据容器中,在进行图像渲染时从数据容器中读取绘制命令发送至绘制处理单元中完成渲染,同时在刷新渲染画面过程中仅对数据容器中的少数OpenGL命令和参数进行更新,使得渲染过程中大量减少CPU端的运行时间,提高整个渲染的效率。

附图说明

图1为本发明基于OpenGL指令的渲染运行方法的流程示意图;

图2为本发明执行包裹函数时调用对应OpenGL函数的示意图;

图3为本发明进行第一帧画面渲染时拦截并收集绘制命令的示意图;

图4为本发明收集OpenGL函数名及其参数内容的示意图;

图5为本发明基于OpenGL指令的渲染运行系统的模块示意图。

具体实施方式

下面,结合附图以及具体实施方式,对本发明做进一步描述,需要说明的是,在不相冲突的前提下,以下描述的各实施例之间或各技术特征之间可以任意组合形成新的实施例。

实施例一

如图1所示,本实施例基于OpenGL指令的渲染运行方法具体包括如下步骤:

步骤S1:根据显示数据依次向绘制处理单元发送用于绘制渲染图像的绘制命令;

步骤S2:依次拦截并收集所有向绘制处理单元发送的绘制命令以进行条件判断,若当前帧所对应的绘制命令列表满足预设条件时,将当前帧所对应的绘制命令列表存储至数据容器中;

步骤S3:遍历所述数据容器中所有绘制命令,依次从所述数据容器中取出绘制命令发送至所述绘制处理单元以完成渲染图像的绘制操作。

本实施例提供一种基于OpenGL指令的渲染运行方法,渲染过程中本质上可以认为是系统中央处理器(下述为CPU)向绘制处理单元发送一系列的OpenGL命令及命令相关参数,绘制处理单元根据接收到的命令和参数绘制出相关的渲染图像;其中绘制处理单元即为系统的GPU处理单元或渲染管线,CPU在发送这些OpenGL相关命令和参数过程中不可避免的要执行很多的分支结构、函数跳转以及各种的CPU端的代码,但是在大多数场景下由于渲染图像的顶点关系不发生变化,其对应的显示数据是不会发生变化的,发送给GPU的OpenGL命令和参数的列表也是不变的,根据这个特点收集所有发送的OpenGL命令和参数,将参数内容及函数名均不发生改变的绘制命令列表存储在数据容器中,并且在刷新画面的过程中只局部更新数据容器中少量的命令和参数,然后发送给GPU实现渲染,这样在渲染的过程中大量减少CPU端的运行时间,提高整个渲染的效率。

现有的渲染图像绘制操作是按照帧循环的方式一帧一帧将画面渲染而成的,即每进行一帧画面渲染操作都需要运行一次如下步骤:CPU计算渲染图像所需的显示数据,获取显示数据相关的一系列绘制命令形成绘制命令列表,将当前帧的绘制命令列表发送至GPU处理单元中完成当前帧的绘制操作;不断地重复上述步骤实现帧循环过程,从而完成渲染图像的整个渲染绘制操作。

而本实施例中将绘制命令发送至GPU处理单元后并非马上进行帧循环,而是需要拦截和收集所有发送至GPU处理单元的绘制命令;与此同时,由于渲染执行的第一帧中有可能包含了其他并非用于绘制画面的命令,使其绘制命令列表与后续绘制命令列表不相同,因此在进行帧循环之前还需找到绘制命令列表不再发生变化的一帧,将该帧的绘制命令列表存储在数据容器中,最终在帧循环的过程依次从数据容器中取出绘制的命令并发送给GPU处理单元进行绘制。

本实施例的绘制过程中发送给绘制处理单元的绘制命令本质上是一系列的OpenGL函数调用,而函数调用至少包括函数名和参数内容两个要素,每一次函数调用必有这两个要素参与,而收集发送给绘制处理单元的绘制命令过程其实就是收集上述两个要素的过程,在本实施例中通过创建OpenGL的包裹函数的方式来收集绘制命令。

本实施例中拦截和收集绘制命令的方法为:

预先对每个绘制命令的OpenGL函数创建对应的包裹函数;

向所述绘制处理单元发送绘制命令时所述绘制处理单元直接调用对应的包裹函数,并在执行包裹函数的过程中调用OpenGL函数,绘制处理单元根据OpenGL函数绘制渲染图像。

举个例子,假设绘制命令A,则其对应的系统函数为FunctionA,

Type FunctionA(p1, p2, p2);

本实施例根据函数的定义设置其包裹函数为:

Type FunctionA_1(p1, p2, p3);

包裹函数的实现就是:

Type FunctionA_1(p1, p2, p3)

{

Return FunctionA(p1, p2, p3)

};

即如图2所示,包裹函数FunctionA_1执行时调用函数FunctionA,包裹函数FunctionB_1执行时调用函数FunctionB;而本实施例中向绘制处理单元发送绘制命令A时直接执行包裹函数FunctionA_1,使得函数FunctionA被执行,即每当OpenGL函数需要被调用时,优先调用OpenGL函数的包裹函数。

本实施例中找到绘制命令列表不再发生改变的一帧的方法为:通过上述包裹函数的方式拦截和收集所有发送至绘制处理单元的绘制命令后,将相邻两帧所对应的绘制命令列表进行比对,判断相邻两帧的绘制命令中的参数内容及函数名是否完全相同,若当前帧与其前一帧的参数内容、函数名不完全相同或完全不相同,且当前帧与其后续帧的参数内容及函数名完全相同时,代表着当前帧为绘制命令列表不再发生改变的一帧,则以当前帧为界限,将当前帧的绘制命令列表及其后续帧的绘制命令列表均存储在数据容器中。

若判断得出第一帧的绘制命令列表与后续第二帧、第三帧的绘制命令列表均相同,则如图3、图4所示,将拦截获得的第一帧对应的OpenGL函数以及函数的参数内容进行记录,并将函数名及其参数内容存储在数据容器中,后续再对数据容器中的绘制命令进行帧循环。

与此同时,在所述包裹函数中定义有一个函数包变量,将包裹函数相关的OpenGL函数以及调用该包裹函数时传入的参数记录在函数包变量中,并将函数包变量存储在数据容器中。

本实施例的数据容器中存储有一系列的函数及其对应的参数内容,在帧循环里依次调用数据容器里的OpenGL函数和相关的参数,并将数据容器中的OpenGL函数名及其参数内容发送至所述绘制处理单元中,使所述绘制处理单元使用OpenGL函数绘制渲染图像,完成完整的绘制操作。

在需要刷新画面时只局部更新数据容器中少量的OpenGL函数及其参数内容,然后只遍历数据容器中的绘制命令并发送给GPU实现渲染,这样在渲染的过程中大量减少CPU端的运行时间,提高整个渲染的效率。

实施例二

本实施例提供一种基于OpenGL指令的渲染运行系统,其系统执行实施例一所述的渲染运行方法,如图5所示,本实施例的渲染运行系统具体包括如下模块:

发送模块,用于根据显示数据向所述绘制处理单元发送用于绘制渲染图像的绘制命令;

拦截模块,用于依次拦截并收集所有向绘制处理单元发送的绘制命令;

判断模块,用于将拦截收集所得的绘制命令进行条件判断,若当前帧所对应的绘制命令列表满足预设条件时,将当前帧所对应的绘制命令列表存储至数据容器中;

帧循环模块,用于从数据容器中取出绘制命令并依次发送至所述绘制处理单元以完成渲染图像的绘制操作。

实施例三

本实施例提供一种电子设备,其包括处理器、存储器及存储于所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现实施例一所述的基于OpenGL指令的渲染运行方法;另外,本实施例还提供一种存储介质,其上存储有计算机程序,所述计算机程序被执行时实现实施例一所述的基于OpenGL指令的渲染运行方法。

本实施例中的设备及存储介质与前述实施例中的方法是基于同一发明构思下的两个方面,在前面已经对方法实施过程作了详细的描述,所以本领域技术人员可根据前述描述清楚地了解本实施中的系统的结构及实施过程,为了说明书的简洁,在此就不再赘述。

上述实施方式仅为本发明的优选实施方式,不能以此来限定本发明保护的范围,本领域的技术人员在本发明的基础上所做的任何非实质性的变化及替换均属于本发明所要求保护的范围。

相关技术
  • 一种基于OpenGL指令的渲染运行方法及系统
  • 一种基于Hook技术获取OpenGL渲染画面的方法和系统
技术分类

06120113210351