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

渲染显示的方法、装置、设备及存储介质

文献发布时间:2024-04-18 19:58:26


渲染显示的方法、装置、设备及存储介质

技术领域

本公开实施例涉及图像处理技术领域,尤其涉及一种渲染显示的方法、装置、设备及存储介质。

背景技术

嵌入式图形库(Embedded Graphic Library,EGL)标准中有三种渲染显示方式,包括:基于像素缓冲区(Pixel Buffer,Pbuffer)的Pbuffer Surface、基于窗口的WindowSurface以及基于位图的Pixmap Surface,其中,所述Pbuffer Surface渲染显示方式是使用eglCreatePbufferSurface函数创建离屏渲染显示窗口,所述WindowSurface渲染显示方式是使用eglCreateWindowSurface函数创建当前屏幕的实时渲染显示窗口,所述PixmapSurface渲染显示方式是使用eglCreatePixmapSurface函数创建位图渲染显示窗口。

由于大多数嵌入式设备中仅能使用所述eglCreatePbufferSurface函数创建离屏渲染显示窗口,在所述eglCreatePbufferSurface函数的底层实现上,通过显示设备进行渲染显示,不能支持使用eglCreateWindowSurface函数来创建当前屏幕的实时渲染显示窗口,即不支持将渲染结果直接在当前屏幕缓冲区中进行实时渲染显示。对于使用所述Pbuffer Surface渲染显示方式的嵌入式设备,其具体实现方案是图形处理器(GraphicProcessing Unit,GPU)执行渲染后生成的渲染结果不会直接输出到屏幕上,而是需要将所述渲染结果拷贝到显示设备的内存中,再通过所述显示设备显示到屏幕上。因此,在嵌入式设备中不能同时支持Pbuffer Surface渲染显示方式和Window Surface渲染显示方式,无法满足多场景的使用需求,而且在多应用或多窗口环境下进行使用场景迁移时,往往需要修改渲染显示接口,容易出错且增加工作量,不具有灵活的移植性。

发明内容

有鉴于此,本公开实施例期望提供一种渲染显示的方法、装置、设备及存储介质,能够在嵌入式设备中同时支持Pbuffer Surface渲染显示方式和Window Surface渲染显示方式,从而满足多场景的使用需求。

本公开实施例的技术方案是这样实现的:

第一方面,本公开实施例提供了一种渲染显示方法,包括:

建立用户态虚拟空间与嵌入式设备的帧缓存之间的映射关系;

在所述用户态虚拟空间中设置渲染区域;

根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域;

通过显示设备显示所述渲染区域内的渲染结果。

第二方面,本公开实施例提供了一种渲染显示的装置,所述装置包括:建立模块、设置模块、映射模块以及显示模块;其中,

所述建立模块,被配置成建立用户态虚拟空间与嵌入式设备的帧缓存之间的映射关系;

所述设置模块,被配置成在所述用户态虚拟空间中设置渲染区域;

所述映射模块,被配置成根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域;

所述显示模块,被配置成通过显示设备显示所述渲染区域内的渲染结果。

第三方面,本公开实施例提供了一种嵌入式设备,所述嵌入式设备包括:CPU、GPU以及实现CPU和GPU之间连接通信的系统总线;其中,所述CPU和GPU经配置以实现第一方面所述渲染显示的方法。

第四方面,本公开实施例提供了一种计算机存储介质,所述计算机存储介质存储有至少一条指令,所述至少一条指令用于被处理器执行以实现第一方面所述渲染显示的方法。

本公开实施例提供了一种渲染显示的方法、装置、设备及存储介质,通过在嵌入式设备中采用基于Window Surface渲染显示方式,先建立用户态虚拟空间与嵌入式设备的帧缓存之间的映射关系,在所述用户态虚拟空间中创建渲染区域并配置区域属性,GPU执行渲染并将渲染结果写入所述嵌入式设备的帧缓存,根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域,通过显示设备读取所述渲染区域内的渲染结果,根据刷新显示命令显示在屏幕上。通过该技术方案,在仅支持所述PbufferSurface渲染显示方式的嵌入式设备中,也可以同时支持使用所述Window Surface渲染显示方式,从而满足多场景的使用需求。此外,可以将实现所述Window Surface渲染显示方式的代码移植到其他应用或多窗口系统中,不需要做任何修改即可实现在所述其他应用或多窗口系统中同时支持两种渲染显示方式,具有灵活的移植性。

