基于vulkan实现图形渲染的方法及相关装置
技术领域
1.本技术涉及计算机图形技术领域,尤其涉及一种基于vulkan实现图形渲染的方法及相关装置。
背景技术:
2.随着终端技术的快速发展,电脑和手机等终端均可以通过安装不同的应用软件来实现各种各样的功能,比如说一个应用软件中设置了美颜、美妆、魔法表情等功能。由于多年的代码积累,目前这些功能都是基于开发图像库(open graphics library,opengl)或嵌入式开发图形库(opengl for embedded systems,opengl es)编写了相应的渲染器及图像引擎。但是,很多厂商正在规划采用vulkan来取代opengl es的应用,而对于多数应用软件而言,为了保留向前兼容性,opengl或opengl es依然会存在。
3.为了完成在不使用opengl es驱动的计算机系统中提供opengl es的功能技术实现,现有的一种简单的方法是直接用vulkan作为底层来实现opengl es。但是,直接用vulkan作为底层来实现opengl es的运行效率远低于原生opengl es驱动的运行效率,进而影响gpu进行图形渲染时的性能。
技术实现要素:
4.本技术实施例公开了一种基于vulkan实现图形渲染的方法及相关装置,能够提高gpu的渲染效率。
5.本技术实施例第一方面公开了一种基于vulkan实现图形渲染的方法,在该方法中,通过第一线程将异步执行的opengl es指令处理成为第一事件(event),第一事件可以包含异步执行的opengl es指令的描述信息;然后可以通过第二线程对第一事件进行处理得到第二任务(job),第二任务可以包含一个第一事件或多个第一事件,多个第一事件是根据相同或者不同的异步执行的opengl es指令处理得到的;再然后可以通过第三线程将第二任务保存到命令缓存区;最后可以通过vulkan接口向图像处理器gpu发送命令缓存区中的第二任务,其中,gpu用于根据第二任务完成图形渲染。
6.本技术实施例中,以vulkan作为后端来实现opengl es图形渲染,因为vulkan支持多线程并行处理,所以本技术实施例利用vulkan的多线程优势,在不同线程(例如第一线程、第二线程和第三线程)中对不同的事件或任务进行处理,比如说:通过第一线程将异步执行的opengl es指令处理成为第一事件event,通过第二线程接收第一事件event并将其处理成为第二任务job,在第三线程中将第二任务job保存到命令缓存区中,再通过vulkan接口向gpu发送命令缓存区,由gpu来完成图形渲染。并且,在第三线程对第二任务进行处理时,第二线程同样也还在对接收到的其他第一事件进行处理,第一线程也同样还在对接收到的其他异步执行的opengl es指令进行处理,可以看出各个线程是并行处理的,从而可以提高处理效率,因此也可以提高向gpu提交的频率,从而可以达到提升渲染效率的目的。来达到提升渲染效率的目的。
7.在第一方面的一种可能的实施方式中,通过第一线程将异步执行的opengl es指令处理成为第一事件event之前,还可以根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令。
8.可以看出,通过将opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令,可以针对性的对opengl es指令进行不同的处理,提高处理效率。
9.在第一方面的一种可能的实施方式中,状态设置与获得类型的opengl es指令属于同步执行的opengl es指令;对象生成和销毁类型的opengl es指令也属于同步执行的opengl es指令;数据上传类型的opengl es指令和绘制类型的opengl es指令均属于异步执行的opengl es。
10.在第一方面的一种可能的实施方式中,根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令之后,还可以通过第一线程将同步执行的opengl es指令的描述信息保存到数据结构,在保存完毕之后可以返回保存结果。
11.在第一方面的一种可能的实施方式中,根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令之后,还可以通过第一线程从数据结构中获得同步执行的opengl es指令的描述信息后,向所述图像处理器发送,所述图像处理器用于根据所述同步执行的opengl es指令的描述信息完成图形渲染;其中,第一线程可以是opengl es应用程序的渲染线程。
12.可以看出,第一线程可以为执行调用opengl es应用程序的渲染线程的线程,因此在第一线程中对同步执行的opengl es指令进行处理时,可以保证opengl es api对上层应用程序的单一线程可见。
13.在第一方面的一种可能的实施方式中,通过第二线程处理第一事件得到第二任务job可以具体表现为:在当前处理得到的第一事件属于预设的第一类型的情况下,执行通过第二线程处理第一事件得到第二任务job的步骤。
14.可以看出,在第二线程中通过第一事件的类型来控制第一事件处理成为第二任务的频率,可以控制向gpu提交的频率,避免gpu渲染性能的不稳定,提高gpu渲染应用的效率。
15.在第一方面的一种可能的实施方式中,通过第二线程处理得到第二任务job可以具体表现为:在当前处理得到的第一事件不属于预设的第一类型的情况下,若当前累计缓存的第一事件的数量大于第一阈值,则执行通过第二线程处理第一事件得到第二任务的步骤。
16.可以看出,在第二线程中通过第一事件的类型和缓存的第一事件的数量来控制第一事件处理成为第二任务的频率,进一步的,可以控制向gpu提交的频率,避免gpu渲染性能的不稳定,提高gpu渲染应用的效率。
17.在第一方面的一种可能的实施方式中,通过第二线程处理得到第二任务job可以具体表现为:在当前处理得到的第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值的情况下,若gpu的负载小于第一负载阈值,说明gpu此时可以进行处理,则执行通过第二线程处理得到第二任务的步骤,其中,第二阈值小于第一阈值;第一负载阈值可以是根据经验设定的,也可以是根据图形渲染时的处理的数据量的大小来综合确定的。容易理解的是,“等于”的情况也可以放到判断的另一个
分支中,比如大于或者等于第二阈值且小于第一阈值的情况。需要说明的是,gpu的当前负载小于第一负载也可以理解为,gpu此时的运行频点低于正常运行时的频点,或者,运行此gpu的电子设备没有出现发热严重和耗电快的问题。其中,该负载主要为gpu渲染过程中的负载。
18.可以看出,在第二线程中通过第一事件的类型、缓存的第一事件的数量和gpu的负载来控制第一事件处理成为第二任务的频率,进一步的,可以控制向gpu提交的频率,避免gpu渲染性能的不稳定,提高gpu渲染应用的效率。
19.在第一方面的一种可能的实施方式中,通过第二线程处理第一事件得到第二任务job可以具体表现为或等于:在当前处理得到的第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值时的情况下,若gpu的负载大于或等于第一负载阈值,说明gpu已经无法再进行处理时,则将第一事件进行缓存处理,其中,第二阈值小于第一阈值。容易理解的是,“等于”的情况也可以放到判断的另一个分支中,比如大于或等于第二阈值且小于第一阈值的情况。需要说明的是,gpu的负载大于或等于第一负载也可以理解为,gpu此时的运行频点高于正常运行时的频点,或者,运行此gpu的电子设备出现发热严重和耗电快的问题。其中,该负载主要为gpu渲染过程中的负载。可以看出,在第二线程中通过第一事件的类型、缓存的第一事件的数量和gpu的负载来控制第一事件处理成为第二任务的频率,比如在gpu无法在进行处理时,可以将第一事件进行缓存,不向gpu提交,避免gpu渲染性能的不稳定。
20.在第一方面的一种可能的实施方式中,第二任务可以包含多个第一事件,通过第三线程将第二任务缓存到命令缓存区具体表现为:通过第三线程对第二任务中的多个第一事件进行排序;将排序后的第二任务缓存到命令缓存区。
21.可以看出,gpu需要根据命令缓存区中的第二任务来完成图形渲染,而第二任务中包含多个第一事件,第一事件包含异步执行的opengl es指令的描述信息,gpu最终是根据异步执行的opengl es指令的描述信息来完成图形渲染的,所以在第三线程中对第二任务中的多个第一事件进行排序,利用vulkan可以直接操作gpu硬件底层的优化,将随意排列的第一事件进行整合,进而更有效的利用gpu硬件资源。
22.在第一方面的一种可能的实施方式中,通过第三线程对第二任务中的多个第一事件进行排序具体可以表现为:通过第三线程基于第二任务中的多个第一事件对应的管线pipeline状态对第二任务中的多个第一事件进行排序。
23.可以看出,第二任务包含多个第一事件,而多个第一事件可能对应同一管线状态,而每一个管线状态都需要通过绘制来进行图像渲染,因而利用vulkan可以直接操作gpu硬件底层的优化,通过多个第一事件可能对应同一管线状态的优化策略在第三线程中对第二任务中的多个第一事件进行排序,可以更有效的利用gpu硬件资源。
24.在第一方面的一种可能的实施方式中,第二任务中的多个第一件事对应同一管线pipeline状态的第一事件被排序在一起。
25.可以看出,因为每一个管线状态都需要通过绘制指令来进行图像渲染,所以当多个可能对应同一管线状态的第一事件排序在一起时,可以只调用一次绘制指令来完成图形渲染,因而进行重排后的第一事件可以减少在绘制过程中的切换次数,提高gpu的运行效率。
26.在第一方面的一种可能的实施方式中,第二任务包含多个第一事件,通过第三线程将第二任务缓存到命令缓存区具体表象为:通过第三线程将第二任务中的多个第一事件对应同一个变量进行修改的第一事件进行排序;基于变量对第二任务中排序后的第一事件进行修改;将排序后进行修改的第二任务缓存到命令缓存区。
27.可以看出,gpu需要根据命令缓存区中的第二任务来完成图形渲染,而第二任务中包含多个第一事件,第一事件包含异步执行的opengl es指令的描述信息,gpu最终是根据异步执行的opengl es指令的描述信息来完成图形渲染的,而多个第一事件可能对应同一个变量来进行修改,需要将每一个将修改完的第一事件上传给gpu来完成图形渲染,所以利用vulkan可以直接操作gpu硬件底层的优化,通过多个第一事件对应同一个变量来进行修改的优化策略在第三线程中对第二任务中的多个第一事件进行排序,将随意排列的第一事件进行整合,可以更有效的利用gpu硬件资源。
28.在第一方面的一种可能的实施方式中,多个事件中对应同一变量进行修改的第一事件被排序在一起。
29.可以看出,因为需要将每一个将修改完的第一事件上传给gpu来完成图形渲染,所以当多个第一事件可能对应同一变量进行修改的第一事件排序在一起时,不需要修改一次上传给gpu一次,可以全部修改完毕后再上传给gpu,减切换频率,提高gpu的运行效率。
30.在第一方面的一种可能的实施方式中,通过第一线程将异步指令处理成为第一对象,包括:通过第一线程获取异步的opengl es指令的描述信息;将异步的opengl es指令的描述信息和异步的opengl es指令封装成为第一对象。
31.本技术实施例第二方面公开了一种基于vulkan实现图形渲染的装置,包括:
32.上下文模块,用于通过第一线程将异步执行的opengl es指令处理成为第一事件event,第一事件包含异步执行的opengl es指令的描述信息;
33.事件管理模块,用于通过第二线程处理第一时间得到第二任务job,第二任务包含一个第一事件或多个第一事件,多个第一事件是根据相同或者不同的异步执行的opengl es指令处理得到的;
34.事件包装模块,用于通过第三线程将第二任务保存到命令缓存区;
35.任务调度模块,用于通过vulkan接口向gpu图形处理器发送命令缓存区中的第二任务,其中,图形处理器用于根据第二任务完成图形渲染。
36.在第二方面的一种可能的实施方式中,上下文模块,还用于根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令。
37.在第二方面的一种可能的实施方式中,状态设置与获得类型的opengl es指令和对象生成和销毁类型的opengl es指令均属于同步执行的opengl es指令;数据上传类型的opengl es指令和绘制类型的opengl es指令均属于异步执行的opengl es。
38.在第二方面的一种可能的实施方式中,上下文模块,还用于通过第一线程将同步执行的opengl es指令的描述信息保存到数据结构。
39.在第二方面的一种可能的实施方式中,上下文模块,还用于通过第一线程从数据结构中获得同步执行的opengl es指令的描述信息后,向所述图像处理器发送,所述图像处理器用于根据所述同步执行的opengl es指令的描述信息完成图形渲染。
40.在第二方面的一种可能的实施方式中,事件管理模块,具体用于:在第一事件属于预设的第一类型时,执行通过第二线程处理得到第二任务job的步骤。
41.在第二方面的一种可能的实施方式中,事件管理模块,具体用于:在第一事件不属于预设的第一类型时,若当前累计缓存的第一事件的数量大于第一阈值,则执行通过第二线程处理第一事件得到第二任务的步骤。
42.在第二方面的一种可能的实施方式中,事件管理模块,具体用于:在第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于第一阈值时,若gpu的负载小于第一负载阈值,则执行通过第二线程处理第一事件得到第二任务的步骤,第二阈值小于所述第一阈值。
43.在第二方面的一种可能的实施方式中,事件管理模块,具体用于:在第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值时的情况下,若gpu的负载大于第一预设阈值,则缓存第一事件。
44.在第二方面的一种可能的实施方式中,事件包装模块,具体用于:通过第三线程对第二任务中的多个第一事件进行排序;将排序后的第二任务缓存到命令缓存区。
45.在第二方面的一种可能的实施方式中,事件包装模块,具体用于通过第三线程基于多个第一事件对应的管线pipeline状态对第二任务中的多个第一事件进行排序。
46.在第二方面的一种可能的实施方式中,多个第一件事对应同一管线pipeline状态的第一事件被排序在一起。
47.在第二方面的一种可能的实施方式中,事件包装模块,具体用于:通过第三线程将第二任务中的多个第一事件对应同一个变量进行修改的第一事件进行排序;基于变量对第二任务中排序后的第一事件进行修改;将排序后进行修改的第二任务缓存到命令缓存区。
48.在第二方面的一种可能的实施方式中,多个事件中对应同一变量进行修改的第一事件被排序在一起。
49.在第二方面的一种可能的实施方式中,上下文模块,具体用于:通过第一线程获取异步的opengl es指令的描述信息;将异步的opengl es指令的描述信息和异步的opengl es指令封装成为第一对象。
50.关于第二方面或具体的实现方式所带来的技术效果,可参考对于第一方面或相应的实施方式的技术效果的介绍。
51.本技术实施例第三方面提供了一种电子设备,电子设备包括处理器和存储器;处理器用于执行存储器存储的计算机指令,使得电子设备实现第一方面或者第一方面的任意一种可能的实施方式所描述方法。
52.本技术实施例第四方面提供了一种计算机可读存储介质,计算机可读存储介质中存储有计算机指令,当所述计算机指令被一个或多个处理器执行时促使所述一个或多个处理器实现第一方面或者第一方面的任意一种可能的实施方式所描述方法。
53.本技术实施例第五方面提供了一种计算机程序产品,其特征在于,所述计算机程序产品中存储有计算机指令,当所述计算机指令被一个或多个处理器执行时促使一个或多个处理器实现第一方面或者第一方面的任意一种可能的实施方式所描述方法。
附图说明
54.以下对本技术实施例用到的附图进行介绍。
55.图1是本技术实施例提供的一种实现opengl es的架构示意图;
56.图2是本技术实施例提供的一种基于vulkan实现图形渲染的架构示意图;
57.图3是本技术实施例提供的一种基于vulkan实现图形渲染方法的流程示意图;
58.图4是本技术实施例提供的一种基于vulkan实现图形渲染的组件结构示意图;
59.图5a是本技术实施例提供的一种在opengl es实现层对opengl es指令进行分类的流程示意图;
60.图5b是本技术实施例提供的一种同步执行的opengl es指令的处理流程示意图;
61.图5c是本技术实施例提供的一种异步执行的opengl es指令的处理流程示意图;
62.图5d是本技术实施例提供的一种处理得到第二任务的流程示意图;
63.图5e是本技术实施例提供的一种处理第二任务的流程示意图;
64.图5f是本技术实施例提供一种的按照策略一进行重排的示意图;
65.图5g是本技术实施例提供一种的按照策略二进行重排的示意图;
66.图5h是本技术实施例提供的一种向gpu发送命令缓存区中的第二任务的流程示意图;
67.图6是本技术实施例提供的一种电子设备的结构示意图。
具体实施方式
68.下面结合本技术实施例中的附图对本技术实施例进行描述。需要说明的是,本技术中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本技术中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其他实施例或设计方案更优选或更具优势,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。
69.下面先对本技术涉及到的相关技术和专业术语进行简单的介绍以方便理解。
70.1、开放图形库或者开放式图形库(open graphics library,opengl)
71.opengl是用于渲染2d、3d矢量图形的跨语言、跨平台的应用程序编程接口(api)。这个接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。而另一种程序接口系统是仅用于microsoft windows上的direct3d。opengl常用于虚拟实境、科学可视化程序和电子游戏开发。
72.opengl的高效实现(利用了图形加速硬件)存在于windows,部分unix平台和mac os。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。opengl的api定义了若干可被客户端程序调用的函数,以及一些具名整型常量(例如,常量gl_texture_2d对应的十进制整数为3553)。虽然这些函数的定义表面上类似于c编程语言,但它们是语言独立的。
73.2、嵌入式开发图形库(opengl for embedded systems,opengl es)
74.opengl es是opengl三维图形api的子集,针对手机、pda和游戏主机等嵌入式设备而设计。该api由khronos集团定义推广,khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。
75.opengl es是从opengl裁剪的定制而来的,去除了glbegin/glend,四边形(gl_
quads)、多边形(gl_polygons)等复杂图元等许多非绝对必要的特性。经过多年发展,现在主要有两个版本,opengl es 1.x针对固定管线硬件的,opengl es 2.x针对可编程管线硬件。opengl es 1.0是以opengl 1.3规范为基础的,opengl es 1.1是以opengl 1.5规范为基础的,它们分别又支持common和common lite两种profile。lite profile只支持定点实数,而common profile既支持定点数又支持浮点数。opengl es 2.0则是参照opengl 2.0规范定义的,common profile发布于2005-8,引入了对可编程管线的支持。
76.3、vulkan(一个跨平台的绘图应用程序接口)
77.vulkan是一个跨平台的2d和3d绘图应用程序接口(api),最早由科纳斯组织(khronos group)在2015年游戏开发者大会(gdc)上发表。
78.科纳斯最先把vulkanapi称为“下一代opengl行动”(next generation opengl initiative)或“glnext”,但在正式宣布vulkan之后这些名字就没有再使用了。就像opengl,vulkan针对实时3d程序(如电子游戏)设计,vulkan并计划提供高性能和低cpu管理负担(overhead)。
79.同opengl一样,vulkan也由khronos集团开发。它是amd mantle的后续版本,继承了前者强大的低开销架构,使软件开发人员能够全面获取radeon gpu与多核cpu的性能、效率和功能。
80.相对于opengl,vulkan大幅降低了cpu在提供重要特性、性能和影像质量时的“api开销”(cpu在分析游戏的硬件需求时所执行的后台工作),而且可以使用通常通过opengl无法访问的gpu硬件特性。
81.4、egl
82.egl是渲染api(如opengl es)和底层native平台窗口系统之间的接口。eglapi是独立于opengl es各版本标准的独立api,其主要作用为opengl指令创建上下文context等。通常来说,opengl是一个操作gpu的api,它通过驱动向gpu发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的。因此egl被设计出来,作为opengl和原生窗口系统之间的桥梁。
83.5、应用程序接口(application programming interface,api)
84.api是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。
85.该接口是为程序员在编程时使用的,系统和应用程序通过这个接口,可在执行中访问系统中的资源和取得os的服务,它也是程序能取得操作系统服务的唯一途径。大多数操作系统的程序接口是由一组系统调用(system call)组成,每一个系统调用都是一个能完成特定功能的子程序。
86.应用程序接口又称为应用编程接口,是一组定义、程序及协议的集合,通过api接口实现计算机软件之间的相互通信。api的一个主要功能是提供通用功能集。api同时也是一种中间件,为各种不同平台提供数据共享。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的可维护性和可扩展性。
87.6、后端(backend)
88.在软件工程和程序设计领域,后端是在后台工作的,控制着前端的内容,主要负责程序设计架构思想,管理数据库等。后端更多的是与数据库进行交互以处理相应的业务逻辑,需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能等。
89.7、前端(frontend)
90.在软件工程和程序设计领域,前端是软件系统中直接和用户交互的部分。对于web前端来说,通常是指网站的前台部分,包括网站的表现层和结构层:web页面的结构、web的外观视觉表现以及web层面的交互实现。
91.前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站的视觉设计,前端开发则是网站的前台代码实现。
92.8、驱动(driver,device)
93.驱动,计算机软件术语,是指驱动计算机里软件的程序。驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息。此信息能够使计算机与相应的设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。
94.9、渲染通道(render pass)
95.渲染通道通常指的是多通道渲染技术,在多通道渲染技术中,一个物体我们需要多次渲染,每个渲染过程的结果会被累加到最终的呈现结果上。而这些渲染过程,一般是:灯光、阴影、反射、高光和全局光照。多pass是为了实现一个pass实现不了的效果,pass之间是相互依赖的,后面的pass会用到前面pass的数据(深度、几何信息),最后的pass出来的数据才是帧缓冲中的数据,所以pass之间的关系可以形象的比喻为一道道工序。
96.10、渲染管线(rendering pipeline)
97.渲染管线,也称渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。渲染管线就是要把一系列的顶点数据,纹理等信息,最终转换成一张人眼可以看到的图像。这个过程由cpu和gpu共同完成。
98.11、命令缓冲区(command buffer)
99.命令缓冲区是若干命令的集合。它会被提交给适当的硬件队列供gpu进行处理,然后,在真正的gpu处理开始之前,驱动程序会提取命令缓冲区对其进行验证和编译。命令缓冲区记录了应用程序预计执行的各种vulkan api命令。一旦命令缓冲区经过了烘焙,就可以一遍又一遍地重复使用。他们按照应用程序指定的顺序记录这些命令。这些命令用于执行不同类型的作业;这其中包括绑定顶点缓冲区,管线绑定,记录render pass命令,设置视口和裁剪,指定绘图命令,控制图像和缓冲区内容的复制操作等。
100.12、uniform变量
101.uniform是图形渲染系统的渲染过程中使用的一种数据类型,uniform是变量类型的一种修饰符,是opengl es中被着色器中的常量值,使用存储各种着色器需要的数据,例如:转换矩阵、光照参数或者颜色。
102.13、绘制调用(draw call)
103.draw call是cpu对gpu的一种命令,仅仅指向一个需要被渲染的图元列表。“绘制指令”可以是一条指令,例如一个api调用函数;也可以是多条指令的集合,例如在opengl中,一个draw call通常包含多个api调用函数,这一个draw call可以认为是一个绘制指
令,完成一次绘制。一个draw call可以绘制一个绘制目标,也可以多个draw call绘制一个绘制目标或一个draw call绘制多个绘制目标。
104.14、异步执行
105.异步执行是指在异步执行模式下,各语句执行结束的顺序与语句执行开始的顺序并不一定相同。例如查询操作,客户机上的应用程序在向服务器发出了查询操作的指令后,将立刻执行查询指令的下一条语句,不需要等到服务器将查询结果返回客户机端。即,异步执行某项任务时,可以在该任务完成之前转移到另一个任务。异步执行方式使应用程序能摆脱单个任务的牵制,提高了灵活性和应用程序的执行效率。
106.15、同步执行
107.同步执行是任何由多个任务组成的进程中,其中的任务需要按顺序执行,等待前一个任务执行返回结果后,才可以执行下一个任务。
108.目前,计算机图像技术领域的发展现状如下:
109.在终端和桌面系统中,图形系统的api层(或称驱动)在不断的发生变化,opengl es和vulkan目前虽然同时对应用层提供支撑,但是未来的趋势是vulkan可能会逐步取代opengl es,而为了保留向前兼容性,opengl es依然会存在。
110.由于gpu硬件和操作系统的升级,图形系统的api层也会不断的同步更新,而这可能会带来如下几个方面问题:1、同时维护opengl es和vulkan将会造成软件系统的庞大臃肿;2、两个api模块重叠会导致工程复杂度;3、同时维护两个api系统也会导致大量的工程资源浪费。
111.为了完成在不使用opengl es api驱动的系统中提供opengl es api的功能,通常采用的方法是直接用vulkan作为底层来实现opengl es。请参见图1,图1是本技术实施例提供的一种实现opengl es的架构示意图。从图1可以看出架构10配置有一种或多种后端,比如opengl105a、vulkan105b、direct3d105c,等等,每一种后端有其对应的driver驱动,比如opengl105a对应opengl driver106a,vulkan105b对应vulkan driver106b、direct3d105c对应direct3d driver106c,通过架构10可以根据不同平台和配置采用不同的后端来实现opengl es。比如说,若应用程序为安装在部署了安卓android系统的电子设备上,则可以采用vulkan driver106b来实现opengl es图形渲染。
112.通过图1所示的架构100,电子设备可以从egl/opengl入口层获取到应用程序调用api的opengl es指令,通过处理模块103获取opengl es指令所对应的状态数据。由于架构10支持一种或多种后端,所以可以将opengl es指令对应的状态数据先保存在前端104中。根据所采用的后端(比如说vulkan105b),将前端104中保存的状态数据转换成所采用的后端对应的状态数据后,再将后端对应的状态数据生成对应的后端指令后向对应的驱动(比如说vulkan driver106b)提交,再由对应的驱动向gpu提交来完成调用,从而可以实现opengl es图形渲染。
113.本技术发明人发现,从获取opengl es api的调用数据,到前端将调用数据进行保存以及再把前端保存的调用数据转换成后端对应的数据,都是单一线程中对opengl es api进行转换并运行,不能充分发挥vulkan多线程的优势。导致与原生opengl es驱动实现相比,在单一线程内执行转换操作可能会增加额外的cpu运行时间,导致渲染效率降低。另外,虽然在架构设计上满足通用性(支持多种后端),但是缺乏针对某种后端(例如vulkan)
进行特定的架构设计以及适合的优化方法,导致没有充分发挥vulkan的优势,在资源利用率上存在局限性。
114.为了解决上述问题,本技术提出了一种基于vulkan实现图形渲染的方法及相关装置,该方法包括:
115.电子设备接收应用程序调用的opengl es指令,将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令,通过第一线程将异步执行的opengl es指令处理成为第一事件,通过第一线程将同步执行的opengl es指令的描述信息保存到数据结构中或者从数据结构中获得同步执行的opengl es指令的描述信息;通过无锁队列将第一事件向第二线程发送,通过第二线程处理第一事件得到第二任务,其中,第二任务包含一个第一事件或多个第一事件;然后再通过第三线程将第二任务缓存到命令缓存区command buffer,通过vulkan接口向gpu发送命令缓存区中的第二任务。最后,由gpu根据第二任务完成图形渲染。基于提出的多线程架构可以采用多种优化技术(例如动态控制gpu指令提交和gpu指令重排等技术)来充分利用cpu和gpu资源,提高运行效率。
116.通过本技术实施例,以vulkan为后端来实现opengl es图形渲染,因为vulkan支持多线程并行处理,所以在本技术实施例中利用了vulkan的多线程优势,在不同线程(例如第一线程、第二线程和第三线程)对不同的事件或任务进行处理。同时,以vulkan为后端来实现opengl es图形渲染,可以在更多的设备和系统上使用opengl es api,增加了opengl es api的通用性,可以使不支持opengl es api的设备也可以运行opengl es应用。对于设备厂商和系统来说,可以减少对opengl es驱动的维护成本,不需要在支持多个图形api的设备上维护多个图形api驱动,精简软件系统。
117.请参见图2,图2是本技术实施例提供的一种基于vulkan实现图形渲染的架构示意图。从图2可以看出,架构200可以包括应用程序201、egl/opengl入口202、上下文模块203、事件管理模块204、事件打包模块205、任务调度模块206、vulkan driver207。在应用程序201运行时,应用程序201可以调用opengl es api,通过egl/opengl入口202获取到调用的opengl es指令和相关参数。然后,将调用的opengl es指令和相关参数由上下文模块203进行处理,上下文模块203将其转换为相应的状态数据和gpu指令后再发送给事件管理模块204,由事件管理模块204对其进行批量打包,之后,在事件打包模块205将打包后的指令和状态信息等数据转换成为vulkan command buffer,最后由任务调度模块206将command buffer中的数据发送给gpu,由gpu来完成图形渲染。其中,各个模块的功能介绍如下:
118.应用程序201,包括但不限于游戏应用、视频应用、聊天通讯应用、拍照应用等。需要说明的是,上述应用程序为使用opengl es api的应用程序。上述应用程序可以安装在电子设备上,电子设备可以但不限于膝上型计算机、台式计算机、移动电话、移动终端(例如智能手机)、可穿戴设备、车载设备、物联网设备或者其他能够进行图形渲染处理的设备,该电子设备可以是运行安卓系统、ios系统、windows系统以及其他系统的设备。
119.egl/opengl es入口202,用于在应用程序201进行api调用时,获取应用程序201的opengl es指令。
120.上下文(context)模块203,运行在第一线程。因为可以将多个opengl es指令分类为异步的opengl es指令和同步的opengl es指令,所以对于同步的opengl es指令来说,在一种可能的实现方式中,上下文(context)模块203用于根据同步的opengl es指令的类型
(比如opengl es指令为状态设置类型)将同步的opengl es指令的描述信息保存到数据结构中,或者用于根据同步的opengl es指令的类型(比如opengl es指令为状态获得类型)从数据结构中获得同步的opengl es指令的描述信息,上下文(context)模块203还可以通过vulkan driver207将同步的opengl es指令的相关描述信息向gpu发送,由gpu来完成图像渲染。
121.对于异步的opengl es指令来说,上下文(context)模块203可以根据异步的opengl es指令的类型(比如说opengl es指令为绘制类型)通过第一线程将异步的opengl es指令处理成为第一事件event,然后将第一事件event通过无锁的队列发送给事件管理模块event manager204。其中,第一事件包含异步的opengl es指令的描述信息。
122.在一种可能的实现方式中,上下文(context)模块203可以通过第一线程在对应的数据模块中获取异步的opengl es指令的描述信息,然后将异步的opengl es指令的描述信息和异步的opengl es指令封装成为第一对象。需要说明的是,描述信息包括opengl es指令的状态值。opengl es是状态集,那么在绘制中会牵扯到各种各样的状态,这些状态可能全部都有默认值,可以通过opengl es对这些状态进行改变,这些状态值就会保存在context中。比如opengl es所用到的混合模式、纹理图片、program等信息。
123.事件管理event manager模块204,运行在第二线程,用于根据第一事件的类型、第一事件的缓存数量或者gpu负载中的一项或多项来动态控制将第一事件提交给事件打包模块205的提交频率。若确定需要将第一事件向事件打包模块205发送,则通过第二线程该第一事件处理得到第二任务job,再将第二任务发送给打包模块205。其中,第二任务包含一个第一事件或多个第一事件。
124.在一种可能的实现方式中,在当前处理得到的第一事件属于预设的第一类型的情况下,事件管理event manager模块204执行通过第二线程处理得到第二任务job的步骤。
125.在一种可能的实现方式中,在当前处理得到的第一事件不属于预设的第一类型的情况下,若当前累计缓存的第一事件的数量大于第一阈值,事件管理event manager模块204执行通过第二线程处理得到第二任务的步骤。
126.在一种可能的实现方式中,在当前处理得到的第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值的情况下,若当前gpu的负载小于第一负载阈值,说明gpu此时可以进行处理,则事件管理event manager模块204执行通过第二线程处理第一事件得到第二任务的步骤。其中,第二阈值小于第一阈值;第一负载阈值可以是根据经验设定的,也可以是根据图形渲染时的处理的数据量的大小来综合确定的。容易理解的是,“等于”的情况也可以放到判断的另一个分支中,比如大于或等于第二阈值且小于第一阈值的情况。需要说明的是,gpu的当前负载小于第一负载也可以理解为,gpu此时的运行频点低于正常运行时的频点,或者,运行此gpu的电子设备没有出现发热严重和耗电快的问题。其中,该负载主要为gpu渲染过程中的负载。在一种可能的实现方式中,在当前处理得到的第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值时的情况下,若当前gpu的负载大于第一负载阈值,事件管理event manager模块204将第一对象进行缓存处理。其中,第二阈值小于第一阈值。容易理解的是,“等于”的情况也可以放到判断的另一个分支中,比如大于或等于第二阈值且小于第一阈值的情况。需要说明的是,gpu的负载大于或等于第一负载也可以理解为,
gpu此时的运行频点高于正常运行时的频点,或者,运行此gpu的电子设备出现发热严重和耗电快的问题。其中,该负载主要为gpu渲染过程中的负载。事件包装event wrapper模块205,运行在第三线程,用于根据具体的优化策略对第二任务中包含的第一事件进行排序,然后将排序后的第二任务缓存到命令缓存区,再将命令缓存区中的第二任务发送给任务调度模块206。
127.在一种可能的实现方式中,事件包装模块event wrapper205通过第三线程基于第二任务中的多个第一事件对应的管线pipeline状态对第二任务中的多个第一事件进行排序。其中,第二任务中的多个第一件事对应同一管线pipeline状态的第一事件被排序在一起。
128.在一种可能的实现方式中,事件包装模块event wrapper205通过第三线程将第二任务中的多个第一事件对应同一个变量修改的第一事件进行排序;然后基于变量对第二任务中排序后的第一事件进行修改;最后将排序后进行修改的第二任务缓存到命令缓存区。
129.任务调度单元job dispatcher207,运行在第二线程,用于通过vulkan接口向gpu发送命令缓存区中的第二任务,其中,gpu用于根据第二任务完成图形渲染。
130.需要说明的是,本技术实施例所提及的第一线程、第二线程和第三线程为相互独立的三个线程,在不同线程中进行不同的处理流程。比如在第一线程中将异步的opengl es指令处理成为第一事件event,在第二线程将第一事件event处理成为第二任务job,在第三线程中对将第二任务job缓存到命令缓存区command buffer中。并且,在第三线程对第二任务进行处理时,第二线程同样也还在对接收到的其他第一事件进行处理,第一线程也同样还在对接收到的其他异步执行的opengl es指令进行处理,可以看出各个线程是并行处理的,从而可以提高处理效率,因此也可以提高向gpu提交的频率,从而可以达到提升渲染效率的目的。
131.请参见图3,图3是本技术实施例提供的一种基于vulkan实现图形渲染方法的流程示意图,可选的,该方法可以基于图2所示的架构来实现。图3所示的基于vulkan实现图形渲染方法至少包括如下步骤:
132.步骤s301:电子设备将多个opengl es指令分类为异步的opengl es指令和同步的opengl es指令。
133.具体地,电子设备可以为支持windows、android安卓、类unix、linux、macos等平台的终端设备,可以但不限于是膝上型计算机、台式计算机、移动电话、智能手机、平板电脑、多媒体播放器、电子阅读器、智能车载设备、智能家电、人工智能设备、穿戴式设备、物联网设备、或虚拟现实/增强现实/混合现实设备等。
134.对于opengl es api来说,通常可以存在以下四种类型:状态设置与获得、对象生成和销毁、数据上传和下载、绘制。请参见表1,表1是本技术实施例提供的opengl es api的描述。从表1可以看出,本技术实施例可以根据opengl es api的类型将opengl es指令分类为异步的opengl es指令和同步的opengl es指令。比如,将状态设置与获得类型的api,以及对象生成和销毁类型的api所对应的opengl es指令划分为同步的opengl es指令;将数据上传类型的api,以及绘制类型的api所对应的opengl es指令划分为异步的opengl es指令。
135.表1opengl es api的描述
[0136][0137]
因此,当电子设备通过egl/opengl es入口层获取到应用程序的opengl es指令后,可以通过预先对opengl es指令设置的分类,通过步骤s302a对同步的opengl es指令进行处理,通过步骤s302b对异步的opengl es指令进行处理。
[0138]
步骤s302a:电子设备通过第一线程对同步的opengl es指令进行处理。
[0139]
具体地,电子设备在上下文context模块中,通过第一线程处理同步的opengl es指令(例如,状态设置与获得、对象生成和销毁)时,将同步的opengl es指令的描述信息保存到context模块对应的数据结构中,或者从context模块对应的数据结构中获得同步的opengl es指令的描述信息。电子设备在调用opengl es api完成相应的工作后,需要返回结果表明此次调用结束了才可以继续调用下一个api,其中,返回的可以是空结果,也即没有包含任何信息的结果。
[0140]
举例来说,若电子设备在上下文context模块中,接收到的第一个opengl es指令为状态设置类型,opengl es指令所携带的内容为写入a=1、b=2,因此将a=1以及b=2保存到context模块对应的数据结构中后,返回表示完成保存的结果;若电子设备在上下文context模块中,接收到的第二个opengl es指令为状态获得类型,opengl es指令所携带的内容为读取a和b,则从context模块对应的数据结构中获取a和b的状态值后,向图像处理器gpu发送,其中,图像处理器可以用于根据同步执行的opengl es指令的描述信息完成图形渲染;若电子设备在上下文context模块中,接收到的第三个opengl es指令为对象销毁类型,opengl es指令所携带的内容为删除a和b,则从context模块对应的数据结构中删除a和b的状态值后,返回表示完成删除的结果。
[0141]
步骤s302b:通过第一线程将异步的opengl es指令处理成为第一事件。
[0142]
具体地,电子设备调用opengl es api后,在context模块通过第一线程处理异步的opengl es指令(例如,数据上传类型、绘制类型)时,可以根据context模块对应的数据结构中保存的状态值和opengl es指令生成第一事件event。可以理解的是,第一事件event包括异步的opengl es指令此时的状态值和opengl es指令的内容信息。举例来说,若电子设备在上下文context模块中,接收到的opengl es指令为绘制类型,opengl es指令所携带的
内容为a+b=c,则从context模块对应的数据结构中获取a和b的状态值,然后根据a和b的状态值,以及a+b=c,等描述信息生成第一事件。
[0143]
然后,电子设备在将第一事件发送给event manager模块后,api调用可以就此返回。由于context模块运行在第一线程,而event manager模块运行在第二线程,可选地,运行在不同线程的两个模块之间可以通过无锁的先进先出队列发送或接收数据。
[0144]
其中,不同的第一事件具有不同的属性(比如是否需要等待执行结果)。例如,对于eglswapbuffers接口来说,需要等待gpu渲染完成这一帧的结果并且返回结果。因此,处于第一线程的context模块需要阻塞等待处于第二线程的event manager模块和job dispatcher模块完成向gpu发送指令,然后等待gpu完成这一帧的渲染工作,最后将这一帧的内容通过屏幕呈现出来。
[0145]
再例如,对于数据上传或者绘制指令等opengl es api在context模块处理得到的第一事件来说,电子设备通过context模块直接将第一事件发送给event manager模块之后,可以不需要等待返回结果,而继续接收并执行应用程序调用的下一个opengl es api。可以看出,向gpu发送指令的操作不在第一线程,因此这一部分的cpu负载分担到了别的线程,所以应用逻辑在第一线程中可以获得更加充分的计算资源,提升整体应用的性能。
[0146]
需要说明的是,第一线程可以是应用程序对应的渲染线程。
[0147]
步骤s303:电子设备通过第二线程处理得到第二任务。
[0148]
具体地,电子设备在event manager模块中,可以接收来自context模块发送的第一事件时,通过event manager模块可以在第二线程根据第一事件的类型来判断是否需要将第一事件处理得到第二任务job。若需要,则将第一事件打包成为第二任务,若不需要,则将第一事件缓存起来。
[0149]
在一种可能的实现方式中,若当前处理得到的第一事件属于预设的第一类型,预设的第一类型可以是opengl es api的指令为glfinish/glflush/glreadpixels等指令,或者opengl es api为大块数据上传类型且上传数据大于预设阈值,比如glbufferdata,glsubbufferdata等。则在event manager模块中,通过第二线程将第一事件立即处理得到第二任务。所谓立即处理,可以认为需要立即处理的第一事件的处理顺序排列在第一位,即接收到需要立即处理的第一事件后,在可能的情况下首先处理上述第一事件。举例来说,若电子设备在event manager模块中接收到的第一事件中包含的异步的opengl es指令属于glfinish/glflush/glreadpixels中的一项或多项时,则将当前处理得到的第一事件处理成为第二任务。其中,第二任务可能包含当前处理的第一事件,或者当前处理的第一事件和缓存的第一事件。
[0150]
在一种可能的实现方式中,若当前处理得到的第一事件不属于预设的第一类型,则说明当前处理得到的第一事件为不需要立即处理得到第二任务,因此可以将第一事件在event manager模块中缓存起来,需要处理时再通过第一线程将在event manager模块中缓存的第一事件打包成为第二任务。举例来说,若电子设备在event manager模块中接收到的第一事件中包含的异步的opengl es指令不属于glfinish/glflush/glreadpixels中的任意一项,或者不属于大块数据上传类型中的glbufferdata,glsubbufferdata时,可以先将第一事件缓存起来。
[0151]
在一种可能的实现方式中,在当前处理得到的第一事件不属于预设的第一类型的
情况下,若当前累计缓存的第一事件的数量大于第一阈值,则可以通过第一线程将缓存的第一事件打包成为第二任务。需要说明的是,第一阈值可根据实际情况进行设置,第一阈值可以是第一事件的打包数量的最大值,本技术实施例不对其进行限制。举例来说,在电子设备在event manager模块中接收到的第一事件中包含的异步的opengl es指令不属于glfinish/glflush/glreadpixels中的任意一项,或者不属于大块数据上传类型中的glbufferdata,glsubbufferdata的情况下,若在event manager模块中缓存的第一事件的数量大于第一阈值,则可以将当前处理的第一事件打包成为第二任务,或者将当前处理的第一事件和缓存的第二时间一起打包成为第二任务。
[0152]
在一种可能的实现方式中,在当前处理得到的第一事件不属于预设的第一类型,且在当前累计缓存的第一事件的数量大于第二阈值且小于第一阈值的情况下,若当前gpu的负载过小,也即小于第一负载阈值时,则可以通过第一线程将当前处理得到的第一事件打包成为第二任务。其中,第二阈值小于第一阈值。第一阈值和第二阈值可根据实际情况进行设置,本技术实施例不对其进行限制。举例来说,在电子设备在event manager模块中接收到的第一事件中包含的异步的opengl es指令不属于glfinish/glflush/glreadpixels中的任意一项,或者不属于大块数据上传类型中的glbufferdata,glsubbufferdata的情况下,若在event manager模块中缓存的第一事件的数量在允许缓存的数量内,但是此时的gpu的负载比较轻,则可以将当前处理得到第一事件打包成为第二任务,或者将当前处理的第一事件和缓存的第二时间一起打包成为第二任务。
[0153]
在一种可能的实现方式中,在当前累计缓存的第一事件的数量大于第二阈值且小于第一阈值的情况下,若当前gpu的负载过大,也即大于或等于第一负载阈值时,则可以将第一事件在event manager模块中缓存起来,需要处理时再通过第一线程将在event manager模块中缓存的第一事件打包成为第二任务。举例来说,在电子设备在event manager模块中接收到的第一事件中包含的异步的opengl es指令不属于glfinish/glflush/glreadpixels中的任意一项,或者不属于大块数据上传类型中的glbufferdata,glsubbufferdata的情况下,若在event manager模块中缓存的第一事件的数量在允许缓存的数量内,但是此时的gpu的负载过重,不适合向gpu提交,则可以将当前处理得到第一事件缓存起来延后提交。需要说明的是,第一负载阈值可以根据经验设定,或者也可以根据图形渲染时的处理的数据量的时间来综合决定,或者也可以根据图形渲染时的处理的数据量的大小来综合确定,不同的gpu可以对应不同的第一负载阈值,可根据实际情况进行设定,本技术实施例不做任何限制。
[0154]
需要说明的是,若存在可以检测gpu负载的api,则可以调用该api来获取gpu的负载。若没有可以检测gpu负载的api,则可以采用估计的方法来计算gpu的负载。举例来说,可以根据上一次提交的时间(可以是上一次向gpu提交的第二任务的时间),上一次提交的数量(可以是上一次向gpu提交的第二任务包含的第一事件中的绘制三角形指令的数量)、缓存中的第一事件中的绘制三角形指令的数量、上一帧的时间(可以是绘制完成的上一帧三角形图形的时间)以及上一帧的数量(可以是绘制完成的上一帧图形中三角形的数量)对gpu的负载进行预估。假设gpu处理第一事件的时间跟其所包含的绘制三角形指令的数量成正比,那么当前gpu的负载可以简单表达为:
[0155]
gpu负载=上一次提交的时间-上一次提交的数量/(上一帧的数量*上一帧的时
间)
[0156]
当通过第二线程处理得到第二任务后,将第二任务向event wrapper模块发送。
[0157]
电子设备在event manager模块中何时将第一事件进行打包处理决定了向gpu提交的频率,因此需要尽可能频繁的向gpu提交,保证gpu不会有空闲时间。不过,较高的提交频率也会增加i/o负担,通过动态控制提向gpu提交的频率,尽量使得gpu高负载且平稳,来充分利用gpu的硬件资源。因此,电子设备在在event manager模块处,将一定数量的第一事件打包处理成为第二任务后向event wrapper模块发送。
[0158]
步骤s304:电子设备通过第三线程将第二任务缓存到命令缓存区。
[0159]
具体地,电子设备在event wrapper模块中,可以接收来自event manager模块发送的第二任务,通过第三线程将第二任务保存到命令缓存区command buffer,然后再将命令缓存区中的第二任务发送给job dispatcher模块。
[0160]
在一种可能的实现方式中,将第二任务中的第一事件保存到命令缓存区的过程中可以根据优化规则对第二任务中的第一事件进行排序,排序之后的第一事件仍然保存在command buffer中。因此发送给job dispatcher模块的第二任务中的第一事件是经过优化排序后的。举例来说,若电子设备在job dispatcher模块接收到的第二任务中第一事件的顺序为第一事件1、第一事件2、第一事件3、第一事件4,根据优化规则将第一事件进行排序,排序后的第二任务中的第一事件的顺序可以是第一事件2、第一事件4、第一事件1、第一事件3,再将排序后的第二任务中的第一事件保存到command buffer中。
[0161]
步骤s305:电子设备通过vulkan接口向gpu发送命令缓存区中的第二任务。
[0162]
具体地,电子设备在job dispatcher模块中,可以接收来自event wrapper模块发送的命令缓存区中的第二任务,然后电子设备可以通过相应的vulkan api将命令缓存区中的第二任务向gpu发送,由gpu来完成图形渲染。
[0163]
基于图2所示的架构200,可以将其搭载到android安卓系统。请参见图4,图4是本技术实施例提供的一种基于vulkan实现图形渲染的组件结构示意图。从图4可以看出,在使用安卓系统的电子设备上,以vulkan作为opengl es api后端实现来运行的opengl es应用的软件框架中,本技术实施例涉及到的模块包括以下一种或多种:使用opengl es的应用程序app401、egl/opengl es入口层402、opengl es实现层403、vulkan驱动404、gpu405。
[0164]
其中,在opengl es实现层403中包括以下一种或多种:上下文模块403a、事件管理模块403b、事件包装模块403c、任务调度模块403d。并且,opengl es实现层403包括三个线程,分别是第一线程、第二线程和第三线程。其中,第一线程为opengl es的渲染线程。上下文模块403a运行在第一线程,与opengl es应用程序的opengl es api调用处于同一线程,事件管理模块403b运行在第二线程,事件包装模块403c运行在第三线程,任务调度模块403d运行在第二线程。
[0165]
通过图4所示的组件结构实现基于多线程架构的vulkan为后端的opengl es api的实现的具体实施方式如下:
[0166]
在opengl es应用(app401)调用opengl es api之后,在opengl es实现成403中,可以根据不同的opengl es api进行不同流程处理。opengl es的api可以至少分为如下四类:状态设置与获得(例如glviewport、glgetinteger等)、对象生成和销毁(例如glgenbuffer、gldeletbuffers等)、数据上传和下载(例如glbufferdata、glreadpixels
等)、绘制(例如gldrawelements)。上述四类api可以分为两类执行,状态类和对象类的执行方式是同步执行,即还在该应用程序的线程中执行,数据和绘制是异步执行的,即不会在该应用程序的线程中执行,将会在另一个独立的线程中执行。举例来说,请参见图5a,图5a是本技术实施例提供的一种在opengl es实现层对opengl es指令进行分类的流程示意图,从图5a可以看出,当接收到app调用opengl es api得到的opengl es指令之后,判断该opengl es指令是否为同步的opengl es指令,若是,则进行同步的opengl es指令的处理流程;如不是,则进行异步的opengl es指令的处理流程。
[0167]
请参见图5b,图5b是本技术实施例提供的一种同步执行的opengl es指令的处理流程示意图。图5b是不涉及多线程处理的同步的opengl es指令在上下文模块403a处理的过程,对于状态读写类或者资源管理类api(例如对象生成和销毁,以及数据上传和下载),可能会经过上下文模块403a中的状态管理(state manager)或者对象管理(object manager)两个模块,并且在完成相应工作后返回。所谓同步执行,是因为这两类opengl es api调用的计算量少,同步执行有利于整体应用的性能。从模块功能性上来说,对象管理是建立起1:n的opengl es与vulkan之间的映射关系(一个opengl es对象可能需要几个vulkan对象的支撑)。另外,对象生成和销毁类型的opengl es api也是作用于对象管理模块。状态管理可以保存当前整个系统的状态,通过创建上下文的方式去管理opengl es规范所必须的状态。从图5b可以看出,如果是状态设置和获取类型的api,因为在上下文模块403a中存在对应状态的数据结构,由于上下文模块403a运行在app401的opengl es的渲染线程,所以可以直接将同步的opengl es指令的状态值保存在上下文模块403a的数据结构中;或者可以从数据结构中获取当前opengl es指令的状态值,并将上下文模块403a当前保存的对应状态值中写入该api调用的地址。
[0168]
参见图5c,图5c是本技术实施例提供一种的异步执行的opengl es指令的处理流程示意图,是在上下文模块403a中处理数据上传和绘制类型的opengl es api的过程。上述两类api的opengl es指令会被打包处理成为一个系统内部的第一事件event对象。为了保证打包处理的每一个第一事件相互独立,在每一个第一事件生成时都会访问对象管理和状态管理这两个模块来获取异步的opengl es指令的状态值,并将其状态值保存在第一事件中,将第一事件发送给事件管理模块403b后,api调用就此返回。因为此时的第一事件并未被处理,所以对这两类api的处理是异步的。
[0169]
请参见图5d,图5d是本技术实施例提供的一种处理得到第二任务的流程示意图,也即由事件管理模块403b处理来自上下文模块403a的第一事件的过程。事件管理模块403b运行在第二线程,相对于上下文模块403a来说在另外一个独立的线程中。因此,事件管理模块403b会不断地检测运行在第一线程的上下文模块403a发送的第一事件。从图5d可以看出,若当前处理得到的第一事件属于预设的第一类型,预设的第一类型可以是opengl es api的指令为glfinish/glflush/glreadpixels等指令,或者opengl es api为大块数据上传类型且上传数据大于预设阈值,比如glbufferdata,glsubbufferdata等。则在event manager模块中,通过第二线程将第一事件立即处理得到第二任务。所谓立即处理,可以认为需要立即处理的第一事件的处理顺序排列在第一位,即接收到需要立即处理的第一事件后,在可能的情况下首先处理上述第一事件。
[0170]
在当前处理得到的第一事件不属于预设的第一类型的情况下,也即不需要将第一
事件立即打包成为第二任务的情况下,若当前累计缓存的第一事件的数量大于第一阈值n,则可以通过第一线程将缓存的第一事件打包成为第二任务。需要说明的是,第一阈值n可根据实际情况进行设置,第一阈值n可以是第一事件的打包数量的最大值,本技术实施例不对其进行限制。
[0171]
在当前处理得到的第一事件不属于预设的第一类型,且在当前累计缓存的第一事件的数量大于第二阈值n且小于第一阈值n的情况下,若当前gpu的负载过小,gpu还可以继续处理时,则可以通过第一线程将当前处理得到的第一事件打包成为第二任务。其中,第二阈值m小于第一阈值n,第一阈值n可以是第一事件的打包数量的最大值,第二阈值m可以是第一事件的打包数量的最小值。第一阈值和第二阈值可根据实际情况进行设置,本技术实施例不对其进行限制。
[0172]
在当前累计缓存的第一事件的数量大于第二阈值m且小于第一阈值的情况下,若当前gpu的负载过大,gpu无法再继续处理时,则可以将第一事件在event manager模块中缓存起来,需要处理时再通过第一线程将在event manager模块中缓存的第一事件打包成为第二任务。
[0173]
事件管理模块403b通过动态控制第一事件的打包数量和时机来动态控制向gpu提交的频率,可以保证gpu处理高负载且平稳的运行状态,可以充分利用gpu的硬件资源。
[0174]
请参见图5e,图5e是本技术实施例提供的一种处理第二任务的流程示意图,也即由事件包装模块处理来自事件管理模块的第二任务的过程。件打包模块403c运行的第三线程中,对第二任务进行处理主要包括:将第二任务中的所以第一事件进行提取处理,并分析第一事件中的信息,判断是否可以按照重排优化策略对第一事件的顺序进行重新排列,然后再使用vulkan api将第一事件包含的opengl es指令保存到命令缓存区command buffer中再将命令缓冲区发送给任务调度模块403d。
[0175]
其中,重排优化策略包括以下一种或多种:基于绘制指令对应的管线pipeline状态进行顺序调整(策略一)和基于uniform反复修改和使用的场景对uniform上传指令和绘制指令进行顺序调整(策略二)。
[0176]
策略一的排列规则为:若第二任务中包含的第一事件中的opengl es指令中存在绘制指令draw call,因为每一个绘制指令对应一个管线状态,可以将对应同一管线状态的多个绘制指令合并在一起。举例来说,请参见图5f,图5f是本技术实施例提供一种的按照策略一进行重排的示意图,从图5f可以看出,重排之前的第二任务中包含的第一事件中的opengl es指令中的绘制指令的排序为绘制指令1、绘制指令2、绘制指令3、绘制指令4,而绘制指令1对应管线状态1、绘制指令2对应管线状态2、绘制指令3对应管线状态1、绘制指令4对应管线状态2。重排之后的第二任务中包含的第一事件中的opengl es指令中的绘制指令的排序为绘制指令1、绘制指令3、绘制指令2、绘制指令4,绘制指令1和绘制指令3都是对应管线状态1,绘制指令2和绘制指令4都是对应管线状态2。在重排之前,四个绘制指令需要切换四次管线状态,根据策略一进行重排之后,只需要切换两次管线状态。
[0177]
策略一的排列规则为:若第二任务中包含的第一事件中的opengl es指令中存在需要多次修改同一个uniform的情况,则可以使用一个内存更大的uniform,将每次修改的数据保存在这个内存更大的uniform的不同的内存偏移上,然后将多个uniform修改值一次性上传后,再使用绘制指令进行绘制。举例来说,请参见图5g,图5g是本技术实施例提供一
种的按照策略二进行重排的示意图,从图5g可以看出,重排之前,对第二任务中包含的第一事件中的opengl es指令中的uniform1进行修改后,再使用修改后的数据用绘制指令进行绘制,然后对uniform1再进行修改后,再一次使用修改后的数据来进行绘制。可以看出,对于同一个uniform修改后立马使用修改的数据进行绘制且多次修改的行为,可能会导致上传频率过多,造成资源浪费。重排之后,将多个uniform修改值一次性上传后,再使用绘制指令进行绘制,这样就可以从多次上传uniform数据减少为上传一次。
[0178]
请参见图5h,图5h是本技术实施例提供的一种向gpu发送命令缓存区中的第二任务的流程示意图,也即由任务调度模块向gpu发送命令缓存区中的第二任务的过程。运行在第三线程的事件包装模块403c将保存在命令缓存区的第二任务不停地发送给与任务调度模块403d共享的无锁队列中,运行在第二线程的任务调度模块403d从共享的无锁队列中将命令缓存区取出,通过vulkan接口将命令缓存区向gpu提交,最后由gpu根据第二任务完成图形渲染。
[0179]
请参见图6,图6是本技术实施例提供的一种电子设备的结构示意图。该电子设备60包括至少一个存储器601和至少一个处理器602和通信接口604。可选的,还可以包含总线603,其中,存储器601、处理器602和通信接口604通过总线603相连。
[0180]
其中,存储器601用于提供存储空间,存储空间中可以存储操作系统和计算机指令等数据。存储器601可以是ram、rom、eprom、或cd-rom等等中的一种或者多种的组合。
[0181]
处理器602是进行算术运算和/或逻辑运算的模块,具体可以是cpu、gpu、mpu、asic、fpga、cpld等处理模块中的一种或者多种的组合。
[0182]
通信接口604用于接收外部发送的数据和/或向外部发送数据,可以为包括诸如以太网电缆等的有线链路接口,也可以是无线链路(wi-fi、蓝牙、通用无线传输、车载短距通信技术等)接口。可选的,通信接口604还可以包括与接口耦合的发射器(如射频发射器、天线等),或者接收器等。
[0183]
该电子设备60中的处理器602用于读取所述存储器601中存储的计算机指令,用于执行前述的基于vulkan实现图形渲染的方法,例如图3所示实施例所描述的基于vulkan实现图形渲染的方法。该电子设备60中的处理器602用于读取存储器601中存储的计算机指令,用于执行以下操作:
[0184]
通过第一线程将异步执行的opengl es指令处理成为第一事件event,第一事件可以包含所述异步执行的opengl es指令的描述信息;然后可以通过第二线程处理得到第二任务job,所述第二任务包含一个第一事件或多个第一事件(event),所述多个第一事件是根据相同或者不同的异步执行的opengl es指令处理得到的;再然后可以通过第三线程将所述第二任务保存到命令缓存区;最后可以通过vulkan接口向gpu图像处理器发送所述命令缓存区中的第二任务,其中,所述gpu用于根据所述第二任务完成图形渲染。
[0185]
本技术实施例中,以vulkan作为后端来实现opengl es图形渲染,因为vulkan支持多线程并行处理,所以本技术实施例利用vulkan的多线程优势,在不同线程(例如第一线程、第二线程和第三线程)中对不同的事件或任务进行处理,比如说:通过第一线程将异步执行的opengl es指令处理成为第一事件event,通过第二线程接收第一事件event并将其处理成为第二任务job,在第三线程中将第二任务job保存到命令缓存区中,再通过vulkan接口向gpu发送命令缓存区,由gpu来完成图形渲染。并且,在第三线程对第二任务进行处理
时,第二线程同样也还在对接收到的其他第一事件进行处理,第一线程也同样还在对接收到的其他异步执行的opengl es指令进行处理,可以看出各个线程是并行处理的,从而可以提高处理效率,因此也可以提高向gpu提交的频率,从而可以达到提升渲染效率的目的。来达到提升渲染效率的目的。
[0186]
在一种可能的实施方式中,通过第一线程将异步执行的opengl es指令处理成为第一事件event之前,还包括:根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令。
[0187]
在一种可能的实施方式中,状态设置与获得类型的opengl es指令和对象生成和销毁类型的opengl es指令均属于同步执行的opengl es指令;数据上传类型的opengl es指令和绘制类型的opengl es指令均属于异步执行的opengl es。
[0188]
在一种可能的实施方式中,根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令之后,还包括:通过第一线程将同步执行的opengl es指令的描述信息保存到数据结构。
[0189]
在一种可能的实施方式中,根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令之后,还包括:通过第一线程从数据结构中获得同步执行的opengl es指令的描述信息后,向所述图像处理器发送,所述图像处理器用于根据所述同步执行的opengl es指令的描述信息完成图形渲染;其中,第一线程可以是opengl es应用程序的渲染线程。
[0190]
在一种可能的实施方式中,通过第二线程处理得到第二任务job,包括:在当前处理得到的第一事件属于预设的第一类型的情况下,执行通过第二线程处理第一事件得到第二任务job的步骤。
[0191]
在一种可能的实施方式中,通过第二线程处理得到第二任务job,包括:在当前处理得到的第一事件不属于预设的第一类型的情况下,若当前累计缓存的第一事件的数量大于第一阈值,则执行通过第二线程处理第一事件得到第二任务的步骤。
[0192]
在一种可能的实施方式中,通过第二线程处理得到第二任务job,包括:在当前处理得到的第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于第一阈值的情况下,若当前gpu的负载大,则执行通过第二线程处理第一事件得到第二任务的步骤。
[0193]
在一种可能的实施方式中,通过第二线程处理得到第二任务job,包括:在当前处理得到的第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于第一阈值时的情况下,若当前gpu的负载小,则将第一对象进行缓存处理。
[0194]
在一种可能的实施方式中,第二任务包含多个第一事件,通过第三线程将第二任务缓存到命令缓存区,包括:通过第三线程对第二任务中的多个第一事件进行排序;将排序后的第二任务缓存到命令缓存区。
[0195]
在一种可能的实施方式中,通过第三线程对第二任务中的多个第一事件进行排序,包括:通过第三线程基于第二任务中的多个第一事件对应的管线pipeline状态对第二任务中的多个第一事件进行排序。
[0196]
在一种可能的实施方式中,第二任务中的多个第一件事对应同一管线pipeline状态的第一事件被排序在一起。
[0197]
在一种可能的实施方式中,二任务包含多个第一事件,通过第三线程将第二任务缓存到命令缓存区,包括:通过第三线程将第二任务中的多个第一事件对应同一个变量进行修改的第一事件进行排序;基于变量对第二任务中排序后的第一事件进行修改;将排序后进行修改的第二任务缓存到命令缓存区。
[0198]
在一种可能的实施方式中,多个事件中对应同一变量进行修改的第一事件被排序在一起。
[0199]
在一种可能的实施方式中,通过第一线程将异步指令处理成为第一对象,包括:通过第一线程获取异步的opengl es指令的描述信息;将异步的opengl es指令的描述信息和异步的opengl es指令封装成为第一对象。
[0200]
本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机指令,当计算机指令在一个或多个处理器上运行时,实现图3所示的实施例所描述的基于vulkan实现图形渲染方法。
[0201]
本技术实施例还提供了一种计算机程序产品,计算机程序产品中存储有计算机指令,当计算机指令被一个或多个处理器执行时促使一个或多个处理器实现图3所示的实施例所描述的基于vulkan实现图形渲染方法。
[0202]
本技术实施例还提供了一种芯片系统,该芯片系统包括至少一个处理器,存储器和接口电路,所示接口电路用于为至少一个处理器提供信息输入/输出,该至少一个存储器中存储有计算机指令,当计算机指令在一个或多个处理器上运行时,实现图3所示的实施例所描述的基于vulkan实现图形渲染方法。
[0203]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机指令产品的形式实现。该计算机指令产品包括一个或多个计算机指令。在计算机上加载和执行该计算机指令时,可以全部或部分地实现本技术实施例所描述的流程或功能。该计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。该计算机指令可以存储在计算机可读存储介质中,或者通过计算机可读存储介质进行传输。该计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如,固态硬盘(solid state disk,ssd))等。
[0204]
本技术方法实施例中的步骤可以根据实际需要进行顺序调整、合并和删减。
[0205]
本技术装置实施例中的模块可以根据实际需要进行合并、划分和删减。
技术特征:
1.一种基于vulkan实现图形渲染的方法,其特征在于,包括:通过第一线程将异步执行的opengl es指令处理成为第一事件,所述第一事件包含所述异步执行的opengl es指令的描述信息;通过第二线程处理所述第一事件得到第二任务,所述第二任务包含一个第一事件或多个第一事件,所述多个第一事件是根据相同或者不同的异步执行的opengl es指令处理得到的;通过第三线程将所述第二任务保存到命令缓存区;通过vulkan接口向图形处理器发送所述命令缓存区中的第二任务,其中,所述图形处理器用于根据所述第二任务完成图形渲染。2.根据权利要求1所述的方法,其特征在于,所述通过第一线程将异步执行的opengl es指令处理成为第一事件event之前,还包括:根据opengl es应用程序接口的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令。3.根据权利要求2所述的方法,其特征在于,状态设置与获得类型的opengl es指令以及对象生成和销毁类型的opengl es指令均属于所述同步执行的opengl es指令;数据上传类型的opengl es指令和绘制类型的opengl es指令均属于所述异步执行的opengl es。4.根据权利要求2或3所述的方法,其特征在于,所述根据opengl es应用程序接口的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令之后,还包括:通过所述第一线程将所述同步执行的opengl es指令的描述信息保存到数据结构。5.根据权利要求2-4任一项所述的方法,其特征在于,所述根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令之后,还包括:通过所述第一线程从数据结构中获得所述同步执行的opengl es指令的描述信息后,向所述图像处理器发送,所述图像处理器用于根据所述同步执行的opengl es指令的描述信息完成图形渲染。6.根据权利要求1-5任一项所述的方法,其特征在于,所述通过第二线程处理所述第一事件得到第二任务,包括:在所述第一事件属于预设的第一类型时,执行所述通过第二线程处理所述第一事件得到第二任务的步骤。7.根据权利要求1-6任一项所述的方法,其特征在于,所述通过第二线程处理所述第一事件得到第二任务,包括:在所述第一事件不属于预设的第一类型时,且若累计缓存的第一事件的数量大于第一阈值,则执行所述通过第二线程处理所述第一事件得到第二任务的步骤。8.根据权利要求1-7所述的方法,其特征在于,所述通过第二线程处理所述第一事件得到第二任务job,包括:在所述第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值时,若gpu的负载小于第一负载阈值,则执行所述通过第二线程处理所述第一事件得到第二任务的步骤,所述第二阈值小于所述第一阈值。
9.根据权利要求1-8任一项所述的方法,其特征在于,所述通过第二线程处理得到第二任务job,包括:在所述第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值时,若gpu的负载大于或等于第一负载阈值,则缓存所述第一事件。10.根据权利要求1-9任一项所述的方法,其特征在于,所述第二任务包含多个第一事件,所述通过第三线程将所述第二任务缓存到命令缓存区,包括:通过所述第三线程对所述第二任务中的多个第一事件进行排序;将排序后的所述第二任务缓存到命令缓存区。11.根据权利要求10任一项所述的方法,其特征在于,所述通过所述第三线程对所述第二任务中的多个第一事件进行排序,包括:通过第三线程基于所述多个第一事件对应的管线状态对所述第二任务中的多个第一事件进行排序。12.根据权利要求11所述的方法,其特征在于,所述多个第一件事中对应同一管线状态的第一事件被排序在一起。13.根据权利要求1-9任一项所述的方法,其特征在于,所述第二任务包含多个第一事件,所述通过第三线程将所述第二任务缓存到命令缓存区,包括:通过第三线程将所述多个第一事件中对应同一个变量进行修改的第一事件进行排序;基于所述变量对第二任务中排序后的第一事件进行修改;将所述修改后的第二任务缓存到命令缓存区。14.根据权利要求13所述的方法,其特征在于,所述多个事件中对应同一变量进行修改的第一事件被排序在一起。15.根据权利要求1-14任一项所述的方法,其特征在于,所述通过第一线程将所述异步指令处理成为第一对象,包括:通过所述第一线程获取所述异步的opengl es指令的描述信息;将所述异步的opengl es指令的描述信息和所述异步的opengl es指令封装成为第一对象。16.一种基于vulkan实现图形渲染的装置,其特征在于,包括:上下文模块,用于通过第一线程将异步执行的opengl es指令处理成为第一事件event,所述第一事件包含所述异步执行的opengl es指令的描述信息;事件管理模块,用于通过第二线程处理所述第一事件得到第二任务job,所述第二任务包含一个第一事件或多个第一事件,所述多个第一事件是根据相同或者不同的异步执行的opengl es指令处理得到的;事件包装模块,用于通过第三线程将所述第二任务保存到命令缓存区;任务调度模块,用于通过vulkan接口向gpu图形处理器发送所述命令缓存区中的第二任务,其中,所述图形处理器用于根据所述第二任务完成图形渲染。17.根据权利要求16所述的装置,其特征在于,所述上下文模块,还用于根据opengl es应用程序接口api的类型将多个opengl es指令分类为异步执行的opengl es指令和同步执行的opengl es指令。
18.根据权利要求17所述的装置,其特征在于,状态设置与获得类型的opengl es指令和对象生成和销毁类型的opengl es指令均属于所述同步执行的opengl es指令;数据上传类型的opengl es指令和绘制类型的opengl es指令均属于所述异步执行的opengl es。19.根据权利要求17或18所述的装置,其特征在于,所述上下文模块,还用于通过所述第一线程将所述同步执行的opengl es指令的描述信息保存到数据结构。20.根据权利要求17-19任一项所述的装置,其特征在于,所述上下文模块,还用于通过所述第一线程从数据结构中获得所述同步执行的opengl es指令的描述信息后,向所述图像处理器发送,所述图像处理器用于根据所述同步执行的opengl es指令的描述信息完成图形渲染。21.根据权利要求16-20任一项所述的装置,其特征在于,所述事件管理模块,具体用于:在所述第一事件属于预设的第一类型时,执行所述通过第二线程处理得到第二任务job的步骤。22.根据权利要求16-21任一项所述的装置,其特征在于,所述事件管理模块,具体用于:在所述第一事件不属于预设的第一类型时,若当前累计缓存的第一事件的数量大于第一阈值,则执行所述通过第二线程处理所述第一事件得到第二任务的步骤。23.根据权利要求16-22任一项所述的装置,其特征在于,所述事件管理模块,具体用于:在所述第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值时,若gpu的负载小于第一负载阈值,则执行所述通过第二线程处理所述第一事件得到第二任务的步骤,所述第二阈值小于所述第一阈值。24.根据权利要求16-23任一项所述的装置,其特征在于,所述事件管理模块,具体用于:在所述第一事件不属于预设的第一类型,且当前累计缓存的第一事件的数量大于第二阈值且小于或等于第一阈值时,若gpu的负载大于或等于第一负载阈值,则缓存所述第一事件。25.根据权利要求16-24任一项所述的装置,其特征在于,所述事件包装模块,具体用于:通过所述第三线程对所述第二任务中的多个第一事件进行排序;将排序后的所述第二任务缓存到命令缓存区。26.根据权利要求25所述的装置,其特征在于,所述事件包装模块,具体用于通过第三线程基于所述多个第一事件对应的管线pipeline状态对所述第二任务中的多个第一事件进行排序。27.根据权利要求26所述的装置,其特征在于,所述多个第一件事对应同一管线pipeline状态的第一事件被排序在一起。28.根据权利要求16-24任一项所述的装置,其特征在于,所述事件包装模块,具体用于:通过第三线程将所述第二任务中的多个第一事件对应同一个变量进行修改的第一事
件进行排序;基于所述变量对第二任务中排序后的第一事件进行修改;将排序后进行修改的第二任务缓存到命令缓存区。29.根据全露要求28所述的装置,其特征在于,所述多个事件中对应同一变量进行修改的第一事件被排序在一起。30.根据权利要求16-29任一项所述的装置,其特征在于,所述上下文模块,具体用于:通过所述第一线程获取所述异步的opengl es指令的描述信息;将所述异步的opengl es指令的描述信息和所述异步的opengl es指令封装成为第一对象。31.一种电子设备,其特征在于,所述电子设备包括处理器和存储器;所述处理器用于执行存储器存储的计算机指令,使得所述电子设备实现如权利要求1-15中任一项所述的方法。32.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机指令,当所述计算机指令被一个或多个处理器执行时促使所述一个或多个处理器实现权利要求1-15中任一项所述的方法。33.一种计算机程序产品,其特征在于,所述计算机程序产品中存储有计算机指令,当所述计算机指令被一个或多个处理器执行时促使所述一个或多个处理器实现权利要求1-15中任一项所述的方法。
技术总结
本申请实施例提供一种基于Vulkan实现图形渲染的方法及相关装置,方法包括:通过第一线程将异步执行的OpenGL ES指令处理成为第一事件event,第一事件包含异步执行的OpenGL ES指令的描述信息;通过第二线程处理第一事件得到第二任务job,第二任务包含一个第一事件或多个第一事件,多个第一事件是根据相同或者不同的异步执行的OpenGL ES指令处理得到的;通过第三线程将第二任务保存到命令缓存区;通过Vulkan接口向GPU图像处理器发送命令缓存区中的第二任务,其中,GPU用于根据第二任务完成图形渲染。采用本申请实施例,能够提高GPU的渲染效率。效率。效率。
技术研发人员:李宏伟 罗谈发
受保护的技术使用者:华为技术有限公司
技术研发日:2020.11.06
技术公布日:2022/5/25
转载请注明原文地址:https://tc.8miu.com/read-22967.html