一种界面渲染方法、装置、终端设备和存储介质与流程

文档序号:17488627发布日期:2019-04-23 20:12阅读:129来源:国知局
一种界面渲染方法、装置、终端设备和存储介质与流程

本申请涉及计算机技术领域,特别是涉及一种界面渲染方法,一种界面渲染装置,一种终端设备以及一种存储介质。



背景技术:

随着终端技术的不断发展,用户的生活越来越离不开终端设备,如通过平板电脑看书、看视频、玩游戏,通过手机购物等。相应的,终端设备中可以安装各种应用程序(application,app),辅助用户执行所需的各种操作。

终端设备中显示的用户界面(userinterface,ui),如系统界面、应用界面等都是通过ui渲染实现的。在执行ui渲染时,通常应用会根据要执行的渲染,直接调用渲染引擎的相应接口,然后渲染引擎直接相应的渲染处理。其中,对于渲染引擎接口调用的处理,以及渲染引擎对应渲染处理的执行都是由系统中图形化处理的主线程执行的。

如图1所示的主线程处理示意图,终端中一个或多个应用会基于要执行的渲染调用相应的接口,因此主线程会处理对于各种接口的调用,在接口调用后还需要渲染引擎执行相应的各种渲染处理,渲染引擎也是运行在主线程上,需要主线程执行相应的各种渲染处理。即主线程需要处理各种接口调用、渲染处理的任务,导致该主线程的任务过重。



技术实现要素:

本申请实施例所要解决的技术问题是提供一种界面渲染方法,以解决主线程任务过重的问题。

相应的,本申请实施例还提供了一种界面渲染装置、一种终端设备和一种存储介质,用以保证上述方法的实现及应用。

为了解决上述问题,本申请实施例公开了一种界面渲染方法,包括:通过调用命令队列的接口,确定对应的渲染命令;将所述渲染命令放入命令队列;将所述命令队列中的渲染命令分发给至少一个渲染线程,采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建。

本申请实施例还公开了一种界面渲染装置,包括:命令确定模块,用于通过调用命令队列的接口,确定对应的渲染命令;入队模块,用于将所述渲染命令放入命令队列;分发模块,用于将所述命令队列中的渲染命令分发给至少一个渲染线程;渲染模块,用于采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建。

本申请实施例还公开了一种终端设备,包括:一个或多个处理器;和其上存储有指令的一个或多个机器可读介质,当由所述一个或多个处理器执行时,使得所述终端设备执行如本申请实施例中一个或多个所述的界面渲染方法。

本申请实施例还公开了一个或多个机器可读介质,其上存储有指令,当由一个或多个处理器执行时,使得终端设备执行如本申请实施例中一个或多个所述的界面渲染方法。

本申请实施例还公开了一种用于终端设备的操作系统,包括:命令处理单元,通过调用命令队列的接口,确定对应的渲染命令;将所述渲染命令放入命令队列;分发单元,将所述命令队列中的渲染命令分发给至少一个渲染线程;渲染单元,采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建。

与现有技术相比,本申请实施例包括以下优点:

在本申请实施例中,可以通过调用命令队列的接口,确定对应的渲染命令,无需直接调用渲染引擎,然后将渲染命令放入命令队列,再命令队列中的渲染命令分发给至少一个渲染线程,采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建,从而不再是主线程执行全部的处理,从而解决主线程任务过重的问题。

附图说明

图1是背景技术的界面渲染处理示意图;

图2是本申请实施例的一种界面渲染示意图;

图3a是本申请实施例的一种命令查询示意图;

图3b是本申请实施例的另一种命令查询示意图;

图4是本申请实施例的命令处理示意图;

图5是本申请的一种界面渲染方法实施例的步骤流程图;

图6是本申请的另一种界面渲染方法实施例的步骤流程图;

图7是本申请实施例的一种多线程实时调度处理的交互示意图;

图8是本申请的又一种界面渲染方法实施例的步骤流程图;

图9是本申请实施例的一种多线程异步调度处理的交互示意图;

图10是本申请的一种界面渲染装置实施例的结构框图;

图11是本申请的另一种界面渲染装置实施例的结构框图;

图12是本申请一实施例提供的电子设备的硬件结构示意图;

图13是本申请另一实施例提供的电子设备的硬件结构示意图;

图14是本申请一实施例提供的操作系统示意图。

具体实施方式

为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。

本申请实施例中,终端设备指的是具有终端操作系统的设备,这些设备可支持音频、视频、数据等方面的功能,包括移动终端如智能手机、平板电脑、可穿戴设备,也可以是智能电视、个人计算机等设备。操作系统如alios、ios、android、windows等。

现有渲染框架中,对于渲染引擎的接口调用、渲染的处理等均由界面处理的主线程执行,导致主线程任务过重。本申请实施例中,创造性的提出了基于命令队列的框架,在应用(或调用渲染引擎的模块)和渲染引擎之间设置一个或多个命令队列,通过命令队列生成、调用渲染命令,并且命令队列的框架可创建一个或多个渲染线程,由渲染线程执行渲染操作,而不再是主线程执行全部的处理,从而解决主线程任务过重的问题。

如图2所示,系统包括:目标对象10、基于命令队列的框架20和主线程30,其中,基于命令队列的框架20对应命令队列201和渲染线程202。目标对象为需要执行渲染操作的模块,如应用、调用渲染引擎的模块等。

其中,在该基于命令队列的框架20中,命令队列201提供了一系列接口,代替应用或调用渲染引擎的模块原本要调用的接口,即应用或调用渲染引擎的模块等目标对象10要执行渲染时,会调用命令队列201的接口,进而框架20会生成相应的渲染命令,在渲染命令进入命令队列201后,命令队列201会调度各渲染命令,从而将渲染命令分发给各个渲染线程202来执行,渲染线程202基于主线程30执行渲染命令对应的渲染操作。