附图说明

图1为本公开实施例提供的嵌入式设备组成示意图;

图2为一种使用Pbuffer Surface渲染显示的流程图;

图3为本公开实施例提供的一种渲染显示的方法流程图;

图4为本公开实施例提供的使用Window Surface渲染显示的详细流程图;

图5为本公开实施例提供的一种渲染显存的装置示意图。

具体实施方式

下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述。

参见图1,其示出了能够实现本公开实施例技术方案的嵌入式设备100的组成示意图,需注意,图1所示出的嵌入式设备是可能的设备的仅一个示例,并且可根据需要在各种设备中的任一设备中实现本公开的实施方案。该嵌入式设备100的组成具体可以为任意类型的计算装置,包括且不限于台式计算机、服务器、工作站、膝上计算机、基于计算机的仿真器、无线装置、移动或蜂窝电话(包含所谓的智能电话)、个人数字助理(PDA)、视频游戏控制台(包含视频显示器、移动视频游戏装置、移动视频会议单元)、膝上型计算机、桌上型计算机、电视机顶盒、平板计算装置、电子书阅读器、固定或移动媒体播放器等。如图1所示,嵌入式设备100的组成可以包括中央处理器(Central Processing Unit,CPU),比如图1中示出的CPU 10、GPU 20、系统内存30,还包括显示设备40以及通信接口50。

具体来说,CPU 10可包括控制嵌入式设备100运算的通用或专用处理器,其经配置以处理供执行的计算机程序的指令。用户可经由通信接口50与耦合到嵌入式设备100的另一输入装置(未图示)例如:轨迹球、键盘、鼠标、麦克风、触摸垫、触摸屏以及其他类型的装置,例如交换机接口,将输入提供给嵌入式设备100组成中的CPU 10,以使得CPU 10执行至少一个或多个软件应用程序11、图形API 12和GPU驱动程序13,其中的每一者可为一或多个软件应用程序或服务。在一些示例中,图形API 12和GPU驱动程序 13可实施为CPU 10的硬件单元。此外,在CPU 10上执行的软件应用程序11可为利用GPU 20的功能性的任何应用程序,可包括图形用户接口(Graphic User Interface,GUI)应用程序、操作系统、便携式制图应用程序、用于工程或艺术应用的计算机辅助设计程序、视频游戏应用程序、文字处理器应用程序、电子邮件应用程序、电子表格应用程序、媒体播放器应用程序或使用2D、3D图形渲染应用程序等,本公开实施例以执行图形渲染应用程序为例。所述图形渲染应用程序也可以简称为应用程序或程序。此外,CPU10上执行的图形渲染应用程序可包含一或多个图形渲染指令(也可以理解为待渲染的画面帧中包含一或多个所述图形),所述图形渲染指令可符合图形应用程序编程接口(Application Programming Interface,API),例如,开放式图形库API(OpenGL API)、开放式图形库嵌入系统(OpenGL ES)API、Direct3D API、X3DAPI、RenderMan API、WebGL API、开放式计算语言(OpenCLTM)、RenderScript或任何其它异构计算API或任何其它公用或专有标准图形或计算API,本公开下面的描述中将以OpenGL ES为例进行说明。

