CN103593184B - 图像显示系统及图像显示方法 - Google Patents

图像显示系统及图像显示方法 Download PDF

Info

Publication number
CN103593184B
CN103593184B CN201310533116.7A CN201310533116A CN103593184B CN 103593184 B CN103593184 B CN 103593184B CN 201310533116 A CN201310533116 A CN 201310533116A CN 103593184 B CN103593184 B CN 103593184B
Authority
CN
China
Prior art keywords
api
information
data bag
module
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201310533116.7A
Other languages
English (en)
Other versions
CN103593184A (zh
Inventor
陈屴
曾飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Rockchip Electronics Co Ltd
Original Assignee
Fuzhou Rockchip Electronics Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fuzhou Rockchip Electronics Co Ltd filed Critical Fuzhou Rockchip Electronics Co Ltd
Priority to CN201310533116.7A priority Critical patent/CN103593184B/zh
Publication of CN103593184A publication Critical patent/CN103593184A/zh
Application granted granted Critical
Publication of CN103593184B publication Critical patent/CN103593184B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明提供一种图像显示系统,包括服务端和客户端。服务端包括API重定向模块、API记录模块、打包模块和压缩模块。API重定向模块将处理单元运行应用时发出的第一API定向到封装层中对应的第二API,API记录模块记录第一API信息并生成API数据包,经过打包模块和压缩模块的处理将生成压缩包。客户端包括解压缩模块、解包模块和API重放模块,压缩包经过解压缩模块和解包模块的处理获得相应的API信息,API重放模块调用GPU执行API并显示相应的图像。本发明还提供一种图像显示系统和方法,利用本发明解决现有技术中记录与重放API受到特定GPU及应用平台的局限而不具有通用性,以及无法支持实时播放需求的技术问题。

Description

图像显示系统及图像显示方法
技术领域
本发明涉及图像处理及显示技术领域,尤其是涉及一种能够记录与重放API(Application Programming Interface,应用程序编程接口)的图像显示系统及图像显示方法。
背景技术
OpenGL ES(OpenGL for Embedded Systems)是免费的跨平台的3D图形API(Application Programming Interface,应用程序编程接口)标准,主要针对手机、平板电脑和游戏主机等嵌入式设备而设计。OpenGL ES是从OpenGL裁剪定制而来的,去除了glBegin/glEnd、四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展,OpenGL ES现在有三个版本,OpenGL ES1.x是针对固定管线硬件的,OpenGL ES2.x针对可编程管线硬件,OpenGL ES3.0于2012年公布,在OpenGL ES2.x基础上又加入了大量新特性。目前主流嵌入式图形处理器大都同时支持OpenGL ES1.x与OpenGL ES2.x标准。
目前,在OpenGL ES标准下进行记录与重放OpenGL ES API在解析应用程序、调试GPU驱动、回放游戏画面以及同屏显示图像画面等场景有着广泛的应用前景,例如,在没有应用程序源码的情况下可以通过记录OpenGL ES API进行应用程序行为的分析,将一平台上记录的OpenGL ES API在另一平台上重放而实现应用程序的安装以调试、验证GPU驱动,以及在服务端运行3D应用时将OpenGL ES API传输到客户端进行相同画面的显示以节省传输的带宽。
然而,目前只有部分嵌入式GPU厂商提供了具有记录与重放API的工具,但是这些工具有以下局限性:(1)记录API是在GPU驱动层实现,必须支付授权费获得GPU厂商的授权才能使用这些工具;(2)只适用于特定厂商的GPU,不具有通用性;(3)一般情况下只能在一种平台上使用,跨平台性欠佳;(4)只能支持非实时的记录与重放,无法满足同屏显示的实时性需求。
发明内容
本发明实施例所要解决的技术问题在于,提供一种图像显示系统及图像显示方法,以解决现有技术中进行记录与重放API受到特定GPU及应用平台的局限而不具有通用性,以及无法支持实时播放需求的技术问题。
为实现上述目的,本发明提供一种图像显示系统,运行一主机装置中,该图像显示系统包括用于执行应用程序的处理单元以及用于执行API以调用显示单元显示相应图像的GPU,其特征在于,该图像显示系统还包括服务端和客户端,该服务端包括:
API重定向模块,设置于系统封装层,用于根据该处理单元运行应用程序时发出的第一API重新定向到封装层中对应的第二API,以及根据系统设置判断是否记录该第一API信息。
API记录模块,用于当该API重定向模块确定记录该第一API信息时对该第一API信息进行记录,以及根据记录的API信息生成相应的一个或多个API数据包。
打包模块,用于获取该一个或多个API数据包,并将该一个或多个API数据包打包组合成一个帧数据包。以及
压缩模块,用于使用一压缩算法将该打包模块生成的数据包进行压缩以形成相应的压缩包,以及添加相应的压缩协议信息至该帧数据包。
该客户端包括:
解压缩模块,用于获取该压缩模块生成的压缩包,并分析该压缩包的压缩协议信息以得到一个或多个原始帧数据包。
解包模块,用于获取该一个或多个原始帧数据包,并依次将每个帧数据包的头部信息取出以获得相应的API信息。以及
API重放模块,用于按照该解包模块获得的API信息调用该GPU执行该API并由显示单元显示相应的图像。
进一步地,本发明提供的一种图像显示方法,该方法包括:
根据运行应用程序时发出的第一API重新定向到封装层中对应的第二API,以及根据系统设置判断是否记录该第一API信息。
记录该第一API信息。
将记录的API信息生成相应的API数据包。
将一个或多个该API数据包组合成一个帧数据包。
利用一压缩算法对该数据包进行压缩以形成相应的压缩包,并添加相应的压缩协议信息至该压缩包。
分析该压缩包的协议信息以得到一个或多个原始帧数据包。
获取该一个或多个原始的帧数据包,并依次根据每个数据包的压缩协议信息获得每帧中的API信息。以及
执行获取的该API信息以显示相应的图像。
本发明提供的一种图像显示系统和图像显示方法,通过服务端中设置在封装层内的API重定向单元重定向了系统应用的API调用,并控制记录API功能的打开和关闭,并且服务端将记录的API信息经过打包压缩后传送至客户端进行解包、解压缩,以此进行API的重放以在客户端上显示相应的图像,并且与服务端显示的画面相同。从而,解决现有技术中进行记录与重放API受到特定GPU及应用平台的局限而不具有通用性,以及无法支持实时播放需求的技术问题。
附图说明
图1为本发明实施方式中的图像显示系统的功能模块示意图;
图2为本发明实施方式中的图像显示方法的流程图;
图3为本发明实施方式中的API记录方法的流程图。
标号说明:
图像显示系统 10
处理单元 11
应用程序 110
服务端 20
API重定向模块 21
API记录模块 22
缓冲存储区 220
打包模块 23
压缩模块 24
第一GPU 25
第一显示单元 26
客户端 30
解压缩模块 31
解包模块 32
API重放模块 33
第二GPU 34
第二显示单元 35
具体实施方式
为详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。
请参考图1,为本发明实施方式中的图像显示系统的功能模块示意图,该图像显示系统10包括处理单元11、服务端20以及客户端30。该图像显示系统10运行于一个或两个主机装置中,该一个或两个主机装置可以为便携式电子装置,例如便携式计算机(例如膝上型计算机、笔记本计算机或平板计算机),还可以包括可视媒体播放器、个人数字助理等,还可以是个人计算机。在本实施方式中,该服务端20与客户端30设置在同一主机装置中,在其他实施方式中,该服务端20设置在一主机装置中,该客户端30设置在另一主机装置中。
该处理单元11用于提供处理能力以执行操作系统、程序、用户和应用界面、以及图像显示系统10的任何其他功能,一应用程序110由处理单元11在管理程序中或无管理程序的操作系统中执行(操作系统和管理程序在图中未显示)。例如,操作系统包含Windows XP、UNIX、Android等。在本实施方式中,该应用程序为OpenGL ES1.x,在其他实施方式中,该应用程序还可以是OpenGL ES2.x或OpenGL ES3.x。
该服务端20包括API重定向模块21、API记录模块22、打包模块23、压缩模块24、第一GPU(Graphic Processing Unit,图形处理单元)25以及第一显示单元26。在本实施方式中,该API重定向模块21为OpenGL ES1.x API重定向模块,在其他实施方式中,该API重定向模块21还可以是OpenGL ES2.x API重定向模块或OpenGL ES3.x API重定向模块。该API重定向模块21设置于系统封装层,用于根据处理单元11运行应用程序110时发出的第一API重新定向到封装层中对应的第二API,以及根据系统设置判断是否记录该第一API信息。具体地,以glDrawArrays这个API为例,应用程序调用glDrawArrays后,封装层并不是直接调用到GPU驱动的glDrawArrays函数,而是由API重定向模块23调用到封装层中与glDrawArrays对应的glDrawArraysWrap函数。该API重定向模块21在glDrawArraysWrap中判断是否需要记录下对应的API信息参数,如果不需要记录,则直接调用GPU驱动的glDrawArrays函数;如果需要记录,则除了调用GPU驱动的glDrawArrays函数外,还要记录下glDrawArrays的参数。
在本实施方式中,根据OpenGL ES1.x API的功能,将API分成5类,包括:设置状态API、查询状态API、缓冲区数据与纹理数据API、顶点属性数组API以及绘制图元API。其中,设置状态API用于对OpenGL ES1.x的状态变量进行渲染,该状态变量包括颜色、顶点坐标、深度、视点和投影变换、纹理映射、光照和材质等。查询状态API用于对OpenGL ES1.x的当前状态进行查询,以及将当前帧缓冲中的像素数据反馈至GPU以供应用程序使用,其包括glGet*和glIs*。缓冲区数据与纹理数据API的输入参数中包括指向大量数据的指针,其包括glBufferData、glBufferSubData、glCompressedTexImage2D、glCompressedTexSubImage2D、glTexImage2D、以及glTexSubImage2D。顶点属性数组API用于标识顶点属性,顶点属性包括颜色、法线、纹理坐标和顶点坐标,这类API包括glColorPointer、glNormalPointer、glTexCoordPointer和glVertexPointer。绘制图元API包括glDrawArrays和glDrawElements,用于指定将要绘制的图元的类型和参与绘制的顶点,并向GPU发出绘制的命令,GPU根据此时的OpenGL ES1.x的状态进行渲染。
API信息包括API名称、上下文(context)、输入参数、还可以包括API返回值。当该API重定向模块21根据重新定向的API确定进行记录API信息时产生相应的控制信号,该API记录模块22用于响应该控制信号对该第一API信息进行记录,具体包括:该API记录模块22依次记录该第一API信息中的函数名称、上下文以及输入参数,以及判断该第一API信息中是否具有数据指针。当确定该第一API信息中具有数据指针时该API记录模块22复制指针所指向的数据并调用第一GPU25执行该第一API,当确定该API信息中不具有数据指针时直接调用第一GPU25执行该第一API。当第一GPU25执行该第一API完成时,该API记录模块22还判断第一GPU25执行该第一API后是否产生返回值,并当确定产生返回值时该API记录模块22将该返回值记录下来。该API记录模块22还根据该第一API信息判断是否需要进行特殊处理,以及将经过特殊处理或未经过特殊处理的记录的API信息以API数据包的形式存储到缓冲存储区220中。在本实施方式中,该API记录模块22以添加相应的glMsg到缓冲存储区220中的方式进行API的记录。
以在运行应用程序为OpenGL ES1.x的情况下记录API信息为例进行具体说明:该API记录模块22用连续的正整数表示记录的API名称,且每个API与一个数字对应。每个上下文代表一个独立的可视的绘图区域,且存储了一个OpenGL ES1.x实例的所有状态,该API记录模块22用正整数标识上下文,且每个上下文与一个数字对应。该API记录模块22根据OpenGL ES1.x标准中的API原型依次记录API的输入参数,具体地,对于类型为向量形式的API记录向量的所有分量,对于类型为数据指针的输入参数首先记录数据长度,然后记录指针所指向的数据内容。记录数据的长度是便于在接下来的流程中复制数据,统计glMsg的总大小,以及当数据长度为0时可以表示数据指针是空指针或是在缓冲区数据中的偏移量。当调用GPU驱动执行完API后,该API记录模块22记录下具有返回值的API对应的返回值。
本发明根据API信息可以将API划分为三类,包括只需要依次记录下完整信息的API、不需要记录信息的API以及需要特殊处理的API。
在本实施方式中,不需要记录的API包括查询状态的API、glGenBuffers以及glGenTextures。具体地,查询记录的API的作用在于反馈OpenGL ES1.x的当前状态以便执行的应用程序110选择下一步操作,并没有直接参与绘图操作,客户端30只需要显示出与服务端20相同的画面,并不需要去选择应用程序的运行路径。因此,本发明中服务端20不记录查询状态的API。glGenBuffers以及glGenTextures用于生成一个或多个对象(缓冲区对象或纹理对象)名称,但是在服务端20和客户端30执行同样API时生成的对象名称并不一定相同,其取决于GPU驱动对OpenGL ES1.x的实现。OpenGL ES1.x允许不通过预先生成对象名称能够在执行绑定操作(glBindBuffer、glBindTexture)和删除操作(glDeleteBuffers、glDeleteTextures)中使用这个对象名称。如果服务端20的部分对象名称是调用API生成的,另一部分对象名称是直接绑定的,就会造成客户端30管理对象名称的混乱,使得API无法得到正确地执行。因此,本发明的服务端20负责管理全部的对象名称,客户端30不生成对象名称,只是执行与服务端20相同的绑定操作和删除操作,保证服务端20与客户端30的对象名称是一一对应的,服务端20可以确保对象名称的正确使用。因此,服务端20不记录glGenBuffers和glGenTextures这两个API。
在本实施方式中,需要进行特殊处理的API包括顶点属性数组API、绘制图元API、glBufferData以及glBufferSubData。具体地,glColorPointer、glNormalPointer、glTexCoordPointer和glVertexPointer这四个API的输入参数中都有一个指向属性数据的指针。在没有绑定顶点属性缓冲区的情况下,参与绘制的顶点直到glDrawArrays或glDrawElements时才能确定,而在调用顶点属性数组API时无法记录下绘图所需要的顶点属性数据。因此,对于没有绑定顶点属性缓冲区的顶点属性数组API进行的特殊处理包括:在调用未绑定顶点属性缓冲区的顶点属性数组API时,将除了顶点属性数据之外的参数记录在glMsg中;对于glTexCoordPointer函数,在glMsg中额外增加一个参数记录当前绑定的纹理单元;不完整的glMsg被添加到队列中而不是记录缓冲区中。
绘制图元API包括glDrawArrays和glDrawElements,其函数原型如下:glDrawArrays(GLenum mode、GLint first、GLsizei count),glDrawElements(GLenum mode、GLsizei count、GLenum type、const GLvoid*indices),用于设置图元的类型(输入参数mode)、参与绘制的顶点索引的数目(输入参数count)以及索引。其中,glDrawArrays的顶点起始索引是输入参数first,随后的连续count-1个顶点参与绘制,glDrawElements的输入参数indices指向存放顶点索引的数组。由于顶点属性数组API在没有绑定顶点属性缓冲区对象的情况下被“缓存”,执行glDrawArrays和glDrawElements时需要在记录API时的特殊处理包括:从队列中依次取出缓存的顶点属性数组API的glMsg,此时参与绘图的顶点已经确定,在原先的glMsg的基础上将参与绘图的顶点属性数据记录下来,构成一个完整的glMsg,添加到记录缓冲区中;执行glDrawArrays或glDrawElements结束后,清空队列。应用程序110可能一次在一块内存中传入了所有顶点的属性数据,但是每次参与绘制的顶点只是其中的一部分,客户端30只需要参与绘制的那部分顶点的属性数据就可以正确绘图。在本实施方式中,该服务端20只对必须的顶点属性数据进行记录。具体地,glDrawArrays其参与绘制的顶点索引是连续的,只需要将索引从first开始的连续count个顶点的属性数据记录下来,glDrawElements的输入参数indices指向的索引数组中的索引是没有规律的,数组中也可能有重复的索引,因此找出参与绘制的索引的最小和最大值,并将最小索引和最大索引之间的那部分顶点的属性数据记录下来。
glBufferData和glBufferSubData这两个API的函数原型为void glBufferData(GLenum target、GLsizeiptr size、const GLvoid*data、GLenum usage);voidglBufferSubData(GLenum target、GLintptr offset、GLsizeiptr size、const GLvoid*data)。当顶点属性数组API没有绑定顶点属性缓冲区对象时需要在执行glDrawElements时找出参与绘图的顶点索引的最大值和最小值,当应用程序为glDrawElements的索引数组绑定索引缓冲区,由于索引缓冲区中的内容存储在GPU的内存中,此时服务端无法访问到这些索引数据。因此,对glBufferData和glBufferSubData执行的特殊处理包括:在上下文中为每个索引缓冲区对象分配一块相同大小的备份索引缓冲区,该备份索引缓冲区的内容是服务端可以访问到的。在glBufferData/glBufferSubData更新数据到索引缓冲区的同时将数据更新到对应的备份索引缓冲区,使得备份索引缓冲区中的数据与索引缓冲区保持一致。在记录glDrawElements的过程中就可以在备份索引缓冲区中查找索引的最大值和最小值,并且备份索引缓冲区随着索引缓冲区销毁而销毁。
该API记录模块22将记录API信息生成相应的API数据包,并将API数据包存储到缓冲存储区220中。该打包模块23用于将缓冲存储区220中存储的多个API数据包进行组合打包并发送至压缩模块24。在本实施方式中,该打包模块23将多个API数据包组合成一个帧数据包,具体地,该打包模块23将API记录模块22输出的API数据包不断地累加到帧数据包中,在一帧结束后再将帧数据包发送给压缩模块24。进一步地,该打包模块23还判断当前帧数据包的大小是否超过一个阈值,若确定当前帧数据包的大小超过该阈值时则无论这一帧是否结束,都将当前的帧数据包发送至压缩模块24,并将该帧剩余的API数据包再组成一个或多个新的帧数据包。
该压缩模块24用于使用一压缩算法对接收到的数据包进行压缩,以及添加相应的压缩协议信息。在本实施方式中,该压缩模块24以打包模块23输出的一个数据包作为单位进行数据包压缩,上述压缩算法包括通用压缩算法(GeneralCompression)和差量压缩算法(Delta Compression),若当前API数据包和上一个API数据包相似程度较高,该压缩模块24使用差量压缩算法对当前API数据包进行压缩以获得较高压缩比,若当前API数据包和上一个API数据包的相关性较弱,则该压缩模块24使用通用压缩算法对当前API数据包进行压缩。在对API数据包进行压缩后,该压缩模块24还用于在获得的压缩包的头部加入压缩协议信息,其中,该压缩协议信息包括压缩后数据包的校验值、压缩类型、压缩前的数据量以及压缩后的数据量。
该客户端30包括解压缩模块31、解包模块32、API重放模块33、第二GPU34以及第二显示单元35。当服务端20完成API数据包的压缩并将压缩包传送至客户端30时,该客户端30的解压缩模块31用于分析接收到的压缩包的协议信息头以得到原始的帧数据包,具体地,该解压缩模块31通过校验值校验数据以保证数据的正确性,根据压缩后的数据量将数据流以压缩包为单位分割出来,根据压缩前的数据量分配内存给解压后的帧数据包,以及根据压缩类型进行相应地解压,得到原始的帧数据包。
该解包模块32用于获取解压缩模块31处理得到的原始的帧数据包,取出一个API数据包的头部,获得该API的glMsg的数据长度信息,以及将该API的参数信息送至API重放模块33,该解包模块32依照上述处理过程直至处理完所有API数据包。
该API重放模块33按照解包模块32发送的API参数调用第二GPU34执行该API,并由第二显示单元35显示相应的图像信息。在本实施方式中,需要特殊处理的API包括输入参数包含数据指针的API、顶点属性数组API以及glScissor与glViewport。
具体地,服务端20对于输入参数包含数据指针的API并没有记录应用程序设定的数据指针,而是记录了数据的长度和数据的内容。因此,在客户端30重放对应的API时,该API重放模块33将输入参数中的数据指针设置为指向服务端20传送过来的数据内容。对于绑定了顶点属性缓冲区的顶点属性数组API,API重放模块33回放服务端20传送过来的参数。对于未绑定顶点属性缓冲区的顶点属性数组API,服务端20在缓存这些API后记录相应的API信息,该API重放模块33在回放未绑定顶点属性缓冲区的顶点属性数组API之前执行glBindBuffer(GL_ARRAY_BUFFER,0)以解除绑定顶点属性缓冲区,在回放API完成之后执行glBindBuffer(GL_ARRAY_BUFFER,curbuf)以重新绑定此时上下文的顶点属性缓冲区。glTexcoordPointer与纹理单元相关,在服务端20,未绑定定点属性缓冲区的glTexCoordPointer被延后记录,以及增加额外的参数记录当时绑定的纹理单元(记为X)。在客户端30回放未绑定顶点属性缓冲区的glTexCoordPointer之前执行glClientActiveTexture(X)以设置当时的纹理单元,并在回放后执行glClientActiveTexture(Y)以重新绑定此时上下文的纹理单元(Y)。glScissor与glViewport的原型分别为void glScissor(GLint x,GLint y,GLsizei width,GLsizei height)和void glViewport(GLint x,GLint y,GLsizeiwidth,GLsizei height)。由于服务端20与客户端30的屏幕分辨率可能不同,客户端30在重放glScissor与glViewport时要做适应屏幕分辨率的调整,具体包括:设置服务端的分辨率为(Ws,Hs),客户端的分辨率为(Wc,Hc),计算宽比例因子为Fw=Wc/Ws,高比例因子Fh=Hc/Hs。对API中的输入x,y,width,height参数分别做如下处理:
x′=(GLint)(x*Fw+0.5f);
y′=(GLint)(y*Fh+0.5f);
width′=(GLsizei)(width*Fw+0.5f);
height′=(GLsizei)(height*Fh+0.5f);
将调整后的x′,y′,width′,height'作为新的输入参数传给第二GPU34以驱动第二显示单元35进行相应图像的显示。
请参阅图2,为本发明实施方式中的图像显示方法的流程图,该方法包括:
步骤S40,该API重定向模块21根据处理单元11运行应用程序110时发出的第一API重新定向到封装层中对应的第二API,以及根据系统设置判断是否记录该第一API信息。若是,则进入步骤S41,否则,继续执行步骤S40。
其中,该API重定向模块21设置于系统封装层中。
步骤S41,该API记录模块22响应API重定向模块21的调用对该第一API信息进行记录。其中,API信息包括API名称、上下文(context)、输入参数、还可以包括API返回值。
请同时参阅图3,为本发明实施方式中的API记录方法的流程图,该方法包括:
步骤S410,该API记录模块22依次记录该第一API信息中的函数名称、上下文以及输入参数。
以在运行应用程序为OpenGL ES1.x的情况下记录API信息为例进行具体说明:该API记录模块22用连续的正整数表示记录的API名称,且每个API与一个数字对应。每个上下文代表一个独立的可视的绘图区域,且存储了一个OpenGL ES1.x实例的所有状态,该API记录模块22用正整数标识上下文,且每个上下文与一个数字对应。该API记录模块22根据OpenGL ES1.x标准中的API原型依次记录API的输入参数,具体地,对于类型为向量形式的API记录向量的所有分量,对于类型为数据指针的输入参数首先记录数据长度,然后记录指针所指向的数据内容。
步骤S411,该API记录模块22判断该第一API信息中是否具有数据指针,若是,则进入步骤S412,否则,进入步骤S413。
步骤S412,该API记录模块22复制指针所指向的数据。
步骤S413,该第一GPU25获取并执行该第一API以驱动第一显示单元26显示相应的图像。
步骤S414,该API记录模块22判断第一GPU25执行该第一API完成后是否产生返回值,若是,则进入步骤S415,否则,进入步骤S416。
步骤S415,该API记录模块22记录该第一API执行完成后产生的返回值。
步骤S416,该API记录模块22根据该第一API信息判断是否对该第一API进行特殊处理,若是,则进入步骤S417,否则,本流程结束。
步骤S417,该API记录模块22根据第一API信息对该第一API进行特殊处理。然后,本流程结束。
本发明根据API信息可以将API划分为三类,包括只需要依次记录下完整信息的API、不需要记录信息的API以及需要特殊处理的API。在本实施方式中,不需要记录的API包括查询状态的API、glGenBuffers以及glGenTextures,需要进行特殊处理的API包括顶点属性数组API、绘制图元API、glBufferData以及glBufferSubData。
对于没有绑定顶点属性缓冲区的顶点属性数组API进行的特殊处理包括:在调用未绑定顶点属性缓冲区的顶点属性数组API时,将除了顶点属性数据之外的参数记录在glMsg中;对于glTexCoordPointer函数,在glMsg中额外增加一个参数记录当前绑定的纹理单元;不完整的glMsg被添加到队列中而不是记录缓冲区中。
当顶点属性数组API没有绑定顶点属性缓冲区时,执行绘制图元API中的glDrawArrays和glDrawElements需要进行的特殊处理包括:从队列中依次取出缓存的顶点属性数组API的glMsg,此时参与绘图的顶点已经确定,在原先的glMsg的基础上将参与绘图的顶点属性数据记录下来,构成一个完整的glMsg,添加到记录缓冲区中;执行glDrawArrays或glDrawElement结束后,清空队列。
当顶点属性数组API没有绑定顶点属性缓冲区时需要在执行glDrawElements时找出参与绘图的顶点索引的最大值和最小值,当应用程序为glDrawElements的索引数组绑定了索引缓冲区时,对glBufferData和glBufferSubData执行的特殊处理包括:在上下文中为每个索引缓冲区对象分配一块相同大小的备份索引缓冲区;在glBufferData/glBufferSubData更新数据到索引缓冲区的同时将数据更新到对应的备份索引缓冲区,使得备份索引缓冲区中的数据与索引缓冲区保持一致。在记录glDrawElements的过程中在备份索引缓冲区中查找索引的最大值和最小值,并且备份索引缓冲区随着索引缓冲区销毁而销毁。
步骤S42,该API记录模块22将记录API信息生成相应的API数据包,并将API数据包存储到缓冲存储区220中。
在本实施方式中,该API记录模块22以添加相应的glMsg到缓冲存储区220中的方式进行API的记录。
步骤S43,该打包模块23将缓冲存储区220中存储的多个API数据包组合成相应的帧数据包并发送至压缩模块24。
在本实施方式中,该打包模块23还判断当前的帧数据包的大小是否超过一个阈值,若确定当前帧数据包的大小超过该阈值时则无论这一帧是否结束,都将当前的帧数据包发送至压缩模块24,并将该帧剩余的API数据包再组成一个或多个新的帧数据包。
步骤S44,该压缩模块24使用一压缩算法对接收到的帧数据包进行压缩,添加相应的压缩协议信息,以及将压缩包发送至客户端30。
在本实施方式中,该压缩模块24以打包模块23输出的一个数据包作为单位进行数据包压缩,上述压缩算法包括通用压缩算法(General Compression)和差量压缩算法(Delta Compression),若当前API数据包和上一个API数据包相似程度较高,该压缩模块24使用差量压缩算法对当前API数据包进行压缩以获得较高压缩比,若当前API数据包和上一个API数据包的相关性较弱,则该压缩模块24使用通用压缩算法对当前API数据包进行压缩。
在对API数据包进行压缩后,该压缩模块24在获得的压缩包的头部加入压缩协议信息,其中,该压缩协议信息包括压缩后数据包的校验值、压缩类型、压缩前的数据量以及压缩后的数据量。
步骤S45,该解压缩模块31分析接收到的压缩包的协议信息头以得到原始的帧数据包,具体地,该解压缩模块31通过校验值校验数据以保证数据的正确性,根据压缩后的数据量将数据流以压缩包为单位分割出来,根据压缩前的数据量分配内存给解压后的帧数据包,以及根据压缩类型进行相应地解压,得到原始的帧数据包。
步骤S46,该解包模块32用于获取解压缩模块31处理得到的原始的帧数据包,取出一个API数据包的头部以获得该API的glMsg的数据长度信息,以及将该API的参数信息发送至API重放模块33,该解包模块32依照上述处理过程直至处理完所有的API数据包。
步骤S47,该API重放模块33按照解包模块32发送的API参数调用第二GPU34执行该API,以驱动第二显示单元35显示相应的图像信息。其中,该第二显示单元35显示的图像与第一显示单元26显示的图像相同,即客户端30显示的图像与服务端20显示的图像相同。
在本实施方式中,需要特殊处理的API包括输入参数包含数据指针的API、顶点属性数组API以及glScissor与glViewport。
具体地,服务端20对于输入参数包含数据指针的API并没有记录应用程序设定的数据指针,而是记录了数据的长度和数据的内容。因此,在客户端30重放对应的API时,该API重放模块33将输入参数中的数据指针设置为指向服务端20传送过来的数据内容。对于绑定了顶点属性缓冲区的顶点属性数组API,API重放模块33回放服务端20传送过来的参数。对于未绑定顶点属性缓冲区的顶点属性数组API,服务端20在缓存该些API后记录相应的API信息,该API重放模块33在回放未绑定顶点属性缓冲区的顶点属性数组API之前执行glBindBuffer(GL_ARRAY_BUFFER,0)以解除绑定顶点属性缓冲区,在回放API完成之后执行glBindBuffer(GL_ARRAY_BUFFER,curbuf)以重新绑定此时上下文的顶点属性缓冲区。glTexcoordPointer与纹理单元相关,在服务端20,未绑定定点属性缓冲区的glTexCoordPointer被延后记录,以及增加额外的参数记录当时绑定的纹理单元(记为X)。在客户端30回放未绑定顶点属性缓冲区的glTexCoordPointer之前执行glClientActiveTexture(X)以设置当时的纹理单元,并在回放后执行glClientActiveTexture(Y)以重新绑定此时上下文的纹理单元(Y)。glScissor与glViewport的原型分别为void glScissor(GLint x,GLint y,GLsizei width,GLsizei height)和void glViewport(GLint x,GLint y,GLsizeiwidth,GLsizei height)。由于服务端20与客户端30的屏幕分辨率可能不同,客户端30在重放glScissor与glViewport时要做适应屏幕分辨率的调整,具体包括:设置服务端的分辨率为(Ws,Hs),客户端的分辨率为(Wc,Hc),计算宽比例因子为Fw=Wc/Ws,高比例因子Fh=Hc/Hs。对API中的输入x,y,width,height参数分别做如下处理:
x′=(GLint)(x*Fw+0.5f);
y′=(GLint)(y*Fh+0.5f);
width′=(GLsizei)(width*Fw+0.5f);
height′=(GLsizei)(height*Fh+0.5f);
将调整后的x′,y′,width′,height′作为新的输入参数传给第二GPU34以驱动第二显示单元35进行相应图像的显示。
本发明提供的一种图像显示系统和图像显示方法,通过服务端中设置在封装层内的API重定向单元重定向了系统应用的API调用,并控制记录API功能的打开和关闭,并且服务端将记录的API信息经过打包压缩后传送至客户端进行解包、解压缩,以此进行API的重放以在客户端上显示相应的图像,并且与服务端显示的画面相同。从而,解决现有技术中进行记录与重放API受到特定GPU及应用平台的局限而不具有通用性,以及无法支持实时播放需求的技术问题。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (13)

1.一种图像显示系统,运行一主机装置中,所述图像显示系统包括用于执行应用程序的处理单元以及用于执行API以调用显示单元显示相应图像的GPU,其特征在于,所述图像显示系统还包括服务端和客户端,所述服务端包括:
API重定向模块,设置于系统封装层,用于根据所述处理单元运行应用程序时发出的第一API重新定向到封装层中对应的第二API,以及根据系统设置判断是否记录所述第一API信息;所述API信息包括API名称、上下文、输入参数以及API返回值;
API记录模块,用于当所述API重定向模块确定记录所述第一API信息时对所述第一API信息进行记录,以及根据记录的API信息生成相应的一个或多个API数据包;所述API记录模块记录所述第一API信息以及根据记录的API信息生成相应的一个或多个API数据包,包括:
所述API记录模块依次记录所述第一API信息中的API名称、上下文和输入参数,以及判断所述第一API信息中是否具有数据指针;
当确定所述第一API信息中具有数据指针时所述API记录模块复制指针所指向的数据并调用所述服务端的GPU执行所述第一API以在服务端的显示单元上显示相应图像,当确定所述API信息中不具有数据指针时直接调用所述服务端的GPU执行所述第一API以在所述服务端的显示单元上显示相应图像;
当所述服务端的GPU执行所述第一API完成时,所述API记录模块还判断执行所述第一API完成后是否产生返回值,并当确定产生返回值时所述API记录模块记录所述返回值;以及
所述API记录模块还判断所述第一API是否为需要进行特殊处理的API,以及将经过特殊处理或未经过特殊处理的记录的API信息以API数据包的形式存储到所述服务端的缓冲存储区中;所述需要进行特殊处理的API包括顶点属性数组API、绘制图元API、glBufferData以及glBufferSubData;所述特殊处理包括:所述API记录模块调用未绑定顶点属性缓冲区的顶点属性数组API时将除了顶点属性数据之外的参数记录在glMsg中并添加到一个队列中;所述API记录模块调用glTexCoordPointer函数时在glMsg中增加一个参数记录当前绑定的纹理单元;所述API记录模块执行绘制图元API中的glDrawArrays和glDrawElements时,从队列中依次取出缓存的顶点属性数组API的glMsg,在原始的glMsg上将参与绘图的顶点属性数据记录下来以构成完整的glMsg,并在执行glDrawArrays或glDrawElements结束后清空队列;所述API记录模块执行glBufferData和glBufferSubData时在上下文中为每个索引缓冲区对象分配一块相同大小的备份索引缓冲区,以及在glBufferData/glBufferSubData更新数据到索引缓冲区的同时将数据更新到对应的备份索引缓冲区,使得备份索引缓冲区中的数据与索引缓冲区保持一致;
打包模块,用于获取所述一个或多个API数据包,并将所述一个或多个API数据包打包组合成一个帧数据包;以及
压缩模块,用于使用一压缩算法将所述帧数据包进行压缩以形成相应的压缩包,以及添加相应的压缩协议信息至所述压缩包;
所述客户端包括:
解压缩模块,用于获取所述压缩模块生成的压缩包,并分析所述压缩包的压缩协议信息以得到一个或多个原始帧数据包;
解包模块,用于获取所述一个或多个原始帧数据包,并依次根据每个帧数据包的压缩协议信息获得相应的API信息;以及
API重放模块,用于按照所述解包模块获得的API信息调用所述GPU执行获得的API信息并由显示单元显示相应的图像。
2.如权利要求1所述的图像显示系统,其特征在于,所述服务端设置在第一主机装置中,所述客户端设置在第二主机装置。
3.如权利要求1所述的图像显示系统,其特征在于,所述应用程序为OpenGL ES 1.x,所述API记录模块依次记录所述第一API信息中的API名称、上下文和输入参数,包括:
所述API记录模块用连续的正整数表示记录的API名称,且每个API与一个数字对应;所述API记录模块用正整数标识上下文,且每个上下文与一个数字对应;所述API记录模块根据OpenGL ES 1.x标准中的API原型依次记录API的输入参数。
4.如权利要求1所述的图像显示系统,其特征在于,所述打包模块将一帧中的API数据包组合成一个帧数据包,还用于判断当前的帧数据包的大小是否超过一个阈值,若确定当前帧数据包的大小超过所述阈值时则无论这一帧是否结束都将当前的帧数据包发送至所述压缩模块,并将所述帧剩余的API数据包再组成一个或多个新的帧数据包。
5.如权利要求1所述的图像显示系统,其特征在于,所述压缩模块以所述打包模块输出的一个数据包作为单位进行数据包压缩,所述压缩算法包括通用压缩算法和差量压缩算法,当前API数据包和上一个API数据包相似程度较高时所述压缩模块使用差量压缩算法对当前API数据包进行压缩,当前API数据包和上一个API数据包的相关性较弱时所述压缩模块使用通用压缩算法对当前API数据包进行压缩。
6.如权利要求5所述的图像显示系统,其特征在于,所述压缩协议信息包括压缩后数据包的校验值、压缩类型、压缩前的数据量以及压缩后的数据量。
7.一种图像显示方法,其特征在于,所述方法包括:
根据运行应用程序时发出的第一API重新定向到封装层中对应的第二API,以及根据系统设置判断是否记录所述第一API信息;
记录所述第一API信息;所述API信息包括API名称、上下文、输入参数和返回值,所述“记录所述第一API信息”包括:记录所述第一API信息中的函数名称、上下文以及输入参数;判断所述第一API信息中具有数据指针时复制指针所指向的数据;获取并执行所述第一API以显示相应的图像;判断执行所述第一API完成后产生返回值时记录所述第一API执行完成后产生的返回值;以及判断所述第一API信息需要进行特殊处理时对所述第一API进行特殊处理;
需要进行特殊处理的API包括顶点属性数组API、绘制图元API、glBufferData以及glBufferSubData,所述“判断所述第一API信息需要进行特殊处理时对所述第一API进行特殊处理”包括:
调用未绑定顶点属性缓冲区的顶点属性数组API时将除了顶点属性数据之外的参数记录在glMsg中并添加到一个队列中;
调用glTexCoordPointer函数时在glMsg中增加一个参数记录当前绑定的纹理单元;
执行绘制图元API中的glDrawArrays和glDrawElements时,从队列中依次取出缓存的顶点属性数组API的glMsg,在原始的glMsg上将参与绘图的顶点属性数据记录下来以构成完整的glMsg,并在执行glDrawArrays或glDrawElements结束后清空队列;
执行glBufferData和glBufferSubData时在上下文中为每个索引缓冲区对象分配一块相同大小的备份索引缓冲区,以及在glBufferData/glBufferSubData更新数据到索引缓冲区的同时将数据更新到对应的备份索引缓冲区,使得备份索引缓冲区中的数据与索引缓冲区保持一致;
将记录的API信息生成相应的API数据包;
将一个或多个所述API数据包组合成一个帧数据包;
利用一压缩算法对所述帧数据包进行压缩以形成相应的压缩包,并添加相应的压缩协议信息至所述压缩包;
分析所述压缩包的协议信息以得到一个或多个原始帧数据包;
获取所述一个或多个原始的帧数据包,并依次根据每个数据包的压缩协议信息获得每帧中的API信息;以及
执行获取的所述API信息以显示相应的图像。
8.如权利要求7所述的图像显示方法,其特征在于,所述方法由运行于一主机装置中的图像显示系统执行。
9.如权利要求7所述的图像显示方法,其特征在于,所述方法由第一主机装置和第二主机装置共同运行的图像显示系统执行。
10.如权利要求7所述的图像显示方法,其特征在于,所述应用程序为OpenGL ES 1.x,所述“记录所述第一API信息中的函数名称、上下文以及输入参数”包括:
用连续的正整数表示记录的API名称,且每个API与一个数字对应;
用正整数标识上下文,且每个上下文与一个数字对应;以及
根据所述OpenGL ES 1.x标准中的API原型依次记录API的输入参数。
11.如权利要求7所述的图像显示方法,其特征在于,所述“将一个或多个所述API数据包组合成一个帧数据包”包括:
将一帧中的所有API数据包组合成一个帧数据包;以及
判断当前的帧数据包的大小是否超过一个阈值,若确定当前帧数据包的大小超过所述阈值时则无论这一帧是否结束,都将当前的帧数据包发送,并将所述帧剩余的API数据包再组成一个或多个新的帧数据包。
12.如权利要求7所述的图像显示方法,其特征在于,所述压缩算法包括通用压缩算法和差量压缩算法,当前API数据包和上一个API数据包相似程度较高时使用差量压缩算法对当前API数据包进行压缩,当前API数据包和上一个API数据包的相关性较弱时使用通用压缩算法对当前API数据包进行压缩。
13.如权利要求12所述的图像显示方法,其特征在于,所述压缩协议信息包括压缩后数据包的校验值、压缩类型、压缩前的数据量以及压缩后的数据量。
CN201310533116.7A 2013-10-31 2013-10-31 图像显示系统及图像显示方法 Active CN103593184B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310533116.7A CN103593184B (zh) 2013-10-31 2013-10-31 图像显示系统及图像显示方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310533116.7A CN103593184B (zh) 2013-10-31 2013-10-31 图像显示系统及图像显示方法

Publications (2)

Publication Number Publication Date
CN103593184A CN103593184A (zh) 2014-02-19
CN103593184B true CN103593184B (zh) 2016-08-17

Family

ID=50083344

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310533116.7A Active CN103593184B (zh) 2013-10-31 2013-10-31 图像显示系统及图像显示方法

Country Status (1)

Country Link
CN (1) CN103593184B (zh)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104156191A (zh) * 2014-08-22 2014-11-19 沈炜 将移动电子设备扩展为pc机显示器的系统及方法
CN106844479B (zh) * 2016-12-23 2020-07-07 光锐恒宇(北京)科技有限公司 文件的压缩、解压方法及装置
CN106873932B (zh) * 2017-02-17 2020-03-03 浙江大学 一种Android系统服务端、远程桌面图像重定向方法及系统
CN112068908B (zh) 2017-10-23 2024-01-30 华为技术有限公司 图形处理方法及相关装置和设备
CN112567751A (zh) * 2018-09-26 2021-03-26 华为技术有限公司 一种3d图形数据压缩和解压缩的方法及装置
CN109603152A (zh) * 2018-12-14 2019-04-12 北京智明星通科技股份有限公司 一种游戏场景图像处理方法、装置及终端
CN116893816B (zh) * 2023-09-08 2024-01-23 北京趋动智能科技有限公司 远程渲染方法、装置及存储介质
CN117472371A (zh) * 2023-10-09 2024-01-30 北京趋动智能科技有限公司 远程渲染方法、装置及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101071380A (zh) * 2007-06-27 2007-11-14 中兴通讯股份有限公司 一种图形用户界面的截取和重现方法
CN101587456A (zh) * 2009-07-08 2009-11-25 腾讯科技(深圳)有限公司 一种对软件运行的保护处理方法及装置
CN102799432A (zh) * 2012-06-30 2012-11-28 邱东 一种基于记录绘图指令的游戏录像及回放方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9256514B2 (en) * 2009-02-19 2016-02-09 Nvidia Corporation Debugging and perfomance analysis of applications

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101071380A (zh) * 2007-06-27 2007-11-14 中兴通讯股份有限公司 一种图形用户界面的截取和重现方法
CN101587456A (zh) * 2009-07-08 2009-11-25 腾讯科技(深圳)有限公司 一种对软件运行的保护处理方法及装置
CN102799432A (zh) * 2012-06-30 2012-11-28 邱东 一种基于记录绘图指令的游戏录像及回放方法

Also Published As

Publication number Publication date
CN103593184A (zh) 2014-02-19

Similar Documents

Publication Publication Date Title
CN103593184B (zh) 图像显示系统及图像显示方法
US9426259B2 (en) Client server interaction for graphical/audio applications
US10339701B2 (en) Method, system and apparatus for generation and playback of virtual reality multimedia
US5801717A (en) Method and system in display device interface for managing surface memory
JP5960368B2 (ja) ビジビリティ情報を用いたグラフィックスデータのレンダリング
WO2018226621A1 (en) Methods and systems for an application system
CN101059760B (zh) Opengl到opengl│es翻译器和opengl│es仿真器
US20100289804A1 (en) System, mechanism, and apparatus for a customizable and extensible distributed rendering api
CN103677777B (zh) 调用应用程序组件的方法及装置
US8601184B2 (en) Updating image in buffer via difference data
US7583269B2 (en) Window system 2D graphics redirection using direct texture rendering
TWI232768B (en) Method and apparatus for pre-caching data in audio memory
CN105074779A (zh) 用于流送虚拟纹理的引擎
US6392665B1 (en) Capture mechanism for computer generated motion video images
CN110047119B (zh) 包含动态背景的动画生成方法、装置及电子设备
JP2003515766A (ja) ハンドヘルドlcd素子に高い色解像度を表示するための方法および装置
WO2023197762A1 (zh) 图像渲染方法、装置、电子设备、计算机可读存储介质及计算机程序产品
Moreland IceT users' guide and reference.
CN102880454B (zh) 医学三维模型的网页显示的方法及其系统
CN105164636B (zh) 一种虚拟化环境中的数据通信的方法、装置及处理器
TW201015483A (en) Partitioning-based performance analysis for graphics imaging
Ensom et al. Preserving virtual reality artworks
Yu et al. Animating TTS Messages in Android using OpenSource Tools
JP2012155731A (ja) 検索システム
WO2024093609A1 (zh) 一种叠加光遮挡的渲染方法、装置及相关产品

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information

Address after: 350000 Fuzhou Gulou District, Fujian, software Avenue, building 89, No. 18

Applicant after: FUZHOU ROCKCHIP ELECTRONICS CO., LTD.

Address before: 350000 Fuzhou Gulou District, Fujian, software Avenue, building 89, No. 18

Applicant before: Fuzhou Rockchip Semiconductor Co., Ltd.

COR Change of bibliographic data
C14 Grant of patent or utility model
GR01 Patent grant
CP01 Change in the name or title of a patent holder
CP01 Change in the name or title of a patent holder

Address after: 350000 building, No. 89, software Avenue, Gulou District, Fujian, Fuzhou 18, China

Patentee after: Ruixin Microelectronics Co., Ltd

Address before: 350000 building, No. 89, software Avenue, Gulou District, Fujian, Fuzhou 18, China

Patentee before: Fuzhou Rockchips Electronics Co.,Ltd.