图形处理的方法及装置
技术领域
本发明涉及互联网技术领域,特别是涉及一种图形处理的方法及装置。
背景技术
OpenGL ES(Open Graphics Library for Embedded Systems,嵌入式系统开放图形库)是一个针对手机、PAD(Personal Digital Assistant,掌上电脑)、游戏主机等嵌入式设备而设计的图形应用程序接口。随着互联网技术的发展,OpenGL ES逐渐由固定渲染管线发展为可编程渲染管线,即从对顶点、片元进行固定处理的方式发展为对顶点、片元进行可编程处理的方式,从而提高了图形处理的灵活性。
在实际应用中,虽然基于可编程渲染管线的显卡逐渐代替基于固定渲染管线的显卡广泛应用于设备中,但是仍然存在一些热门应用程序采用固定渲染管线的方式进行图形处理。因此,将这些采用固定渲染管线进行图形处理的应用程序在基于可编程渲染管线的设备上运行时,会存在不兼容问题。
为解决不兼容问题,现有的处理方式为:应用程序(即OpenGL ES客户端,以下简称客户端)每次向OpenGL ES服务器(以下简称服务器)发送glDraw*命令时,会将当前的客户端状态和服务器状态发送给服务器,其中,该客户端及服务器为固化在设备中的计算机程序。服务器接收到glDraw*命令后,先根据当前的客户端状态和服务器状态生成一颗AST(Abstract Syntax Tree,抽象语法树)树,然后根据该AST树生成对应的顶点程序和片元程序,并对生成的顶点程序和片元程序进行编译,最后将编译获得的程序对象发送给显卡,以便显卡基于可编程渲染管线对客户端中的对应图形进行渲染。由此可知,上述方案通过根据客户端状态和服务器状态生成AST树,并基于该AST树生成并编译程序,获得了可编程渲染管线所需的顶点程序和片元程序,从而解决了固定渲染管线与可编程渲染管线的不兼容问题。
然而,通过AST树生成并编译程序的耗时一般较长,通常会超过10ms,由此导致图形渲染的效率大大降低。
发明内容
有鉴于此,本发明提供一种图形处理的方法及装置,能够解决以下问题:在基于可编程渲染管线的设备上运行经固定渲染管线渲染后的应用程序时,由于每次渲染均需要生成AST树,并通过AST树生成并编译程序,才可获得可编程渲染管线所需的顶点程序和片元程序,所以整个过程耗时较长,从而导致图形渲染的效率大大降低。
依据本发明一个方面,提供了一种图形处理的方法,所述方法包括:
在接收到渲染命令后,获取所述渲染命令中携带的状态数据,所述状态数据用于描述待渲染图形的不同渲染属性所对应的启用状态;
根据所述状态数据遍历预设的决策树,其中,从所述决策树的第二层节点起,每层节点代表一种渲染属性是否启用的两种状态;
当遍历到叶子节点时,从所述叶子节点中获取对应的程序对象,所述程序对象为符合遍历路径所限定的状态组合条件的程序,且所述程序对象包括已编译的顶点程序和已编译的片元程序;
将所述程序对象发送给显卡,以便所述显卡基于可编程渲染管线处理所述程序对象,实现图形渲染。
依据本发明另一个方面,提供了一种图形处理的装置,所述装置包括:
获取单元,用于在接收到渲染命令后,获取所述渲染命令中携带的状态数据,所述状态数据用于描述待渲染图形的不同渲染属性所对应的启用状态;
遍历单元,用于根据所述获取单元获取的所述状态数据遍历预设的决策树,其中,从所述决策树的第二层节点起,每层节点代表一种渲染属性是否启用的两种状态;
所述获取单元,还用于当所述遍历单元遍历到叶子节点时,从所述叶子节点中获取对应的程序对象,所述程序对象为符合遍历路径所限定的状态组合条件的程序,且所述程序对象包括已编译的顶点程序和已编译的片元程序;
发送单元,用于将所述获取单元获取的所述程序对象发送给显卡,以便所述显卡基于可编程渲染管线处理所述程序对象,实现图形渲染。
借由上述技术方案,本发明提供的图形处理的方法及装置,能够在接收到客户端发送的渲染命令后,服务器先获取渲染命令中携带的状态数据,然后根据该状态数据遍历预设的决策树,并在经过与状态数据匹配的遍历路径后,获得叶子节点,最后从该叶子节点中获取对应的程序对象(即已编译的顶点程序和已编译的片元程序),并将该程序对象发送给显卡,以便显卡基于可编程渲染管线处理该程序对象,实现图形渲染。由此可知,本发明在每次渲染时,服务器仅需通过渲染命令中的状态数据对预设的决策树进行遍历,并从遍历到的叶子节点中直接获取可编程渲染管线所需的程序对象即可,而无需每次都花费大量时间生成AST树,以及基于AST树生成并编译程序,从而提高了图形渲染的效率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种图形处理的方法的流程图;
图2示出了本发明实施例提供的一种决策树的结构示意图;
图3示出了本发明实施例提供的另一种图形处理的方法的流程图;
图4示出了本发明实施例提供的一种图形处理的装置的组成框图;
图5示出了本发明实施例提供的另一种图形处理的装置的组成框图;
图6示出了本发明实施例提供的再一种图形处理的装置的组成框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
为解决现有技术中在基于可编程渲染管线的设备上运行经固定渲染管线渲染后的应用程序时,图形渲染效率较低的问题,本发明实施例提供了一种图形处理的方法,该方法主要应用于OpenGL ES服务器侧,如图1所示,该方法主要包括:
101、在接收到渲染命令后,获取渲染命令中携带的状态数据。
其中,状态数据用于描述待渲染图形的不同渲染属性所对应的启用状态。在用户启动基于固定渲染管线渲染的应用程序(即OpenGL ES客户端)后,当需要对OpenGL ES客户端中的某图形进行渲染显示时,OpenGL ES客户端会从基于固定渲染管线渲染的数据中获取与该图形对应的状态数据,然后将携带该状态数据的渲染命令发送给OpenGL ES服务器,以便OpenGL ES服务器根据该状态数据获取可编程渲染管线所需的已编译的顶点程序和已编译的片元程序。其中,渲染命令主要包括glDraw*命令,渲染属性包括光线、变形、纹理以及雾等。
102、根据状态数据遍历预设的决策树。
其中,预设的决策树由至少一种渲染属性的不同启用状态构成,且决策树具有以下特征:从决策树的第二层节点起,每层节点代表一种渲染属性是否启用的两种状态。例如,图2为一颗决策树,其中,第二层节点代表的渲染属性为光线,且包含启用光线处理以及未启用光线处理这两种启用状态,第三层节点代表的渲染属性为纹理,且包含启用纹理处理以及未有启用纹理处理这两种启用状态。
需要说明的是,决策树中可能仅包含状态数据中涉及的渲染属性,也可能既包含状态数据中涉及的渲染属性,又包含其他渲染属性。当遍历决策树的过程中,遇到与状态数据中各个渲染属性均不相同的渲染属性时,直接选择启用状态为未启用的节点即可。
此外,在OpenGL ES服务器遍历决策树时,可以从决策树的根节点开始遍历,依次查找与状态数据中对应渲染属性匹配的子节点,直至获得叶子节点。
103、当遍历到叶子节点时,从叶子节点中获取对应的程序对象。
其中,程序对象为符合遍历路径所限定的状态组合条件的程序,且程序对象包括已编译的顶点程序和已编译的片元程序。其中,从根节点开始,遍历的与状态数据中各个渲染属性依次匹配的节点所构成的路径为遍历路径。由于决策树的各个叶子节点中均存储有对应的程序对象,所以当根据状态数据遍历到某叶子节点时,可以从该叶子节点中直接获取存储的程序对象。
104、将程序对象发送给显卡,以便显卡基于可编程渲染管线处理程序对象,实现图形渲染。
当OpenGL ES服务器从遍历到的叶子节点中获取符合遍历路径所限定的状态组合条件的程序对象后,可以将该程序对象发送给显卡,以便显卡基于可编程渲染管线执行该程序对象中的已编译的顶点程序和已编译的片元程序,从而实现图形渲染操作,进而在OpenGL ES客户端的界面上显示对应的渲染效果。
需要说明的是,本发明实施例的应用场景可以为“在Windows操作系统中的Android模拟器上运行基于固定渲染管线渲染的应用程序”,也可以为“在Windows操作系统中的iphone模拟器上运行基于固定渲染管线渲染的应用程序”,也可以为其他应用场景,在此不做限定。
本发明实施例提供的图形处理的方法,能够在接收到客户端发送的渲染命令后,服务器先获取渲染命令中携带的状态数据,然后根据该状态数据遍历预设的决策树,并在经过与状态数据匹配的遍历路径后,获得叶子节点,最后从该叶子节点中获取对应的程序对象(即已编译的顶点程序和已编译的片元程序),并将该程序对象发送给显卡,以便显卡基于可编程渲染管线处理该程序对象,实现图形渲染。由此可知,本发明在每次渲染时,服务器仅需通过渲染命令中的状态数据对预设的决策树进行遍历,并从遍历到的叶子节点中直接获取可编程渲染管线所需的程序对象即可,而无需每次都花费大量时间生成AST树,以及基于AST树生成并编译程序,从而提高了图形渲染的效率。
进一步的,根据上述方法实施例,本发明的另一个实施例还提供了一种图形处理的方法,如图3所示,该方法主要包括:
201、在接收到渲染命令后,获取渲染命令中携带的状态数据。
本步骤的具体实现方式与上述步骤101相同,在此不再赘述。
202、根据状态数据遍历预设的决策树。
具体的,遍历决策树的具体实现方式可以为:确定当前节点层对应的渲染属性;从状态数据中查找渲染属性的启用状态;当遍历到启用状态对应的节点时,重复上述步骤,继续对下一级节点层进行遍历,直至遍历到叶子节点为止。
示例性的,若状态数据中包括两种渲染属性的启用状态,即启用光线处理以及未启用纹理处理,且决策树如图2所示,则OpenGL ES服务器根据状态数据遍历决策树的具体实现方式可以为:从根节点开始遍历,首先,确定第二级节点层对应的渲染属性为光线,从状态数据中查找光线的启用状态为启用光线处理,由此从第二级节点层中选择出启用状态为启用光线处理的节点;其次,确定第三级节点层对应的渲染属性为纹理,从状态数据中查找纹理的启用状态为未启用纹理处理,然后从第二级节点层中选择出的节点的子节点中选择启用状态为未启用纹理处理的节点;最后,由于从第三级节点层中选择出的节点为叶子节点,所以遍历结束。此外,该示例的遍历路径为根节点→状态为启用光线处理的节点→状态为未启用纹理处理的节点。
203、当遍历到叶子节点时,从叶子节点中获取对应的程序对象。
本步骤的具体实现方式与上述步骤103相同,在此不再赘述。
204、当遍历到的叶子节点为空时,获取叶子节点对应的程序源码。
其中,程序源码包括未编译的顶点程序和未编译的片元程序。
在实际应用中,获取叶子节点对应的程序源码的具体实现方式可以有多种,下面以以下两种方式为例进行介绍:
方式一:根据遍历路径所限定的状态组合条件生成程序源码。
其中,当OpenGL ES服务器遍历完决策树后,可获得与状态数据匹配遍历路径所限定的状态组合条件,并基于mesa等技术生成程序源码。在实际应用中,根据遍历路径所限定的状态组合条件生成程序源码的具体实现方式可以为根据遍历路径所限定的状态组合条件先生成AST树,然后通过AST树生成程序源码,也可以为其他方式,在此不做限定。
方式二:获取叶子节点对应的预编写的程序源码。
由于程序源码是关于各种渲染属性的启用状态的程序,所以程序员可以针对各种状态组合条件,预编写对应的程序源码,并保存至预设存储空间。当OpenGL ES服务器遍历到某叶子节点时,可直接从预设存储空间中查找与该叶子节点对应的程序源码,并对查找到的程序源码进行编译,获得程序对象。
此外,OpenGL ES服务器还可以通过上述两种方式结合的方式获取程序源码。具体的,OpenGL ES服务器可以先查找叶子节点对应的预编写的程序源码;若查找到叶子节点对应的预编写的程序源码,则直接获取查找到的程序源码;若未查找到叶子节点对应的预编写的程序源码,则可以根据遍历路径所限定的状态组合条件生成程序源码。
205、对程序源码进行编译获得程序对象。
进一步的,由于编译源码需要花费大量时间,所以为便于后续再次渲染该图形时,提高渲染效率,OpenGL ES服务器可以在对程序源码进行编译获得程序对象之后,将程序对象保存在遍历路径对应的叶子节点中。
206、将程序对象发送给显卡,以便显卡基于可编程渲染管线处理程序对象,实现图形渲染。
本步骤的具体实现方式与上述实施例中的步骤104相同,在此不再赘述。
通过对本实施例的详细介绍可知,在OpenGL ES服务器启动后,可以先构建叶子节点为空的初始决策树;当OpenGL ES服务器首次对某图形进行渲染时,会首次遍历到对应的叶子节点,此时可以先获取该叶子节点对应的程序源码,然后对该程序源码进行编译获得程序对象,并将获得程序对象保存至该叶子节点中;当OpenGL ES服务器再次对该图形进行渲染时,会再次遍历到该叶子节点,此时可以直接从该叶子节点中获取可编程渲染管线所需的程序对象,而无需对程序源码进行编译,从而提高了图形渲染的效率。
进一步的,依据上述方法实施例,本发明的另一个实施例还提供了一种图形处理的装置,如图4所示,该装置主要包括:获取单元31、遍历单元32和发送单元33。其中,
获取单元31,用于在接收到渲染命令后,获取渲染命令中携带的状态数据,状态数据用于描述待渲染图形的不同渲染属性所对应的启用状态;
其中,渲染命令主要包括glDraw*命令,渲染属性包括光线、变形、纹理以及雾等。
遍历单元32,用于根据获取单元31获取的状态数据遍历预设的决策树,其中,从决策树的第二层节点起,每层节点代表一种渲染属性是否启用的两种状态;
需要说明的是,决策树中可能仅包含状态数据中涉及的渲染属性,也可能既包含状态数据中涉及的渲染属性,又包含其他渲染属性。
获取单元31,还用于当遍历单元32遍历到叶子节点时,从叶子节点中获取对应的程序对象,程序对象为符合遍历路径所限定的状态组合条件的程序,且程序对象包括已编译的顶点程序和已编译的片元程序;
发送单元33,用于将获取单元31获取的程序对象发送给显卡,以便显卡基于可编程渲染管线处理程序对象,实现图形渲染。
本发明实施例提供的图形处理的装置,能够在接收到客户端发送的渲染命令后,服务器先获取渲染命令中携带的状态数据,然后根据该状态数据遍历预设的决策树,并在经过与状态数据匹配的遍历路径后,获得叶子节点,最后从该叶子节点中获取对应的程序对象(即已编译的顶点程序和已编译的片元程序),并将该程序对象发送给显卡,以便显卡基于可编程渲染管线处理该程序对象,实现图形渲染。由此可知,本发明在每次渲染时,服务器仅需通过渲染命令中的状态数据对预设的决策树进行遍历,并从遍历到的叶子节点中直接获取可编程渲染管线所需的程序对象即可,而无需每次都花费大量时间生成AST树,以及基于AST树生成并编译程序,从而提高了图形渲染的效率。
进一步的,获取单元31,还用当遍历单元32遍历到的叶子节点为空时,获取叶子节点对应的程序源码,程序源码包括未编译的顶点程序和未编译的片元程序;
如图5所示,该装置进一步包括:
编译单元34,用于对获取单元31获取的程序源码进行编译获得程序对象。
进一步的,如图5所示,该装置进一步包括:
保存单元35,用于在编译单元34对程序源码进行编译获得程序对象之后,将程序对象保存在遍历路径对应的叶子节点中。
进一步的,如图5所示,获取单元31包括:
生成模块311,用于根据遍历路径所限定的状态组合条件生成程序源码;
获取模块312,用于获取叶子节点对应的预编写的程序源码。
进一步的,如图5所示,该装置进一步包括:
构建单元36,用于在服务器启动后,构建叶子节点为空的初始决策树。
进一步的,如图5所示,遍历单元32包括:
确定模块321,用于确定当前节点层对应的渲染属性;
查找模块322,用于从状态数据中查找渲染属性的启用状态;
遍历模块323,用于当遍历到启用状态对应的节点时,重复上述步骤,继续对下一级节点层进行遍历,直至遍历到叶子节点为止。
进一步的,作为对上述方法的实现,本发明的另一个实施例还提供了一种图形处理的装置,如图6所示,该装置包括:收发器61、处理器62、显卡63、存储器64以及总线65;其中,
收发器61,被配置为接收渲染指令;
处理器62,被配置为:
获取渲染命令中携带的状态数据,状态数据用于描述待渲染图形的不同渲染属性所对应的启用状态;
根据状态数据遍历预设的决策树,其中,从决策树的第二层节点起,每层节点代表一种渲染属性是否启用的两种状态;
当遍历单元遍历到叶子节点时,从叶子节点中获取对应的程序对象,程序对象为符合遍历路径所限定的状态组合条件的程序,且程序对象包括已编译的顶点程序和已编译的片元程序;
收发器61还被配置为将程序对象发送给显卡63;
显卡63,被配置为基于可编程渲染管线处理程序对象,实现图形渲染;
存储器64,被配置为存储处理器62的可执行指令;
总线65,被配置为耦接收发器61、处理器62、显卡63及存储器64。
进一步的,处理器62还被配置为:
当遍历单元遍历到的叶子节点为空时,获取叶子节点对应的程序源码,程序源码包括未编译的顶点程序和未编译的片元程序;
对程序源码进行编译获得程序对象。
进一步的,存储器64还被配置为:
在对程序源码进行编译获得程序对象之后,将程序对象保存在遍历路径对应的叶子节点中。
进一步的,处理器62还被配置为:
根据遍历路径所限定的状态组合条件生成程序源码;
获取叶子节点对应的预编写的程序源码。
进一步的,处理器62还被配置为:
在服务器启动后,构建叶子节点为空的初始决策树。
进一步的,处理器62还被配置为:
确定当前节点层对应的渲染属性;
从状态数据中查找渲染属性的启用状态;
当遍历到启用状态对应的节点时,重复上述步骤,继续对下一级节点层进行遍历,直至遍历到叶子节点为止。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的发明名称(如确定网站内链接等级的装置)中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。