GPU 20可经配置以执行图形运算,从而将一或多个图形图元渲染到显示设备40进行展示。可以理解为,CPU 10通过控制GPU驱动程序13,将渲染指令翻译为GPU 20可读的渲染命令,然后GPU 20根据收到的一或多个图形渲染命令,包括但不限于图形命令和图形数据,所述图形数据可包含绘制命令、状态信息、图元信息、纹理信息等,以使得GPU20执行所述图形渲染命令中的一些或者全部,从而将一或多个图形图元进行渲染并在显示设备40上展示出来。GPU 20内部结构包括但不限于图形存储器21以及处理器集群22。在本公开实施例中,图形存储器21可为GPU 20的一部分。因此,GPU 20可在不使用总线的情况下从图形存储器21读取数据且将数据写入到图形存储器21。换句话说,GPU 20可使用本地存储装置而不是芯片外存储器在本地处理数据,此类图形存储器21可被称作芯片上存储器。这允许GPU20通过消除GPU 20经由总线读取和写入数据的需要来以更高效的方式操作,其中经由总线操作可经历繁重的总线业务。所述图形存储器21可包含一或多个易失性或非易失性存储器或存储装置,例如,随机存取存储器(RAM)、静态RAM(SRAM)、动态RAM(DRAM)、可擦除可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)、快闪存储器、磁性数据媒体或光学存储媒体。在一些示例中,GPU 20可不包含单独的存储器,而是经由总线利用外置的显存31。所述处理器集群22,用于执行图形处理管线,以便对图形渲染命令进行解码,并对图形处理管线进行配置以执行图形渲染命令中所指定的操作。在一些情况下,GPU20可内置有高度并行结构,其提供比CPU 10高效的对复杂图形相关运算的处理。举例来说,GPU 20可包含经配置以并行方式对多个顶点或像素进行运算的多个处理元件。在一些情况下,GPU 20的高度并行性质允许GPU 20比使用CPU10更快速地将图形图像(例如,GUI和二维(2D)和/或三维(3D)图形场景)绘制到显示设备40上。在一些情况下,可将GPU 20集成到目标设备的母板中。在其它情况下,GPU 20可存在于图形卡上,所述图形卡安装在目标设备的母板中的端口中,或可以其它方式并入在经配置以与目标设备互操作的外围装置内。GPU 20可包含一或多个处理器,例如一或多个微处理器、专用集成电路(ASIC)、现场可编程门阵列(FPGA)、数字信号处理器(DSP)或其它等效的集成或离散逻辑电路。GPU 20还可包含一或多个处理器核心,使得GPU20可被称作多核处理器。

系统内存30,经配置用于存储能够在CPU 10上运行的应用程序指令、GPU 20执行需要的图形数据以及其运行结果数据。例如,GPU 20可将完全形成的图像存储在系统内存30中。在一些示例中,系统内存30可与显存31分离,显存31可存储经渲染图像数据,例如像素数据以及任何其它数据,因此,显存31还可被称为帧缓冲器或帧缓存。显存31还可以存储GPU 20的目的地像素,每个目的地像素可与唯一屏幕像素位置相关联。在一些示例中,显存31可存储每个目的地像素的色彩分量和目的地α值。举例来说,显存31可存储每个像素的红色、绿色、蓝色、α(RGBA)分量,其中“RGB”分量对应于色彩值,并且“A”分量对应于目的地α值(例如,用于图像合成的不透明度值)。尽管将显存31和系统内存30说明为单独的存储器单元,但在其它示例中,显存31可以是系统内存30的一部分。此外,显存31还可以存储除像素之外的任何合适的数据。在一些示例中,系统内存30中还包括用户态虚拟空间32,所述用户态虚拟空间32是操作系统为每个用户进程提供的虚拟地址空间,在多任务操作系统中,每个进程都运行在自己的虚拟地址空间中。显示设备40可从用户态虚拟空间32中检索图像且显示所述图像的值。显示设备40可为嵌入式设备100的显示器,其显示由GPU 20产生的图形图像内容。显示设备40可为液晶显示器(LCD)、有机发光二极管显示器(OLED)、阴极射线管(CRT)显示器、等离子显示器或另一类型的显示装置。

结合图1所示的嵌入式设备100,基于GPU 20执行所述图形渲染命令中的一些或者全部,从而将一或多个图形图元进行渲染以生成当前帧的渲染结果并存储到显存31对应的存储空间中。对于使用所述Pbuffer Surface渲染显示方式的嵌入式设备,其具体的实现方案是:GPU执行渲染后生成的渲染结果不会直接输出到屏幕上,而是需要将所述渲染结果拷贝到显示设备的内存中,再通过所述显示设备显示到屏幕上。参见图2,其示出了一种使用Pbuffer Surface渲染显示的流程图,具体包括以下步骤:

S201:EGL创建渲染显示窗口;

通过系统调用,使用EGL标准的eglCreatePbufferSurface函数创建一个PbufferSurface离屏渲染显示的窗口,所述eglCreatePbufferSurface函数内部具体的操作步骤包括:初始化窗口信息、打开显示设备、获取显示相关信息和显示数据相关信息以及映射GPU的显存到用户态虚拟空间等。