其中,命令队列是一种队列,可记录渲染命令,并对渲染命令进行调度。其中,队列是常用数据结构之一,是一种特殊的线性表,其特殊之处在于它只允许在表的前端(front)进行删除(出队)操作,而在表的后端(rear)进行插入(入队)操作。因此可基于所需的结构建立命令队列,并为其静态分配或动态申请存储空间,并设置两个指针进行管理,其中一个是队头指针front,它指向队头元素(即渲染命令);另一个是队尾指针rear,它指向下一个入队元素的存储位置。从而将渲染命令存储到相应的存储空间后,在命令队列中执行插入操作,记录命令队列的存储地址,并通过队头指针指向在对头的渲染命令,基于相应的存储地址来获取渲染命令。如本申请实施例中命令队列可包括循环缓冲队列和/或批处理队列等。

命令队列的接口会提供给应用或调用渲染引擎的模块,因此要融合应用或调用渲染引擎的模块对应语言的需求,如融合到其他编程语言虚拟机(virtualmachine,vm)/运行时的需求来创建接口。不同的渲染操作可对应不同的接口,依据要执行的渲染调用相应的接口。

渲染命令用于指示要执行的渲染操作,渲染命令可依据命令类型和命令参数构成。渲染命令可以看作是一组数据,渲染命令在内存中组织。其中,命令类型用于标识要执行的渲染操作的类型,如绘图类型、排版类型等,命令参数为渲染操作相关的实际参数,如渲染位置的参数、渲染对象的参数等。其中,渲染参数包括对象参数和/或数据参数;对象参数包括句柄对象引用(handlereference),用于传递句柄对象(或者智能指针对象),数据参数包括各种数据参数,如按照数据类型传递的数值参数,其中,基本数据类型包括:int(整型)、fp(浮点型)、string(字符型)、array(数组)等,可基于上述基本的数据类型传递数值;还包括不透明数据/外部数据等数据参数,其中,不透明数据/外部数据可通过标记的二进制(taggedbinary)的形式进行封装,其中不透明数据为界面处理系统和界面处理系统使用者所通信的复杂数据,其不为命令队列的框架所理解,但是必须经由命令队列的框架传递。

调用命令队列的接口,其可传递的参数信息来生成渲染命令,例如,[uiimage]是用于显示图片的原生对象(nativeobject)类型,则[uiimage].0是一个[uiimage]类型的原生对象,handle.0是一个封装[uiimage].0的句柄(handle)对象。对于将[uiimage].0设置在坐标100,100是一个操作,对应的界面处理操作如[uiimage].0->setpos(100,100)。其包括原生对象[uiimage].0,和响应的数值参数100、100,通过转换可得到命令类型为[uiimage]setpos,相应的参数信息包括对象参数hr0(handlereference),其中,hr0是编码handle.0形成的参数,数据参数包括:100(int)和100(int)。

其中,对于对象参数,可以依据接口传递的参数确定原生对象(nativeobject),基于该原生对象可创建句柄(handle)对象,从而在渲染命令中句柄(handle)对象通过句柄对象引用表示,即编码为(encode)为一个或者多个int表示。即对每一个需要通过命令队列传递的原生(native)对象,创建一个句柄对象与该原生对象对应,该句柄对象可为原生对象的一部分。其中,命令队列的使用者如调度方、存取方等可通过各种编程语言实现,因此句柄对象在命令队列中,封装成句柄对象引用的形式。其中,转化句柄对象为句柄对象引用,可通过如下例的方式实现:

(1)指针方式,即使用versionedpointer(版本化的指针)实现句柄对象引用。

其中,此方式的句柄对象须放在一个指定堆(句柄堆)上加以管理,该指定堆为指定存储句柄对象的堆。句柄对象引用可基于句柄对象的地址、校验和(checksum)来实现引用,即通过从句柄引用中解码出句柄指针和校验和,从而确定对应地址上的句柄对象,并将校验和句柄对象的校验和进行检查。因此在每次释放句柄对象时,可以更新校验和(updatechecksum)。此种方式中,句柄对象引用是整型int实现,该整型的长度根据平台和编码方式决定,从而可以随意的按值传递(pass-by-value)和复制。

如图3a所示的示例中,对于整型引用使用版本化的指针的方式,句柄堆中存储每个句柄对象及其对应的校验和,从而在查询时,基于该句柄对象引用(handlereference),即可通过解码出指针和校验和,查询对应位置上的句柄对象和其校验和。因此在释放句柄对象时可以更新校验和。

(2)计数方式,即用引用计数(ref-counted)的句柄对象实现原始对象的引用。

其中,此方式的句柄对象不需要放在特殊的堆上。此方式的句柄对象通过计数实现,即对句柄对象进行了计数引用。

如图3b所示的示例中,对于此方式的句柄对象,不需要特殊的堆,可以以单个对象(individualobject)的方式独立管理。类似指针方式,句柄对象内存储了原始对象的指针,从而在查询时,可以使用该指针获取原始对象。

其中,对于指针方式,也可称为间接(indirect)方式,其具有简单轻量,节约内存和性能,便于支持各种编程语言的优势;但是,由于校验和可能会碰撞(collide),即出现相同的校验和,因此这种方式不是100%错误抵抗。对于计数方式,也可称为对象(object)方式,其具有错误抵抗的优势,但是可能会耗费内存、引入额外开销,实现比较复杂(因为需要精确地维护引用计数的准确性)。因此上述两种方式各有利弊,在实际处理中,可以依据需求选择命令处理对象的封装方式,得到相应的渲染命令。例如对于错误抵抗要求极高,或者无法提供专用句柄堆时,则可选择计数方式;而其余的情况下,都可以使用指针方式。

