用于智能操作系统的多区域图形绘制方法及装置
技术领域
本发明涉及图形绘制领域,更具体地,涉及一种用于智能操作系统的多区域图形绘制方法及装置。
背景技术
一般地,智能操作系统提供封装好的视图框架以实现图形绘制、变换、动画等功能。这种方式最明显的缺陷在于图形的渲染是运行于业务逻辑线程的,对于有频繁图形刷新需求的场景,会对业务逻辑线程造成压力,从而导致图形刷新的卡顿。另一方面,这种方式下,对于使用大量图片的场景,图片的加载将会消耗大量的应用层内存。但是对于单个应用来说,它分配的内存是很有限的,这种场景很容易造成应用的崩溃。
智能操作系统中通常实现Open GL(Open Graphics Library)作为对图形渲染的支持。这个图形库是直接操作显卡进行渲染的,一方面这个库是原生方式实现(C,C++),因此渲染时所占用的内存并不属于应用层内存,所以不会有内存分配的限制;另一方面,使用这个库进行的渲染是可以在独立的线程完成的。
发明人发现,目前封装Open GL的图形引擎的解决方案中,比如Cocos2d,只允许同时在一个进程内渲染一块区域,这极大的限制了使用场景。因此,有必要开发一种同时在屏幕的多块区域进行图形渲染的方法及装置。
公开于本发明背景技术部分的信息仅仅旨在加深对本发明的一般背景技术的理解,而不应当被视为承认或以任何形式暗示该信息构成已为本领域技术人员所公知的现有技术。
发明内容
本发明的目的是提供一种高性能的用于智能操作系统的多区域图形绘制方法及装置,以实现同时在屏幕的多块区域进行图形渲染。
根据本发明的一方面,提出了一种用于智能操作系统的多区域图形绘制方法。该方法可以包括以下步骤:将Java端创建的多个渲染线程与Native端创建的多个渲染引擎实例进行绑定;将Java端接收到的一个或多个图形渲染任务分别提交到不同的渲染线程中,并且将所述一个或多个图形渲染任务基于所对应的渲染线程提交到Native端;在Native端获取与所述一个或多个图形渲染任务所对应的渲染线程绑定的渲染引擎实例以进行图形渲染;以及将所述一个或多个图形渲染任务的渲染结果分别显示在与进行渲染的渲染引擎实例所对应的屏幕区域中。
优选地,通过将所述多个渲染引擎实例置入线程私有数据来进行与所述多个渲染线程的绑定。
优选地,Natvie端基于所述图形渲染任务对应的线程私有数据分别获取与所述渲染线程绑定的渲染引擎实例。
优选地,所述渲染引擎通过Open GL命令进行图形渲染。
优选地,所述方法进一步包括:在图形渲染任务完成之后,Native端将渲染状态回调至Java端。
根据本发明的另一方面,提出了一种用于智能操作系统的多区域图形绘制装置。该装置可以包括:用于将Java端创建的多个渲染线程与Native端创建的多个渲染引擎实例进行绑定的单元;用于将Java端接收到的一个或多个图形渲染任务分别提交到不同的渲染线程中,并且将所述一个或多个图形渲染任务基于所对应的渲染线程提交到Native端的单元;用于在Native端获取与所述一个或多个图形渲染任务所对应的渲染线程绑定的渲染引擎实例以进行图形渲染的单元;以及用于将所述一个或多个图形渲染任务的渲染结果分别显示在与进行渲染的渲染引擎实例所对应的屏幕区域中的单元。
优选地,通过将所述多个渲染引擎实例置入线程私有数据来进行与所述多个渲染线程的绑定。
优选地,Natvie端基于所述图形渲染任务对应的线程私有数据分别获取与所述渲染线程绑定的渲染引擎实例。
优选地,所述渲染引擎通过Open GL命令进行图形渲染。
优选地,所述装置进一步包括:用于在图形渲染任务完成之后,使Native端将渲染状态回调至Java端的单元。
本发明通过Native部分的单例设计模式和线程私有数据TSD,结合Java部分多线程的方式,实现在一个进程内同时管理多个Open GL上下文环境,从而达到可以同时在多个区域进行图形绘制的技术效果。具有线程独立、不限制内存和多区域同时渲染的优势。
本发明的方法具有其它的特性和优点,这些特性和优点从并入本文中的附图和随后的具体实施例中将是显而易见的,或者将在并入本文中的附图和随后的具体实施例中进行详细陈述,这些附图和具体实施例共同用于解释本发明的特定原理。
附图说明
通过结合附图对本发明示例性实施例进行更详细的描述,本发明的上述以及其它目的、特征和优势将变得更加明显,其中,在本发明示例性实施例中,相同的参考标号通常代表相同部件。
图1为根据本发明的一个实施例的用于智能操作系统的多区域绘图方法的流程图。
图2为包括两个图形绘制区域的屏幕,其中,左上图为p1,右下图为p2。
具体实施方式
下面将参照附图更详细地描述本发明。虽然附图中显示了本发明的优选实施例,然而应该理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
图1示出了根据本发明的一个实施例的用于智能操作系统的多区域图形绘制方法。
本实施例的智能操作系统环境为Android,支持Open GL。实现步骤大致上可以分为两个部分,分别Java部分和Native部分。其中,Java部分由Java语言程序实现,运行于Android虚拟机;Native部分通过C/C++语言实现,运行于本地服务器。
Open GL具有两个主要特点:
1、它是与硬件无关的软件接口,可以在不同的平台之间进行移植;
2、可以在客户机/服务器系统中工作,即具有网络功能。
本实施例的用于智能操作系统的多区域图形绘制方法可以包括以下步骤:
1)将Java端创建的多个渲染线程与Native端创建的多个渲染引擎实例进行绑定。
在Java端可以同时创建多个渲染线程,相应地,为Native端提供多个渲染线程环境,并生成多个上下文环境。即在Java端创建多个渲染视图实例。
渲染视图实质上是用于在Java端控制Native端的渲染的控制器。渲染视图类可以包括表面视图(GLSurfaceView)实例和纹理视图(GLTexureView)实例,它们为Native端提供渲染线程环境。
Java端通过Open GL库接口生成用于使用Open GL库渲染图形的上下文环境。
Open GL上下文环境,即GLContext,用于存储Open GL绘图的所有状态信息。它实际上代表了渲染命令绘图的默认帧缓存(framebuffer),GLContext被销毁,Open GL也不复存在。
创建多个线程,即生成多个用于Open GL的上下文环境,而一个线程只能拥有一个上下文,与此对应,一个上下文环境只能属于一个线程,不能被不同线程同时共享。
在Java端创建的多个渲染线程是独立于主线程之外的线程,这是为了保证渲染性能不受业务逻辑线程的影响。
在Native端,基于Java端所创建的多个渲染线程环境创建渲染引擎实例。同时,通过所述渲染引擎实例初始化Open GL渲染环境。
初始化Open GL渲染环境主要是设置Open GL窗口的重要属性,包括像素格式和缓冲模式,颜色位数以及深度位数等等。
Open GL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时候也加上表示透明度的Alpha值。颜色索引模式下每个像素的颜色是用颜色索引表中的某个颜色索引值表示。
Open GL可以提供双缓存来绘制图像。即在显示前台缓存中的图像同时,后台缓存绘制第2幅图像。当后台绘制完成后,后台缓存中的图像就显示出来。此时原来的前台缓存开始绘制第3幅图像,如此循环往复,以增加图像的输出速度。
由Native端所创建的每一个渲染引擎实例对应于屏幕的一块区域。
渲染引擎实例实际上完成所有的图形渲染工作,即完成Open GL渲染环境初始化、纹理生成、坐标变化、色彩设置、图形渲染等。
所述渲染引擎实例通过Open GL库接口初始化Open GL渲染环境。
将Java端创建的多个渲染线程与Native端创建的多个渲染引擎实例进行绑定。在一个示例性实施方式中,通过将所述多个渲染引擎实例置入线程私有数据(TSD)来进行与所述多个渲染线程的绑定。
众所周知,在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。一个全局变量,所有线程都可以使用它,改变它的值,因此其中一个线程对全局变量的修改将影响到另一个线程的访问。因而在应用程序设计中有必要提供线程私有的全局变量,其使用同名而不同变量地址的线程相关数据结构。表面看起来其为全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。这样的数据结构被称为线程私有数据。
在分配线程私有数据之前,需要创建与线程私有数据相关联的键(key),并且设置线程私有数据的key值。虽然线程私有数据TSD的key在多个线程之间是共享的,然而对于每个线程该key值可以是不同的。
在Native端,渲染引擎对外是单例模式的,但在进行多区域图形绘制时,实际上需要它是多例的。在本实例中通过单例模式结合线程私有数据技术来实现基于线程的多例模式,即线程不同,通过单例模式取到的实例也不同,即取到的实例与线程是对应的。
具体地,在Java端可以创建多个渲染线程,多个线程之间可以共享线程私有数据TSD的key,也就是说,线程私有数据的访问权在多个渲染线程间共享。在Native端,在每个渲染线程所提供的渲染线程环境中分别新建了渲染引擎实例,将每个渲染引擎实例置入与它相关的渲染线程的TSD中。也就是说,在每个渲染线程中的线程私有数据的key值表示其相关联的渲染引擎。通过这种方式实现了渲染线程与渲染引擎的绑定,渲染实例的管理通过与之绑定的渲染线程完成,而渲染实例也只对与之绑定的线程可见。
这种方式的优点是使得Native端可以按照单例的设计模式进行设计,省去了对多个实例的管理。传统的单例设计即当前类对外只有一个实例,一般来说对外只通过一个接口提供该实例。而通过引入TSD技术,虽然仍使用单例的设计模式,即对外也只提供一个接口获取实例,但对于同一个线程获取到的实例总是相同的,对于不同的线程获取到的是不同的实例。即该线程内,任何一个地方,都通过同一个的接口获取到相同的实例。在这种方式下,同一个线程内,省去了对多个实例的管理。
2)将Java端接收到的一个或多个图形渲染任务分别提交到不同的渲染线程中,并且将所述一个或多个图形渲染任务基于所对应的渲染线程提交到Native端。
当Java端接收到多个图形渲染任务时,将不同的图形渲染任务提交到不同的渲染线程中,并且基于各自的渲染线程被提交到Native端。
3)在Native端获取与所述一个或多个图形渲染任务所对应的渲染线程绑定的渲染引擎实例以进行图形渲染。
Natvie端基于所述图形渲染任务对应的线程私有数据分别获取与所述渲染线程绑定的渲染引擎实例,进行图形渲染。
渲染引擎实例通过Open GL命令进行图形渲染。
图形渲染通常包括以下几个阶段:
a)指定几何对象,例如点、线、三角形等一些几何单元。
b)顶点处理操作。这个阶段所接收到的数据是每个顶点的属性特征,输出的则是变换后的顶点数据。
c)图元组装。在顶点处理之后,顶点的全部属性都已经被确定,在这个阶段顶点会根据图元规则被组装成图元。
d)图元处理,主要是裁剪和消陷。
e)栅格化操作。由图元处理阶段传递过来的图元数据在该阶段将会被分解成更小的单元并对应帧缓冲区的各个像素,这些单元被称之为片元。一个片元可能包含窗口左边、深度、颜色、纹理坐标等属性。
f)片元处理。包括上纹理理,即通过纹理坐标取得纹理内存中相对应的颜色;雾化,通过片元距离对当前视点位置修改颜色;颜色汇总:将纹理、主定义的颜色、雾化的颜色、次颜色的光照阶段计算的颜色汇总到一起。
g)逐个片元的操作。包括像素所有权、剪切、Alpha测试、模版测试、深度测试、混合等,这些操作最终会影响其在帧缓冲区的颜色值。
h)帧缓冲操作。在图形渲染完成之后,渲染引擎通过Open GL接口将渲染结果交换到显示缓冲区,完成显示。由于每一个渲染引擎实例对应于屏幕的一块区域,因此渲染的结果将直接显示到对应的屏幕区域。
4)将所述一个或多个图形渲染任务的渲染结果分别显示在与进行渲染的渲染引擎实例所对应的屏幕区域中。
由于不同的渲染引擎实例对应于屏幕的不同区域,因此由不同渲染引擎实例执行的图形渲染任务的渲染结果可以同时在屏幕的不同区域中进行显示。由此实现了智能操作系统的多区域的图形绘制。
在示例性实施例中,该用于智能操作系统的多区域图形绘制方法可以进一步包括:在图形渲染任务完成之后,Native端将渲染状态回调至Java端。
当Native端的渲染引擎结束渲染,渲染引擎会将渲染状态返回Java端的渲染视图。即通知Java端渲染已完成或者渲染失败。
本实施例的用于智能操作系统的多区域图形绘制方法的优点在于:
(1)图形渲染任务由Native端的渲染引擎实例执行,因此不受内存的限制。
(2)渲染线程独立于主线程,不受业务逻辑线程影响;
(3)可以同时在屏幕的多个区域同时渲染;
(4)通过渲染引擎的单例模式+线程私有数据技术实现基于线程的多例模式。
根据本发明的另一实施例,提供了一种用于智能操作系统的多区域图形绘制装置。该装置可以包括:用于将Java端创建的多个渲染线程与Native端创建的多个渲染引擎实例进行绑定的单元;用于将Java端接收到的一个或多个图形渲染任务分别提交到不同的渲染线程中,并且将所述一个或多个图形渲染任务基于所对应的渲染线程提交到Native端的单元;用于在Native端获取与所述一个或多个图形渲染任务所对应的渲染线程绑定的渲染引擎实例以进行图形渲染的单元;以及用于将所述一个或多个图形渲染任务的渲染结果分别显示在与进行渲染的渲染引擎实例所对应的屏幕区域中的单元。
在示例性实施方式中,通过将所述多个渲染引擎实例置入线程私有数据来进行与所述多个渲染线程的绑定。
在示例性实施方式中,Natvie端基于所述图形渲染任务对应的线程私有数据分别获取与所述渲染线程绑定的渲染引擎实例。
在示例性实施方式中,所述渲染引擎通过Open GL命令进行图形渲染。
在示例性实施方式中,所述装置进一步包括:用于在图形渲染任务完成之后,使Native端将渲染状态回调至Java端的单元。
本实施例通过Native部分的单例设计模式和线程私有数据TSD,结合Java部分多线程的方式,实现在一个进程内同时管理多个Open GL上下文环境,从而达到可以同时在多个区域进行图形绘制的技术效果。具有线程独立、不限制内存和多区域同时渲染的优势。
应用示例
为便于理解本发明实施例的方案及其效果,以下给出一个具体应用示例。本领域技术人员应理解,该示例仅为了便于理解本发明,其任何具体细节并非意在以任何方式限制本发明。
以下示例通过本发明的用于智能操作系统的多区域图形绘制方法及装置在屏幕中的两个区域分别绘制两张图形,左上图为p1,右下图为p2。在该示例中,智能操作系统环境为Android,支持Open GL 2.0。
具体步骤如下:
1)在Java端创建第一渲染线程和第二渲染进程。
具体地,在Java端创建第一渲染线程和第二渲染进程,分别为Native端提供渲染线程环境,并生成两个Open GL上下文环境。
2)在Native端,分别在两个渲染线程提供的渲染环境中创建第一渲染引擎实例和第二渲染引擎实例。
3)将第一渲染引擎实例和第二渲染引擎实例分别置入第一渲染线程和第二渲染线程的TSD中,以将第一渲染引擎实例与第一渲染线程进行绑定,并且将第二渲染实例与第二渲染线程进行绑定。
4)基于第一渲染线程向与它绑定的Native端的第一渲染引擎提交p1的渲染任务,该任务指向p1的路径;基于第二渲染线程向与它绑定的Native端的第二渲染引擎提交p2的渲染任务,该任务指向p2的路径。
5)第一渲染引擎和第二渲染引擎分别得到渲染任务,需要渲染的类型皆为图片,随之第一渲染引擎和第二渲染引擎调用Open GL接口将p1和p2作为纹理加载到内存,并通过Open GL接口将该内存缓存交换到显示缓冲区,完成在第一渲染引擎和第二渲染引擎各自对应的屏幕区域的显示。
由于通过多线程实现,因此p1和p2的显示是同时的。
本领域技术人员应理解,上面对本发明的实施例的描述的目的仅为了示例性地说明本发明的实施例的有益效果,并不意在将本发明的实施例限制于所给出的任何示例。
本发明可以是装置、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。
这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。