需要说明的是,初始化窗口信息以获取渲染窗口大小。所述显示设备可称之为原生本地设备,名称默认为/dev/fb0,其具有独立的物理内存,由于所述物理内存是不能被应用程序直接使用的,需要操作系统将所述物理内存映射为虚拟空间才可以为应用程序的不同进程进行内存的分配和释放,其中,所述物理内存通常分为用户空间和内核空间,所述用户空间用于运行用户应用程序,而内核空间用于操作系统内核,相应地,所述虚拟空间也可以分为用户态虚拟空间和内核态虚拟空间,对于所述用户态虚拟空间是为应用程序的每个进程分配的独立的虚拟地址空间,通过操作系统的内存保护机制确保不同进程之间虚拟地址空间的访问权限。在一些示例中,所述显示设备也可以不具有独立的物理内存,而使用系统内存进行存储。所述显示相关信息至少包括屏幕分辨率、颜色深度、显存大小等,所述显示数据相关信息至少包括像素RGB掩码和占用的数据位数。

S202:选择GPU渲染显示方式为基于Pbuffer Surface渲染显示方式;

S203:GPU渲染帧缓存;

GPU执行渲染并将渲染结果存储到GPU的显存中,还包括将所述渲染结果从GPU的显存拷贝至所述用户态虚拟空间。具体来说,通过所述eglCreatePbufferSurface函数,在所述GPU的显存中创建一个Pbuffer,所述Pbuffer是一个离屏渲染缓冲区,任何的OpenGL或OpenGL ES渲染指令的渲染结果都存储到所述Pbuffer中,通过系统调用,例如,调用内存拷贝memcpy函数将所述渲染结果从所述Pbuffer拷贝至所述GPU的显存,然后再从所述GPU的显存拷贝至映射的所述用户态虚拟空间。

在一些示例中,所述将所述渲染结果从GPU的显存拷贝至所述用户态虚拟空间,如果嵌入式设备中的GPU支持直接存储器访问(Direct Memory Access,DMA),可以通过所述DMA直接将渲染结果复制到所述用户态虚拟空间,可以避免CPU的干预,从而提高渲染显示的效率。在一些示例中,为了保证性能和实时性,也可以采用实施双缓冲或者三缓冲策略,在一个缓冲区显示所述渲染结果,在另一个缓冲区执行GPU渲染。本公开实施例利用内存复制memcpy函数,将所述GPU显存内的渲染结果写入所述用户态虚拟空间。

需要说明的是,对于仅支持通过显示设备进行图形用户显示的嵌入式设备,将渲染结果在所述嵌入式设备中的显示设备上直接显示是最直接且常见的显示方法。上述渲染结果的复制过程是所述显示设备的固有机制,如果想要通过所述显示设备进行显示,必须执行复制操作。

S204:通过显示设备的内核态驱动将所述用户态虚拟空间转换为实际物理空间并发送到屏幕显示;

S205:显示设备将所述渲染结果显示到屏幕上。

通过所述显示设备以刷屏方式将所述渲染结果显示到屏幕上。

基于上述内容的阐述,对于图2所示的使用Pbuffer Surface渲染显示的流程,如前述步骤S201至S205,以嵌入式系统SylixOS为例,其具体实现的部分伪代码片段如下:

fb_fd = open("/dev/fb0", O_RDWR, 0666); //打开fb0设备

ret = ioctl(fb_fd, LW_GM_GET_SCRINFO,&scr_info); //获取显存相关信息,如显存大小等

ret = ioctl(fb_fd, LW_GM_GET_VARINFO,&var_info); //获取显示数据相关信息,如像素RGB掩码和占用的数据位数

void *pframebuffer = mmap(NULL,scr_info.GMSI_stMemSize, PROT_READ |PROT_WRITE, MAP_SHARED, fb_fd, 0); //将显存映射到用户态虚拟空间

draw_pixel(pframebuffer,&scr_info,&var_info, buffer); //将GPU的渲染结果从Pbuffer拷贝到所述用户态虚拟空间pframebuffer上进行显示

munmap(pframebuffer, scr_info.GMSI_stMemSize); //图形显示任务完成后,取消显存映射

close(fb_fd); //关闭显示设备