对于不透明数据,通过taggedbinary(标记的二进制)的注册机制,即对该不透明数据的提供方,通过注册该标签(tag),即可以唯一标示的整数(int)、字符串(string)、guid等,和将一组回调(callback)注册到命令队列对应的渲染框架中;其后,渲染框架会使用这些回调,来进行原生(native)语言到目标语言的双向转化,进行不透明数据的复制/移动/释放(copy/move/release)等。

对于外部数据类型。如果该语言支持,可以进行自动转化,例如,对javascript,该组回调可以将二进制数据可以转化成javascriptarraybuffer(数组缓冲),反之亦然。对java,二进制数据和javaarray(数组)互相转化。

本申请实施例中,对于应用、调用渲染引擎的模块等目标对象会执行调用命令队列的接口的操作,相应会映射为命令队列可调度的渲染命令。

其中,对于创建和设置(set)操作,直接转化为相应的渲染命令,例如:将界面处理操作imageview.seturi(uri),转换为渲染命令addcommand(hrimageview,cmdid_imageview_seturi,uri),其中hrimageview是对应的句柄对象引用,数据参数为cmdid_imageview_seturi,uri。

对于创建操作,可转化为智能指针对象+命令(allocatehandle+command)的形式,例如:将界面处理操作imageview=newimageview(),转换为渲染命令hrimageview=allocatehandle();addcommand(hrimageview,cmdid_create_imageview),其中,hrimageview是对应的句柄对象引用,数据参数是cmdid_create_imageview。

命令队列是一种队列,可存储渲染命令,并对渲染命令进行调度。因此可基于所需的结构建立命令队列,并为其静态分配或动态申请存储空间,并设置两个指针进行管理,其中一个是队头指针front,它指向队头元素(即渲染命令);另一个是队尾指针rear,它指向下一个入队元素的存储位置。从而将渲染命令存储到相应的存储空间后,在命令队列中执行插入操作,记录命令队列的存储地址,并通过队头指针指向在对头的渲染命令,基于相应的存储地址来获取渲染命令。其中,命令队列包括:循环缓冲队列和/或批处理队列。其中,循环缓冲队列按照先进先出的顺序进行处理,因此可以存储一些实时性要求较高、数据量比较小的命令;批处理队列用于存储批处理的命令,该渲染命令是多个命令打包构成的,因此对于实时性要求通常比较低,处理的数据量比较大,因此可以具有多个批处理队列依次进行命令的调度。例如循环缓冲队列可通过循环缓冲区(ringbuffer)实现。

其中,循环缓冲区是类似端到端连接的使用单一、固定大小的数据结构的缓冲,这种结构可以很容易地缓冲数据流。例如一种循环缓冲区(ringbuffer)实现简单示例中,使用1个提交线程/1个消费线程的模型。其中,循环缓冲区的存储区域由一段连续内存构成,用读指针/写指针分别标示开始和结束的有效数据的内存地址,用写分配指针表示正在即将写入的数据的结束位置,用两个同步对象(例如pthreadcondition)实现读/写的等待/唤醒。

消费循环缓冲区中的数据采用如下步骤:步骤s11.从读指针的地址开始访问,计算需要读取的数据的长度,例如n条命令;步骤s12.如果没有数据,或者数据过少(即读指针等于,或者距离写指针很近),尝试等待;如果有数据在写入(写指针不等于写分配指针),进行m次的轮询,可(返回步骤s11.);如果没有数据在写入,或者轮询m次后仍然需要等待,对读同步对象进行等待;步骤s13.分配缓冲区外的内存,将该长度的数据复制到新分配的内存中;步骤s14.释放缓冲区内存:更新读指针,读指针=读指针+数据长度;步骤s15.触发写同步对象的唤醒;步骤s16.返回新分配的内存。

向循环缓冲区提交数据采用如下步骤:步骤s21.从写指针获取当前剩余空间;步骤s22.如果剩余空间不足,对写同步对象进行等待;步骤s23.分配缓冲区内存:更新写分配指针,写分配指针=写指针+数据长度;步骤s24.将数据复制进循环缓冲区内;步骤s25.提交缓冲区内存:更新写指针,写指针=写分配指针;步骤s26.触发读同步对象的唤醒。

批处理(batch)队列,该批处理队列中存储的渲染命令可存放在独立的堆(heap)上。其中,heap可以共享,如每个循环缓冲队列中的渲染命令使用同一个堆;或者每个批处理队列中的渲染命令使用同一个堆等。

一个示例中,循环缓冲队列和批处理队列中命令如图4所示,渲染命令具体命令类型和相应的命令参数,如在参数(argument)对应句柄对象引用,字符(string)对应字符型的数据参数,数组(array)对应数组类型的数据参数,外部(external)参数对应外部描述符,基于外部描述符可确定外部数据。因此对于界面处理操作,可按照目标对象对应语言规则进行mapping(映射),得到相应的数据类型的数据参数,例如映射到javascript语言对应的整型、浮点、字符、数组等类型,句柄对象封装为句柄对象引用的形式。

本申请实施例中,命令队列的框架还会创建一个或多个渲染线程,从而各渲染命令可由渲染线程来执行相应的渲染操作,其中,各渲染线程可依据主线程来执行渲染操作。

本申请实施例,基于命令队列的框架,可在应用、要调用渲染引擎的模块等目标对象、和渲染框架之间建立桥梁,从而能够通过命令队列的接口生成渲染命令,通过命令队列调度渲染命令,渲染线程基于渲染引擎对应主线程的支持,可执行渲染命令对应的渲染操作,从而不再是主线程执行全部的处理,从而解决主线程任务过重的问题。

参照图5,示出了本申请的一种界面渲染方法实施例的步骤流程图。

步骤502,通过调用命令队列的接口,确定对应的渲染命令。

步骤504,将所述渲染命令放入命令队列。

