一种图像渲染方法及装置的制造方法_2

文档序号:9668097阅读:来源:国知局
一份位图数据。
[0044]也就是说,在本发明实施例中的能被应用程序和所述GPU访问的内存空间,能同时被CPU和GPU访问,CPU将待渲染的图像解码为位图图像后存入该内存空间,而不再是存入CPU分配的用户空间,因此扩大了该部分位图图像被访问或被读取的范围。
[0045]103:所述GPU对所述位图图像进行渲染。
[0046]具体的,在该应用程序和GPU均能访问的内存空间读取得到待渲染的图像的标识对应的位图图像之后,即可实现对该位图图像的渲染操作,并输出至显示器显示该渲染效果Ο
[0047]在本发明实施例中,GPU可在接收到渲染图像的指令时,根据该指令携带的待渲染图像的标识从预置的应用程序及GPU均能访问的内存空间中读取该标识对应的位图图像,并对读取的该位图图像进行渲染处理。本发明实施例的所述图像渲染方法仅需要在应用程序及GPU均能访问的内存空间,而无需再保存两份数据,也无需再将位图图像拷贝至GPU分配的内存中,从而节省了内存空间,并提升了图形渲染效率,避免了因内存分配的频繁触发而导致进程频繁卡顿的问题。
[0048]进一步的,请参阅图2,图2是本发明实施例提供的另一种图像渲染方法的流程示意图,具体的,如图2所示,本发明实施例的所述图像渲染方法可以包括以下步骤:
[0049]201:创建能被应用程序和图形处理器GPU访问的内存空间。
[0050]其中,所述能被应用程序和所述GPU访问的内存空间可以为图形内存管理设备Ι0Ν创建的内核空间,即内存共享缓冲区GraphicBuffer,该内存空间既可能是用户空间,也可能是内核空间,当然除了由Ι0Ν创建,也可以是由其它部件创建。其中,Ι0Ν是由安卓android引入的用于内存管理的模块,该Ι0Ν模块是可扩展的(API (Applicat1nProgramming Interface,应用程序编程接口)都是统一的),其支持各种形式的内存分配方式(支持包括连续与不连续内存的分配),Ι0Ν给内核(Kernel)及用户空间(Userspace)进程processes提供了相应的APIs。
[0051]需要说明的是,Ι0Ν是指专门为图形分配内存的内核Kernel驱动,Ι0Ν申请的内存属于内核空间。具体的,通过对内存共享缓冲区GraphicBuffer设置lock(即锁定)或unlock(即未锁定),使得终端中的应用程序可以通过该lock和unlock很方便的访问存储在该内存共享缓冲区GraphicBuffer中的数据,同时GPU也同样可以访问存储在该内存共享缓冲区GraphicBuffer中的数据,在读写GraphicBuffer时对GraphicBuffer进行lock,读写完成后对GraphicBuffer进行unlock,具体的,应用程序在所述内存空间处于lock状态时能访问所述内存空间,以及在所述内存空间处于unlock状态时不能访问所述内存空间。GPU可以直接使用该内存共享缓冲区GraphicBuffer的内存数据作为纹理,用户空间也可以直接读写该内存共享缓冲区GraphicBuffer这块内存。
[0052]可选的,利用位图内存分配器Allocator去申请内存存储像素,这个内存是通过Ι0Ν申请的内存,在Android中也称为GraphicBuffer,并把这个GraphicBuffer交给位图像素管理器SkPixelRef管理。SkBitmap是2D向量图形处理函数库Skia中一个位图类,其封装了与位图相关的一系列操作动作,从而能够通过SkBitmap实现对Skia中的blitter 的硬件加速。Allocator 是 SkBitmap 类的内嵌类,Allocator 类与 SkPixelRef 类关系密切,Allocator类提供类型化的内存分配、对象的分配和对象的撤销,Allocator分配的内存由SkPixelRef来处理引用计数,每个Allocator对应一个SkPixelRef,通常在分配内存成功后,由Allocator调用SkPixelRef来进行绑定,默认的情况下SkBitmap使用SkMallocPixelRef ( 一种 SkPixelRef 类)和 HeapAllocator( 一种 Allocator 类)进行配对绑定。所以如果利用的其他派生Allocator类对内存进行分配,通常也需要派生一个SkPixelRef类与派生Allocator类对应来进行绑定。
[0053]进一步的,为了防止内存出错,终端利用SkBitmap的SkPixelRef类对内存进行分配时,或者,在分配内存成功后Allocator调用SkPixelRef来进行绑定过程中,可直接复制(或者称为“拷贝”)整个对象,而不是使用指针的形式指向性地复制。该复制是指不会引起效能问题的轻量级的复制,由于在进行内存分配、绑定时都有一些内置的逻辑,尤其是使用了参考计数器时,可以避免多重复制,同样还增加了锁机制。此外,该位图图像数据占用的内存空间可以由外部决定,或者,该位图图像数据占用的内核空间的大小可以由系统分配得到。
[0054]202:CPU在所述能被应用程序和所述GPU访问的内存空间中存储位图图像。
[0055]进一步的,在Ι0Ν创建内核空间即内存共享缓冲区GraphicBuffer之后,即可通过该内存共享缓冲区GraphicBuffer来存储位图(Bitmap)数据。具体的,可将存储于内存共享缓冲区GraphicBuffer中的位图数据封装为共享数据进行存储,以便应用程序和GPU对所述位图数据的访问。而由于该内存共享缓冲区GraphicBuffer能够被应用程序和GPU访问,因此仅需在该内存共享缓冲区GraphicBuffer保存一份位图数据即可完成图像渲染操作,而无需再通过Java虚拟机和GPU自己分配的内存保双份数据。其中,共享数据是一种由开放的图形库OpenGL(OpenGraphicsLibrary),或矢量图像算法标准0penVG(0pen VectorGraphics)等创建的共享资源类型,用于指示共享2D图像数据,应用程序和相关的客户接口可以基于任意目的创建任意类型的共享数据。
[0056]203:所述GPU接收中央处理器CPU发送的渲染图像的指令,所述指令包含待渲染的图像的标识。
[0057]可选的,所述标识可以是图像的名称、图像的ID (identificat1n)、图像的存储路径等等,本发明实施例不做限定。
[0058]204:所述GPU在所述能被应用程序和所述GPU访问的内存空间中读取与所述标识对应的位图图像。
[0059]205:所述GPU将所述位图图像作为纹理图像进行渲染。
[0060]具体实施例中,在该应用程序和GPU均能访问的内存空间读取得到该渲染图像的指令所携带的标识对应的位图图像之后,即可将该位图图像作为纹理图像进行渲染,通过绘制函数载入显存后,再通过Present函数将该渲染后的图像输出至显示器中进行显示,以增强场景的真实感。
[0061]在本发明实施例中,可通预先创建能够被应用程序和GPU访问的内存空间,并通过该内存空间存储位图图像,使得GPU在接收到渲染图像的指令时,能够根据该指令携带的待渲染图像的标识从预置的应用程序及GPU均能访问的内存空间中读取该标识对应的位图图像作为待渲染图像,从而对读取的该位图图像进行纹理渲染处理。本发明实施例通过将CPU解码的位图图像直接保存在该新建的内存空间中,使得GPU可以从该内存空间中直接读取位图,不再需要位图数据的拷贝,即无需再保存两份数据,从而节省了内存空间,并提升了图形渲染效率,避免了因内存分配的频繁触发而导致进程频繁卡顿的问题。
[0062]请参阅图3,图3是本发明实施例提供的一种图像渲染装置的结构示意图,具体的,如图3所示,本发明实施例的所述图像渲染装置可以包括指令接收单元11、图像读取单元12以及图像渲染单元13 ;其中,
[0063]所述指令接收单元11,用于接收中央处理器CPU发送的渲染图像的指令,所述指令包含待渲染的图像的标识。
[0064]应理解,本发明实施例的所述图像渲染装置可具体设置于配置有GPU的终端中。该终端可以包括但不限于智能手机(如Android手机、1S手机等)、平板电脑、移动互联网设备(Mobile In
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1