基于上述代码的实现可知,大多数嵌入式设备中仅支持使用所述PbufferSurface的离屏渲染显示方式,需要将所述渲染结果拷贝至所述显示设备的用户态虚拟空间中,再通过所述显示设备显示到屏幕上。在所述嵌入式设备中不能同时支持PbufferSurface渲染显示方式和Window Surface渲染显示方式,从而无法满足多场景的使用需求,而且在多应用或多窗口环境下进行使用场景迁移时,往往需要修改渲染显示接口,容易出错且增加工作量,不具有灵活的移植性。基于此,本公开实施例期望提供一种渲染显示的技术方案,通过该技术方案能够满足在仅支持所述PbufferSurface渲染显示方式的嵌入式设备中,同时支持使用所述Window Surface渲染显示方式以满足多场景的使用需求。参见图3,其示出了本公开实施例提供的一种渲染显示的方法,该方法应用于包括CPU和GPU的嵌入式设备,所述方法包括:

S301:建立用户态虚拟空间与嵌入式设备的帧缓存之间的映射关系;

S302:在所述用户态虚拟空间中设置渲染区域;

S303:根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域;

S304:通过显示设备显示所述渲染区域内的渲染结果。

根据上述方案的描述,本公开实施例通过在嵌入式设备中采用基于WindowSurface渲染显示方式,先建立用户态虚拟空间与嵌入式设备的帧缓存之间的映射关系,在所述用户态虚拟空间中创建渲染区域并配置区域属性,GPU执行渲染并将渲染结果写入所述嵌入式设备的帧缓存,根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域,通过显示设备读取所述渲染区域内的渲染结果,根据刷新显示命令显示在屏幕上。通过该技术方案,在仅支持所述Pbuffer Surface渲染显示方式的嵌入式设备中,也可以同时支持使用所述Window Surface渲染显示方式,从而满足多场景的使用需求。此外,可以将实现所述Window Surface渲染显示方式的代码移植到其他应用或多窗口系统中,不需要做任何修改即可实现在所述其他应用或多窗口系统中同时支持两种渲染显示方式,具有灵活的移植性。

针对图3所示的技术方案,在一些可能的实现方式中,所述建立用户态虚拟空间与嵌入式设备的帧缓存之间的映射关系,包括:

通过内存映射mmap函数将所述嵌入式设备的帧缓存映射至所述用户态虚拟空间,以使得对所述用户态虚拟空间的操作均直接反映在被映射的帧缓存中。

对于上述实现方式,结合图1所示的嵌入式设备,所述嵌入式设备的帧缓存,即为GPU的显存,如图1所示的显存31。

在一些示例中,所述通过内存映射mmap函数将所述嵌入式设备的帧缓存映射至所述用户态虚拟空间,详细来说,映射的过程为:先指定映射的长度为整个所述GPU的显存的大小以及指定映射属性为读写权限,通过所述内存映射mmap函数的系统调用返回一个指向所述用户态虚拟空间的指针,所述指针可以被当作数组直接使用,应用程序可以通过所述指针直接对所述GPU的显存进行读写,在所述用户态虚拟空间的操作都会直接反映在所述GPU的显存上。

为了实现在所述用户态虚拟空间的操作直接反映在所述GPU的显存上,所述方法还包括:

开启所述嵌入式设备中的显示设备以使得通过所述显示设备能够对所述嵌入式设备的帧缓存进行操作;

在所述嵌入式设备的内存资源中分配所述用户态虚拟空间。

针对图3所示的技术方案,在一些可能的实现方式中,所述在所述用户态虚拟空间中设置渲染区域,包括:

通过调用eglCreateWindowSurface函数在所述用户态虚拟空间中创建所述渲染区域。

对于上述实现方式,详细的实现步骤为:首先,通过EGL标准接口eglCreateWindowSurface函数在所述用户态虚拟空间中创建渲染窗口,即渲染区域,这里的“窗口”并不是在传统的窗口系统,其中,所述传统的窗口系统,例如X11或Wayland。本公开实施例中所述窗口是指定的内存区域。可以理解地,所述渲染区域不依赖窗口系统,是在所述显示设备的内存中的指定区域。其次,配置渲染区域属性,根据所述显示设备的显示特性配置渲染窗口的相关属性,其中,所述显示特性至少包括颜色深度、RGB掩码等,上述配置的操作可以确保渲染结果能够正确地显示在所述显示设备上。