本申请实施例中,应用、要调用渲染引擎的模块等目标对象在需要执行渲染时,可调用命令队列的接口,即执行调用接口的操作。其中,接口依据要执行的渲染操作确定,即不同渲染操作要调用不同的接口,如绘制图像的接口、绘制控件的接口等。通过调用命令队列的接口,可基于接口传递的参数生成相应的渲染命令,然后将渲染命令放入到命令队列中。其中,基于所调用的接口,也可得到相应的渲染命令,如界面渲染命令、控件渲染命令、图片渲染命令、文本渲染命令等。

本申请实施例中,可以具有一个或多个命令队列,并且命令队列还可按照功能进行划分,如实时同步处理的命令队列,执行异步处理的命令队列等,从而可以依据渲染命令确定进入的命令队列。其中,渲染命令的类型包括实时类和非实时类,实时类的渲染命令对于渲染的实时性具有一定的需求,通常该类命令的数据量也比较小,如canvas绘图命令、文本排版等命令。非实时类的渲染命令对于渲染的实时性需求较低,通常该类命令的数据量较大,例如应用界面中各种背景、图像、控件等渲染命令。从而针对不同类型的渲染命令,可采用不同的命令队列存储。

对于不同的命令队列也可设置不同的提取规则,例如对于存储实时类渲染命令的命令队列可设置实时提取的规则,即命令队列中存储渲染命令即可提取,又如对于存储非实时类渲染命令的命令队列可设置循环提取的规则,如有多个命令队列,则在不同命令队列间循环等。

步骤506,将所述命令队列中的渲染命令分发给至少一个渲染线程,采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建。

可以从所述命令队列中提取渲染命令,然后对渲染命令进行分发,可将命令队列中各渲染命令分发给一个或多个渲染线程,从而采用渲染线程来执行渲染命令对应的渲染操作,如执行界面中文本排版、文本显示、图像显示、控件显示等渲染操作,得到相应的显示数据进行显示,如文本、图像、界面等。

综上,可以通过调用命令队列的接口,确定对应的渲染命令,无需直接调用渲染引擎,然后将渲染命令放入命令队列,再命令队列中的渲染命令分发给至少一个渲染线程,采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建,从而不再是主线程执行全部的处理,从而解决主线程任务过重的问题。

本申请实施例中,应用的编程语言和渲染框架的编程语言可能不同,例如应用通过java、javascript等语言实现,而渲染框架通过c++实现,因此可通过基于命令队列的框架实现不同语言间的交互,从而应用等目标对象调用命令队列的接口得到渲染命令,命令队列对渲染命令进行调度,通过至少一个渲染线程处理所述渲染命令对应的渲染操作。

并且,由于终端设备在运行过程中屏幕上内容的显示需要不断的执行渲染,也可能存在多种应用需要执行渲染,因此终端设备中可能存在较多的界面处理操作待处理,为了更好的执行渲染,提高渲染的效率,可以通过命令队列对渲染命令进行调度,依据需求实现实时调度、异步调度等。

本申请一个可选实施例中,通过调用命令队列的接口,确定对应的渲染命令,包括:依据所述命令队列的接口传递的参数信息,生成对应的渲染命令。所述依据所述命令队列的接口传递的参数信息,生成对应的渲染命令,包括:依据所述命令队列的接口传递的参数信息,确定命令类型,以及以下至少一种命令参数:对象参数、数据参数;依据所述命令类型和命令参数,生成对应的渲染命令。可确定所需执行渲染命令的命令类型,例如绘图类型、排版类型等,还可得到具体的命令参数,如绘图位置的参数、排版位置的参数,对象参数等。

例如,[uiimage]是用于显示图片的原生对象(nativeobject)类型,则[uiimage].0是一个[uiimage]类型的原生对象,handle.0是一个封装[uiimage].0的句柄(handle)对象。对于将[uiimage].0设置在坐标100,100是一个操作,对应的界面处理操作如[uiimage].0->setpos(100,100)。其包括原生对象[uiimage].0,和响应的数值参数100、100,通过转换可得到命令类型为[uiimage]setpos,相应的参数信息包括对象参数hr0(handlereference),其中,hr0是编码handle.0形成的参数,数据参数包括:100(int)和100(int)。

本申请实施例中,所述命令队列包括:循环缓冲队列和/或批处理队列。其中,循环缓冲队列按照先进先出的顺序进行处理,因此可以存储一些实时性要求较高、数据量比较小的命令;批处理队列用于存储批处理的命令,该渲染命令是多个命令打包构成的,因此对于实时性要求通常比较低,处理的数据量比较大,因此可以具有多个批处理队列依次进行命令的调度。例如循环缓冲队列可通过循环缓冲区(ringbuffer)实现。

所述渲染命令的类别包括:实时类和非实时类。实时类的渲染命令对于渲染的实时性具有一定的需求,通常该类命令的数据量也比较小,如canvas绘制命令、文本排版等命令。非实时类的渲染命令对于渲染的实时性需求较低,通常该类命令的数据量较大,例如应用界面中各种界面元素等渲染命令。从而基于渲染命令的类别可以选择不同的命令队列进行存储,并执行相应的调度,再执行渲染操作。

其中,实时调度可通过如下步骤实现:

参照图6,示出了本申请的另一种界面渲染方法实施例的步骤流程图。

步骤602,目标对象调用命令队列的接口。

步骤604,依据所述命令队列的接口传递的参数信息,确定命令类型和命令参数。

步骤606,依据所述命令类型和命令参数,生成对应的渲染命令。

本申请实施例中,应用、要调用渲染引擎的模块等目标对象在需要执行渲染时,可调用命令队列的接口,即执行调用接口的操作。然后命令队列的框架中处理接口调用的线程可依据所述命令队列的接口传递的参数信息,确定命令类型和命令参数,依据所述命令类型和命令参数,生成对应的渲染命令,该线程可由命令队列的框架创建。本申请实施例可生成实时类的渲染命令。

步骤608,将实时类的渲染命令放入所述循环缓冲队列。

本申请实施例中,对于实时类的渲染命令,如canvas绘制命令、文本排版命令等,均可放入所述循环缓冲队列,执行实时调度。

本申请实施例中,可通过多个线程实现渲染,例如设置两个线程,分别为:客户(client)线程、服务(server)线程,则可采用client线程对界面处理操作进行转换生成渲染命令,并提交给server线程,server线程对渲染命令进行调度,并在渲染后得到eventreply(事件的回复)送回给client线程。因此可通过client线程执行上述步骤604-608。

步骤610,接收入队事件,所述入队事件用于通知所述循环缓冲队列中新增渲染命令。

步骤612,从所述循环缓冲队列中提取所述实时类的渲染命令。

在将实时类的渲染命令放入所述循环缓冲队列后,线程可生成入队事件,该入队事件用于通知所述循环缓冲队列中新增渲染命令。例如上述客户线程执行命令转换、命令入队,以及生成入队事件等,从而在实时调度时,服务线程在获取到入队事件后即可从所述命令队列中提取所述实时类的渲染命令。其中,若实时类的渲染命令放入所述循环缓冲队列时,该循环缓冲队列中还存在未处理的渲染命令,以依据入队顺序即先进先出规则,得到前面的渲染命令均出队后再提取。如通过服务线程执行上述步骤610-612。

如上述客户线程在将实时类的渲染命令放入所述循环缓冲队列后,客户线程生成入队事件,然后将入队事件发送给服务线程,服务线程对循环缓冲队列中的渲染命令进行调度,依次从循环缓冲队列中提取渲染命令。本申请实施例中,为了最小化延迟,上述客户线程和服务器线程的操作可同步执行,客户线程写入渲染命令到循环缓冲队列后,就会透明地自动提交该渲染命令。

步骤614,将所述命令队列中的渲染命令分发给渲染线程,渲染线程依据主线程,执行所述渲染命令对应的渲染操作。

从循环缓冲队列中提取所述实时类的渲染命令后,可将该渲染命令分发给渲染线程,渲染线程依据主线程,调用相应的工具、基于相应的数据等来执行所述渲染命令对应的渲染操作。其中,渲染线程依据主线程确定执行渲染所需的各种工具、数据等信息,如运行图形驱动程序、调用图像处理器(graphicsprocessingunit,gpu)的参数信息等,从而能够运行图像驱动程序,并调用gpu执行相应的渲染。

步骤616,依据渲染操作生成相应的渲染事件,在框架中注册所述渲染事件。

步骤618,回调所述渲染事件。

其中,发出界面处理操作的目标对象还需要获取渲染事件,来确定渲染操作的执行,因此在渲染操作执行完毕后,会生成相应的渲染事件,例如视图创建完成事件、文本排版完成事件等,然后命令队列的框架中注册该渲染事件从而能够回调该渲染时间,例如在服务线程中注册该渲染时间,并回调该渲染时间给客户线程,再由客户线程通知目标对象。

本申请实施例中,对于事件回调,可转化为异步的事件回复(eventreply),然后在客户线程上派发。其中,有一些目标对象要获取渲染相关的信息,对于这类获取操作,客户线程可以尽量去除;若无法去除,则渲染引擎可将其转化为异步或者同步的事件供客户线程回调。在本申请实施例采用多线程机制处理时,获取操作会涉及到异步调度或者同步等待开销,一般的获取操作可通过客户线程自行缓存。

本申请实施例中,事件回调可基于各种编程语言的(如node.js等)的开发者环境进行融合。目标对象如系统中需要渲染引擎的模块、应用程序等可共享同一个客户线程,客户线程拥有自己的事件循环,例如node.js的uvloop主循环,因此为了将事件回调等给应用环境,需要融入开发者环境,从而便于不同语言、不同运行机制的融合交互。

步骤620,依据所述渲染操作生成对应的界面,显示所述界面,其中,所述界面包括:系统界面和/或应用界面。

在完成渲染操作后,可以得到相应的界面,如生成界面或更新界面等,从而可以在终端设备上显示该界面,所述界面包括:系统界面和/或应用界面。

其中,实时调度适合事件少、输出少或单一的情形的渲染,例如canvas类型的api对应操作等。

一种示例中,如图7所示的线程交互示意图。本示例以三个线程进行渲染处理为例,包括:客户线程(clientthread)、服务线程(serverthread)和工作线程(jobthread),其中,也可通过一个两个或更多线程实现。其中,客户线程和服务线程是为了实现目标对象和渲染引擎的交互创建的,工作线程即渲染线程。

步骤702、客户线程调用命令队列的接口生成渲染命令。

步骤704,客户线程将实时类的渲染命令放入所述循环缓冲队列。

步骤706,客户线程生成入队事件并发送给服务线程。

步骤708,服务线程从循环缓冲队列中获取渲染命令。

步骤710,服务线程分派渲染命令给工作线程。

步骤712,工作线程执行渲染操作。

步骤714,服务线程注册渲染事件,回调渲染事件给客户线程。

上述过程可适用于专用(dedicated)线程执行即在渲染线程中确定一专用的工作线程来进行实时的渲染命令的处理,即使用循环缓冲队列执行实时调度。在该模式下,服务线程/工作线程上的操作是同步完成的,从而最小化延迟。且客户线程写入图像处理命令到循环缓冲队列后,可透明地自动提交该命令,实现实时调度。

参照图8,示出了本申请的又一种界面渲染方法实施例的步骤流程图。

步骤802,目标对象调用命令队列的接口。

步骤804,依据所述命令队列的接口传递的参数信息,确定命令类型和命令参数。