相比于图2所示的使用Pbuffer Surface渲染显示的流程,本公开实施例中通过EGL标准接口eglCreateWindowSurface函数创建渲染区域时,不需要在所述GPU的显存中创建一个Pbuffer,即离屏渲染缓冲区,其中,所述Pbuffer中存储的是任何的OpenGL或OpenGLES渲染指令的渲染结果。

在所述用户态虚拟空间中创建所述渲染区域并配置渲染区域属性后,还需要为所述渲染区域申请对应的内存区域,在一些示例中,所述方法还包括:

在所述用户态虚拟空间中为所述渲染区域划分对应的内存区域;

相应地,将渲染结果写入至所述渲染区域,包括:

将所述渲染结果写入至所述渲染区域划分对应的内存区域。

对于上述实现方式,在一些示例中,所述在所述用户态虚拟空间中为所述渲染区域划分对应的内存区域,所述内存区域是用来存放OpenGL或OpenGL ES渲染指令生成的渲染结果,为所述渲染区域划分对应的内存区域的具体步骤如下:

步骤1:确定内存大小;

根据渲染窗口大小和所需的色深,例如,32位RGBA,计算需要的内存大小。例如,一个800x600的窗口,使用32位颜色,将需要800 x 600 x 4字节的内存。

步骤2:选择适当的内存分配方法;

所述内存分配方法,包括动态内存分配和静态内存分配,其中,所述动态内存分配是在嵌入式设备中使用函数,例如,malloc或calloc函数从堆上动态分配内存。所述函数会返回一个指向所分配内存的指针,例如,void* buffer = malloc(800 * 600 * 4)。所述静态内存分配是在一些实时或资源受限的嵌入式设备中,动态内存分配可能会引入不确定性或可能不被允许。在这种情况下,可以预先在代码中静态分配一个足够大的数组作为缓冲区。

步骤3:考虑内存对齐;

为了提高访问速度,某些嵌入式处理器要求数据在内存中进行特定的对齐,例如4字节、8字节对齐等。在一些示例中,通过使用posix_memalign函数可以确保分配的内存满足对齐要求。

步骤4:内存映射;

如前所述,通过内存映射mmap函数将所述嵌入式设备的帧缓存映射至所述用户态虚拟空间,映射完成后就可以直接访问和修改映射的内存区域,而不需要其他特殊的输入输出操作。

步骤5:错误处理;

无论选择哪种内存分配方法,都应该检查返回的内存指针以确保内存分配成功。如果所述malloc或mmap函数返回失败,例如,返回值为NULL,需要分析错误的根因并采取适当的错误处理措施。

步骤6:使用后释放内存;

具体来说,渲染操作完成后并不再需要所述内存区域,通过free或munmap等函数执行释放,以避免内存泄漏。

针对图3所示的技术方案,在一些可能的实现方式中,所述根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域,包括:

将写入所述渲染区域内的渲染结果通过所述映射关系直接反映至所述嵌入式设备的帧缓存内。

对于上述实现方式,在渲染完成后,由于已经通过内存映射mmap函数将所述嵌入式设备的帧缓存映射至所述用户态虚拟空间,因此,应用程序可以直接通过所述用户态虚拟空间来访问所述嵌入式设备的帧缓存,所述内存映射mmap函数返回一个指向所述用户态虚拟空间的指针,任何对所述用户态虚拟空间的写操作都会反映到所述嵌入式设备的帧缓存上。

针对图3所示的技术方案,在一些可能的实现方式中,所述根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域,包括:

基于所述映射关系,利用内存复制memcpy函数将嵌入式设备的帧缓存内的渲染结果写入存在映射关系的所述用户态虚拟空间中的渲染区域。

对于上述实现方式,使用OpenGL或OpenGL ES执行渲染指令,并将渲染结果存放在所述嵌入式设备的帧缓存中,通过内存复制memcpy函数将所述嵌入式设备的帧缓存内的渲染结果写入所述用户态虚拟空间中的渲染区域。相比于图2所示的使用Pbuffer Surface渲染显示的流程,图2中需要额外的步骤将所述渲染的结果从Pbuffer复制到嵌入式设备的帧缓存,然后再根据所述映射关系,将所述嵌入式设备的帧缓存中的渲染结果,通过内存复制memcpy函数拷贝至所述用户态虚拟空间。本公开实施例是利用eglCreateWindowSurface函数直接在所述显示设备的用户态虚拟空间上创建渲染区域,基于所述映射关系,将嵌入式设备的帧缓存内的渲染结果写入所述用户态虚拟空间中的渲染区域,省略了将所述渲染的结果从Pbuffer复制到嵌入式设备的帧缓存的复制步骤,提升了渲染显示的效率。