步骤806,依据所述命令类型和命令参数,生成对应的渲染命令。

本申请实施例中,应用、要调用渲染引擎的模块等目标对象在需要执行渲染时,可调用命令队列的接口,即执行调用接口的操作。然后命令队列的框架中处理接口调用的线程可依据所述命令队列的接口传递的参数信息,确定命令类型和命令参数,依据所述命令类型和命令参数,生成对应的渲染命令,该线程可由命令队列的框架创建。本申请实施例可生成实时类的渲染命令。

步骤808,将非实时类的渲染命令放入所述批处理队列。

本申请实施例中,对于非实时类的渲染命令,如应用界面的渲染命令等,这些命令可是一系列命令的处理集合,从而可以打包进行批处理,因此非实时类的渲染命令可为批处理命令,因此可将非实时类的渲染命令放入所述批处理队列执行异步调度。

本申请实施例中,终端设备上可渲染并显示多个界面,因此每个界面可对应一个命令队列,各命令队列共享界面工具包(uitoolkit)的主线程。从而可设置多个批处理队列,将多个批处理队列进行排序,因此依次获取各批处理队列中的渲染命令进行处理。

本申请实施例中,可通过多个线程实现渲染,例如设置两个线程,分别为:客户线程、服务线程,则可采用客户线程对界面处理操作进行转换生成渲染命令,并提交给服务线程,服务线程对渲染命令进行调度,并在渲染后得到事件的回复送回给客户线程。因此可通过客户线程执行上述步骤804-808。

步骤810,循环从各批处理队列中提取所述非实时类的渲染命令。

步骤812,将所述命令队列中的渲染命令分发给渲染线程。

步骤814,所述渲染线程依据主线程,执行所述渲染命令对应的渲染操作。

客户线程在将非实时类的渲染命令放入所述批处理队列后,由于存在多个批处理队列,因此服务线程可循环从各批处理队列中提取所述非实时类的渲染命令,即从一个批处理队列中提取所述非实时类的渲染命令并执行后,再从下一个批处理队列中提取所述非实时类的渲染命令进行处理。

其中,对于命令的分发,命令可以组织成批处理(batch)的方式进行分发。当命令进入到命令队列,可以触发服务线程在主循环上的eventsource(事件源),该事件源获得调度后,服务线程可以派发所有命令队列中的命令。在命令循环的调度策略下,可以提供命令队列的自动提交。命令队列可在主循环上维护一个帧同步(vsync)对齐的定时器。如果该定时器在一个(偏移过的)帧同步周期内没有提交,就主动提交一次命令批处理。

在获取到非实时类的渲染命令后,可以发送给渲染线程进行渲染,其中可以先触发渲染线程进行渲染准备,在渲染准备完毕后,该渲染线程执行相应的渲染操作。对于批处理的命令,可将其融入其命令线程的框架中对应的事件循环中,循环调用各批处理队列中的命令,异步实现渲染操作。

步骤816,依据渲染操作生成相应的渲染事件,注册所述渲染事件。

步骤818,回调所述渲染事件。

其中,发出界面处理操作的目标对象还需要获取渲染事件,来确定渲染操作的执行,因此在渲染操作执行完毕后,会生成相应的渲染事件,例如视图创建完成事件、文本排版完成事件等,然后命令队列的框架中注册该渲染事件从而能够回调该渲染时间,例如在服务线程中注册该渲染时间,并回调该渲染时间给客户线程,再由客户线程通知应用层的应用。

本申请实施例中,对于事件回调,可转化为异步的事件回复(eventreply),然后在客户线程上派发。其中,有一些目标对象要获取渲染相关的信息,对于这类获取操作,客户线程可以尽量去除,若无法去除,则渲染引擎可将其转化为异步的事件供客户线程回调。在本申请实施例采用多线程机制处理时,获取操作会涉及到异步或者同步开销,一般的获取操作可通过客户线程自行缓存。

本申请实施例中,事件回调可基于各种编程语言的(如node.js等)的开发者环境进行融合。目标对象如系统中需要渲染引擎的模块、应用程序等可共享同一个客户线程,客户线程拥有自己的事件循环,例如node.js的uvloop主循环,因此为了将事件回调等给应用环境,需要融入开发者环境,从而便于不同语言、不同运行机制的融合交互。

步骤820,依据所述渲染操作生成对应的界面,显示所述界面,其中,所述界面包括:系统界面和/或应用界面。

在完成渲染操作后,可以得到相应的界面,如生成界面或更新界面等,从而可以在终端设备上显示该界面,所述界面包括:系统界面和/或应用界面。

其中,事件循环的调度,适合回复事件多、传统ui的使用场景。从而本申请实施例提供和传统渲染引擎非常类似的执行策略和事件分发方法,能够适应渲染框架的调用和处理需求,例如,一个批处理的渲染命令,可以按照传统渲染引擎按照帧同步开始的一轮界面的渲染更新,而对于事件回调,可以按照传统渲染引擎按照帧同步开始的一轮回调时间的分发。

一种示例中,如图9所示的线程交互示意图。本示例以三个线程进行渲染处理为例,包括:客户线程(clientthread)、服务线程(serverthread)和渲染线程(renderingthread),其中,也可通过一个两个或更多线程实现。其中,客户线程和服务线程是为了实现目标对象和渲染引擎的交互创建的。

步骤902、客户线程调用命令队列的接口生成渲染命令,将非实时类的渲染命令放入批处理队列中。

步骤904,客户线程提交批处理。以使服务线程获知渲染命令以入队,可以进行处理。

步骤906,服务线程取出该渲染命令,然后执行渲染命令。

步骤908,服务线程依据渲染命令向渲染线程触发渲染。

步骤910,渲染线程进行渲染准备,并在渲染操作准备完毕后,执行所述渲染操作。

步骤912,服务线程注册渲染事件,回调渲染事件给客户线程。

上述模式适用于渲染框架的渲染引擎,可以融入渲染框架主线程的事件循环。其中,通常的渲染框架的主线程依附于一个异步的消息循环,因此服务线程/渲染线程的操作可异步实现,其中,客户线程可手动提交批处理命令。当然也可基于事件循环实现自动的提交批处理命令。

本申请实施例可以由native(e.g.c++)实现,提供native接口,仅需移植少量命令队列的标准接口,就可以支持一种新的动态语言,从而对于不同的动态语言调用相应的接口实现,具有较好的可扩展性。

本申请实施例可采用gpu/图形渲染领域通用的命令队列(fifo)模型,并行性是透明的,并可以加以完整的同步控制。并且,命令提交开销低、支持管理对象,也具有足够的扩展性,能够支撑主流webview的全部能力。

本申请实施例的上述方式,可引入将多线程化的能力来提升性能和体验。并且可以支持javascript等新兴的开发语言,提升开发效率。

需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请实施例并不受所描述的动作顺序的限制,因为依据本申请实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请实施例所必须的。

在上述实施例的基础上,本实施例还提供了一种界面渲染装置,可以应用于终端设备中。

参照图10,示出了本申请的一种界面渲染装置实施例的结构框图,具体可以包括如下模块:

命令确定模块1002,用于通过调用命令队列的接口,确定对应的渲染命令。其中,所述命令队列用于存储和调度渲染命令。

入队模块1004,用于将所述渲染命令放入命令队列。

分发模块1006,用于将所述命令队列中的渲染命令分发给至少一个渲染线程。

渲染模块1008,用于采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建。

综上,可以通过调用命令队列的接口,确定对应的渲染命令,无需直接调用渲染引擎,然后将渲染命令放入命令队列,再命令队列中的渲染命令分发给至少一个渲染线程,采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建,从而不再是主线程执行全部的处理,从而解决主线程任务过重的问题。

参照图11,示出了本申请的另一种界面渲染装置实施例的结构框图,具体可以包括如下模块:

命令确定模块1002,用于通过调用命令队列的接口,确定对应的渲染命令。其中,所述命令队列用于存储和调度渲染命令。

入队模块1004,用于将所述渲染命令放入命令队列。

分发模块1006,用于将所述命令队列中的渲染命令分发给至少一个渲染线程。

渲染模块1008,用于采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建。

回调模块1010,用于依据渲染操作生成相应的渲染事件,在所述服务线程中注册所述渲染事件;所述服务线程回调所述渲染事件给所述客户线程。

显示模块1012,用于依据所述渲染操作生成对应的界面,显示所述界面,其中,所述界面包括:系统界面和/或应用界面。

其中,所述命令确定模块1002,用于依据所述命令队列的接口传递的参数信息,生成对应的渲染命令。

所述命令确定模块1002包括:参数确定子模块10022和命令生成子模块10024,其中:

参数确定子模块10022,用于依据所述命令队列的接口传递的参数信息,确定命令类型,以及以下至少一种命令参数:对象参数、数据参数;

命令生成子模块10024,用于依据所述命令类型和命令参数,生成对应的渲染命令。

其中,所述命令队列包括:循环缓冲队列和/或批处理队列;所述渲染命令的类别包括:实时类和非实时类。

所述分发模块1006,还用于从所述命令队列中提取渲染命令。

所述入队模块1004,包括:缓冲子模块10042和批处理子模块10044,其中:

缓冲子模块10042,用于将实时类的渲染命令放入所述循环缓冲队列。

批处理子模块10044,用于将非实时类的渲染命令放入所述批处理队列。

所述分发模块1006,包括:缓冲提取子模块10062和批处理提取子模块10064,其中:

缓冲提取子模块10062,用于接收入队事件,所述入队事件用于通知所述循环缓冲队列中新增渲染命令;从所述循环缓冲队列中提取所述实时类的渲染命令。

批处理提取子模块10064,用于循环从各批处理队列中提取所述非实时类的渲染命令。

所述渲染模块1008,用于所述渲染线程依据主线程,执行所述渲染命令对应的渲染操作,其中,所述主线程为渲染引擎对应的主线程。

其中,每个界面对应一个命令队列,各命令队列共享主线程。

所述命令队列还包括客户线程和服务线程,所述客户线程用于确定渲染命令并执行入队处理,所述服务线程用于分发所述渲染命令。

所述命令确定模块1002,还用于目标对象调用所述命令队列的接口,以执行所需的渲染操作。

本申请实施例可以由native(e.g.c++)实现,提供native接口,仅需移植少量命令队列的标准接口,就可以支持一种新的动态语言,从而对于不同的动态语言调用相应的接口实现,具有较好的可扩展性。

本申请实施例可采用gpu/图形渲染领域通用的命令队列(fifo)模型,并行性是透明的,并可以加以完整的同步控制。并且,命令提交开销低、支持管理对象,也具有足够的扩展性,能够支撑主流webview的全部能力。

本申请实施例的上述方式,可引入将多线程化的能力来提升性能和体验。并且可以支持javascript等新兴的开发语言,提升开发效率。

实施例四

本申请实施例还提供了一种非易失性可读存储介质,该存储介质中存储有一个或多个模块(programs),该一个或多个模块被应用在终端设备时,可以使得该终端设备执行本申请实施例中各方法步骤的指令(instructions)。

本申请实施例提供了一个或多个机器可读介质,其上存储有指令,当由一个或多个处理器执行时,使得电子设备执行如上述实施例中一个或多个所述的方法。所述电子设备包括终端设备、服务器(集群)等设备。