针对图3所示的技术方案,在一些可能的实现方式中,所述通过显示设备显示所述渲染区域内的渲染结果,包括:

通过刷新显示命令将所述渲染区域内的渲染结果显示至所述显示设备。

对于上述实现方式,所述渲染结果已经在所述用户态虚拟空间的渲染区域中了,只需要根据所述刷新显示命令将所述渲染结果刷新到屏幕上。在一些示例中,根据具体的实施方式,也可以通过直接操作所述显示设备进行屏幕显示,可以实时地将渲染结果显示在屏幕上。

基于前述技术方案实现方式及示例的阐述,本公开实施例虽然在底层使用所述Pbuffer Surface渲染显示方式,但是只需要修改所述eglCreateWindowSurface函数的内部实现,就可以使得所述嵌入式设备支持Window Surface渲染显示方式,从而达到在所述嵌入式设备上可以同时支持两种渲染显示方式。此外,将所述eglCreateWindowSurface函数的代码可以直接移植到仅支持通过所述显示设备显示的其他嵌入式设备上,不需要修改。因此,能够适用于多应用或多窗口环境下的场景迁移。

结合图1所示的嵌入式设备以及图3所示的技术方案,参见图4,其示出了本公开实施例提供的一种使用Window Surface渲染显示的详细流程图,具体步骤如下:

S401:打开嵌入式设备中的显示设备;

通过所述显示设备可以直接操作嵌入式设备的帧缓存,即前述GPU的显存。初始化窗口信息,获取窗口的大小。

S402:获取显示信息;

所述显示信息包括显示相关信息和显示数据相关信息,其中,所述显示相关的信息至少包括屏幕分辨率、颜色深度、显存大小等。所述显示数据相关信息至少包括像素RGB掩码和占用的数据位数。

S403:使用内存映射mmap函数映射嵌入式设备的帧缓存到用户态虚拟空间;

所述内存映射mmap函数是一个系统调用,可以将物理内存或文件映射到进程的虚拟地址空间。映射的过程包括两个步骤:将所述显示设备的物理内存映射为用户态虚拟空间,然后将所述嵌入式设备的帧缓存映射至所述用户态虚拟空间。映射完成后,应用程序可以直接读写所述用户态虚拟空间,而不需要其他系统调用,任何对所述用户态虚拟空间的修改,都会直接反映到所述嵌入式设备的帧缓存上。也可以理解为直接操作所述用户态虚拟空间相当于直接操作嵌入式设备的帧缓存。

需要说明的是,通过步骤S401至S403步骤,即可实现所述显示设备直接操作所述用户态的虚拟空间相当于直接操作所述嵌入式设备的帧缓存。

S404:创建渲染区域;

通过EGL标准接口eglCreateWindowSurface函数在所述显示设备的用户态虚拟空间上创建渲染区域。所述渲染区域用于存放OpenGL或OpenGL ES渲染指令的渲染结果。

S405:配置渲染区域属性;

根据所述显示设备的显示特性配置像素RGB掩码等窗口显示的相关属性,所述属性可以确保渲染结果能够正确地显示在所述显示设备上。

S406:申请渲染区域的内存;

根据渲染窗口的大小,在所述显示设备的用户态虚拟空间中为所述渲染区域申请内存,该内存用于存放GPU即将渲染的结果数据。

S407:执行GPU渲染;

GPU执行OpenGL或OpenGL ES的渲染指令,并将渲染结果存放在所述嵌入式设备的帧缓存中。

S408:绑定渲染结果回调函数;

通过内存复制memcpy函数将所述嵌入式设备的帧缓存拷贝至所述用户态虚拟空间的渲染区域中。

S409:显示渲染结果;

通过刷新显示命令将所述渲染区域内的渲染结果显示至所述显示设备。在一些示例中,对于支持实时显示的嵌入式设备,也可以将对所述嵌入式设备的帧缓存的修改内容立即显示到屏幕上,可以通过输入输出控制命令或其他特定的系统调用来完成屏幕刷新,一旦刷新完成,用户就可以在屏幕上看到渲染的图像。