图12为本申请一实施例提供的电子设备的硬件结构示意图,该电子设备可包括终端设备、服务器(集群)等设备。如图12所示,该电子设备可以包括输入设备120、处理器121、输出设备122、存储器123和至少一个通信总线124。通信总线124用于实现元件之间的通信连接。存储器123可能包含高速ram(randomaccessmemory,随机存取存储器),也可能还包括非易失性存储nvm(non-volatilememory),例如至少一个磁盘存储器,存储器123中可以存储各种程序,用于完成各种处理功能以及实现本实施例的方法步骤。

可选的,上述处理器121例如可以为中央处理器(centralprocessingunit,简称cpu)、应用专用集成电路(asic)、数字信号处理器(dsp)、数字信号处理设备(dspd)、可编程逻辑器件(pld)、现场可编程门阵列(fpga)、控制器、微控制器、微处理器或其他电子元件实现,该处理器121通过有线或无线连接耦合到上述输入设备120和输出设备122。

可选的,上述输入设备120可以包括多种输入设备,例如可以包括面向用户的用户接口、面向设备的设备接口、软件的可编程接口、摄像头、传感器中至少一种。可选的,该面向设备的设备接口可以是用于设备与设备之间进行数据传输的有线接口、还可以是用于设备与设备之间进行数据传输的硬件插入接口(例如usb接口、串口等);可选的,该面向用户的用户接口例如可以是面向用户的控制按键、用于接收语音输入的语音输入设备以及用户接收用户触摸输入的触摸感知设备(例如具有触摸感应功能的触摸屏、触控板等);可选的,上述软件的可编程接口例如可以是供用户编辑或者修改程序的入口,例如芯片的输入引脚接口或者输入接口等;可选的,上述收发信机可以是具有通信功能的射频收发芯片、基带处理芯片以及收发天线等。麦克风等音频输入设备可以接收语音数据。输出设备122可以包括显示器、音响等输出设备。

在本实施例中,该设备的处理器包括用于执行各电子设备中网络管理装置各模块的功能,具体功能和技术效果参照上述实施例即可,此处不再赘述。

图13为本申请另一实施例提供的电子设备的硬件结构示意图。图13是对图12在实现过程中的一个具体的实施例。如图13所示,本实施例的电子设备包括处理器131以及存储器132。

处理器131执行存储器132所存放的计算机程序代码,实现上述实施例中图1至图9的界面渲染方法。

存储器132被配置为存储各种类型的数据以支持在电子设备的操作。这些数据的示例包括用于在电子设备上操作的任何应用程序或方法的指令,例如消息,图片,视频等。存储器132可能包含随机存取存储器ram,也可能还包括非易失性存储器nvm,例如至少一个磁盘存储器。

可选地,处理器131设置在处理组件130中。该电子设备还可以包括:通信组件133,电源组件134,多媒体组件135,音频组件136,输入/输出接口137和/或传感器组件138。设备具体所包含的组件等依据实际需求设定,本实施例对此不作限定。

处理组件130通常控制设备的整体操作。处理组件130可以包括一个或多个处理器131来执行指令,以完成上述图1至图9方法的全部或部分步骤。此外,处理组件130可以包括一个或多个模块,便于处理组件130和其他组件之间的交互。例如,处理组件130可以包括多媒体模块,以方便多媒体组件135和处理组件130之间的交互。

电源组件134为设备的各种组件提供电力。电源组件134可以包括电源管理系统,一个或多个电源,及其他与为电子设备生成、管理和分配电力相关联的组件。

多媒体组件135包括在设备和用户之间的提供一个输出接口的显示屏。在一些实施例中,显示屏可以包括液晶显示器(lcd)和触摸面板(tp)。如果显示屏包括触摸面板,显示屏可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。

音频组件136被配置为输出和/或输入音频信号。例如,音频组件136包括一个麦克风(mic),当设备处于操作模式,如语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器132或经由通信组件133发送。在一些实施例中,音频组件136还包括一个扬声器,用于输出音频信号。

输入/输出接口137为处理组件130和外围接口模块之间提供接口,上述外围接口模块可以是点击轮,按钮等。这些按钮可包括但不限于:音量按钮、启动按钮和锁定按钮。

传感器组件138包括一个或多个传感器,用于为设备提供各个方面的状态评估。例如,传感器组件138可以检测到设备的打开/关闭状态,组件的相对定位,用户与设备接触的存在或不存在。传感器组件138可以包括接近传感器,被配置用来在没有任何的物理接触时检测附近物体的存在,包括检测用户与设备间的距离。在一些实施例中,该传感器组件138还可以包括摄像头等。

通信组件133被配置为便于电子设备和其他电子设备之间有线或无线方式的通信。电子设备可以接入基于通信标准的无线网络,如wifi,2g或3g,或它们的组合。在一个实施例中,该电子设备中可以包括sim卡插槽,该sim卡插槽用于插入sim卡,使得设备可以登录gprs网络,通过互联网与服务器建立通信。

由上可知,在图13实施例中所涉及的通信组件133、音频组件136以及输入/输出接口137、传感器组件138均可以作为图12实施例中的输入设备的实现方式。

本申请实施例提供了一种终端设备,包括:一个或多个处理器;和,其上存储有指令的一个或多个机器可读介质,当由所述一个或多个处理器执行时,使得所述终端设备执行如本申请实施例中一个或多个所述的方法。

本申请实施例还提供一种用于终端设备的操作系统,如图14所示,该设备的操作系统包括:命令处理单元1402、分发单元1404和渲染单元1406。

命令处理单元1402,通过调用命令队列的接口,确定对应的渲染命令;将所述渲染命令放入命令队列。

分发单元1404,将所述命令队列中的渲染命令分发给至少一个渲染线程。

渲染单元1406,采用所述渲染线程处理所述渲染命令对应的渲染操作,其中,所述渲染线程依据命令队列创建。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。.

本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本申请所提供的一种界面渲染方法,一种界面渲染装置,以及一种智能终端,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1