S410:释放资源。

渲染和显示完成后,需要进行清理操作,例如,通过系统调用munmap函数撤销所述显示设备的映射并释放之前申请的内存。通过系统调用close关闭所述显示设备以及释放任何其他由应用程序创建或占用的资源,例如,图形上下文或其他渲染资源,以避免资源泄露。

基于前述技术方案相同的发明构思,参见图5,其示出了一种渲染显示的装置500,所述装置500包括:建立模块501、设置模块502、映射模块503以及显示模块504;其中,

所述建立模块501,被配置成建立用户态虚拟空间与嵌入式设备的帧缓存之间的映射关系;

所述设置模块502,被配置成在所述用户态虚拟空间中设置渲染区域;

所述映射模块503,被配置成根据所述映射关系将嵌入式设备的帧缓存内的渲染结果映射至所述用户态虚拟空间中的渲染区域;

所述显示模块504,被配置成通过显示设备显示所述渲染区域内的渲染结果。

在一些示例中,所述建立模块501,被配置成通过内存映射mmap函数将所述嵌入式设备的帧缓存映射至所述用户态虚拟空间,以使得对所述用户态虚拟空间的操作均直接反映在被映射的帧缓存中。

在一些示例中,所述建立模块501,被配置成:

开启所述嵌入式设备中的显示设备以使得通过所述显示设备能够对所述嵌入式设备的帧缓存进行操作;

在所述嵌入式设备的内存资源中分配所述用户态虚拟空间。

在一些示例中,所述设置模块502,被配置成通过调用eglCreateWindowSurface函数在所述用户态虚拟空间中创建所述渲染区域。

在一些示例中,所述设置模块502,被配置成:

在所述用户态虚拟空间中为所述渲染区域划分对应的内存区域;

相应地,将渲染结果写入至所述渲染区域,包括:

将所述渲染结果写入至所述渲染区域划分对应的内存区域。

在一些示例中,所述映射模块503,被配置成将写入所述渲染区域内的渲染结果通过所述映射关系直接反映至所述嵌入式设备的帧缓存内。

在一些示例中,所述映射模块503,被配置成基于所述映射关系,利用内存复制memcpy函数将嵌入式设备的帧缓存内的渲染结果写入存在映射关系的所述用户态虚拟空间中的渲染区域。

在一些示例中,所述显示模块504,被配置成通过刷新显示命令将所述渲染区域内的渲染结果显示至所述显示设备。

可以理解地,上述渲染显示的装置500的示例性技术方案,与前述渲染显示的方法的技术方案属于同一构思,因此,上述渲染显示的装置500的技术方案未详细描述的细节内容,均可以参见前述渲染显示的方法的技术方案的描述,本公开实施例对此不做赘述。

除此之外,本领域技术人员可以理解,上述附图所示出的嵌入式设备的结构并不构成对嵌入式设备的限定,嵌入式设备可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。比如,嵌入式设备中还包括显示屏、摄像组件、麦克风、扬声器、射频电路、输入单元、传感器(比如加速度传感器、角速度传感器、光线传感器等等)、音频电路、WiFi模块、电源、蓝牙模块等部件,在此不再赘述。

本公开实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有至少一条指令,所述至少一条指令用于被处理器执行以实现如上各个实施例所述的渲染显示的方法。

本公开实施例还提供了一种计算机程序产品,该计算机程序产品包括计算机指令,该计算机指令存储在计算机可读存储介质中;嵌入式设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该嵌入式设备执行以实现上述各个实施例所述的渲染显示的方法。

本领域技术人员应该可以意识到,在上述一个或多个示例中,本公开实施例所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。

需要说明的是:本公开实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。

以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。

相关技术
  • 小程序的界面渲染方法、装置、电子设备和存储介质
  • 渲染立体图形线框的方法、装置、计算机设备和存储介质
  • 一种页面渲染方法、装置、设备和存储介质
  • 页面渲染方法、装置、计算机设备及存储介质
  • 在canvas中渲染数据的方法、装置、电子设备及存储介质
  • 图像渲染方法及装置、显示设备、存储介质及电子设备
  • 信息点显示方法和装置、地图渲染方法、电子设备及存储介质
技术分类

06120116492098