具体实施方式
为使本说明书的目的、技术方案和优点更加清楚,下面将结合具体实施例及相应的附图对本说明书的技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本说明书保护的范围。
以下结合附图,详细说明本说明书中各实施例提供的技术方案。
在介绍实施例之前,可以先对说明书中设计到的名词进行解释。
虚幻引擎(UNREAL ENGINE,或称Unreal)平台是一种由Epic Games团队开发的游戏引擎,为游戏开发者提供需要的大量的核心技术、数据生成工具和基础支持,可以用于开发3D场景。
蓝图(Blueprint),是基于Unreal平台下使用C++编程语言开发出的一种可视化脚本系统,其实现了开发服务网关协议(Open Service Gateway Initiative,OSGi)规范。所谓Blueprint实现了OSGi规范,是指Blueprint里定义的元素名,子元素名,元素属性,都是OSGi规范里标定的内容。比如,OSGi里要求bundle要能被注册,能被bind,能被启动等。相应的,Blueprint里,有服务(service)元素,关联(reference)元素,bean元素,分别代表服务,对服务的引用,服务的实现bean。利用该脚本系统,开发者可以通过可视化编程的方式,进行3D场景的逻辑设计等。
实施例1
本说明书实施例提供一种针对蓝图Blueprint的消息处理方法,能够较好地处理H5页面端和Blueprint端的交互的消息,以便较好地支持2D页面和3D场景的协同演示。具体流程示意图如图1所示,包括:
步骤102:通过应用的H5页面单元中的消息接收组件接收来自应用的蓝图端的消息。
在实际的混合开发中,3D场景与2D页面通常具有一定的关联性,比如可以通过切换3D场景而同时切换2D页面显示的数据,以使3D场景显示的内容对应于2D页面显示的内容。而本步骤中的3D场景,就可以通过Unreal平台下的应用中的Blueprint端进行开发,而2D页面就可以通过具有跨平台特性的H5超文本标记语言进行开发。所以也就需要使Unreal应用中H5页面端能够接收到Blueprint端的消息并进行处理。
具体地,为了实现H5页面端与Blueprint端之间进行交互,可以预先设置一套JSBridge,JSBridge可以是用于H5页面端与本地(Native)端,以及蓝图Blueprint端之间进行消息交互的桥梁。进一步地,如图2所示,为H5页面端与蓝图端进行交互的示意图,图2中可以包括蓝图端、本地端、以及H5页面端,在H5页面端中,可以包括H5服务单元、包含在H5服务单元中的H5会话单元、以及包含在H5会话单元中的H5页面单元。
这里,H5服务单元、H5会话单元、以及H5页面单元就可以是用于构成JSBridge的三层架构。其中,H5服务单元可以是应用中的唯一实例,可以控制一个或多个H5会话单元的生命周期。具体地,可以创建一个或多个H5会话单元,并控制H5会话单元进行自行销毁。使得H5服务单元可以管理H5会话单元。
而在实际应用中,为了便于单元之间的共享数据,在一种实施方式中,该应用中的H5会话单元可以共享H5服务单元内存储的数据;该应用中的H5页面单元也可以共享H5服务单元内存储的数据。也即,H5服务单元内存储的所有数据,可以被全部H5会话单元、以及H5页面单元共享。使得多个H5会话单元、以及多个H5页面单元之间,不需要存储上一级H5单元内的所有数据,便可以共享上一级H5单元内的数据,减轻了H5会话单元、和H5页面单元的存储压力。
在一种实施方式中,为了使得H5会话单元可以管理H5页面单元,在一种实施方式中,一个H5会话单元可以控制一个或多个H5页面单元的生命周期,类似地,每个H5会话单元就可以创建一个或多个H5页面单元,并控制H5页面单元进行自行销毁。
类似地,为了便于H5页面单元之间的共享数据,在一种实施方式中,H5会话单元控制的H5页面单元也可以共享H5会话单元内存储的数据。
也即,针对数据共享,H5服务单元中存储的数据,可以被H5会话单元、以及H5页面单元共享;而H5会话单元中存储的数据,可以被H5页面单元共享。而H5会话单元内存储的所有数据,也可以被全部H5页面单元共享。
在实际应用中,H5会话单元可以对应一个或多个H5窗口,而每一个H5窗口可以用于启动一个或多个H5页面单元,每个H5页面单元可以对应一个独立的H5页面,在实际应用中,这个H5页面可以占据整个H5窗口、或其中的一部分。
在H5页面单元中,可以封装用于H5页面与Blueprint端进行消息传递的消息接收组件,比如该消息接收组件就可以是如图2中所示的H5微件(H5Widget),H5Widget可以是Blueprint端提供的用于进行消息交互的接口,可以用于实现接收Blueprint端发送来的消息。也即,可以通过应用的H5页面单元中的H5Widget接收来自该应用的Blueprint端的消息。而这里的应用,可以是基于Unreal平台开发的应用,也即本实施例所介绍的方法,可以应用于基于虚幻引擎开发的应用。
为了得到更好的兼容性,Blueprint端发送来的消息的数据类型可以采用Unreal平台提供的UStruct数据类型。步骤104:将接收到的消息按顺序依次传输至H5会话单元、以及H5服务单元。
在利用H5Widget接收到Blueprint端发来的消息后,为了实现按照H5服务单元、H5会话单元、H5页面单元为顺序、由高至低的处理优先级,H5页面单元可以先暂时不对接收到的消息进行处理,而是依次将该消息传输至H5会话单元、以及H5服务单元。具体地,如图2所示,可以利用H5页面单元、以及H5会话单元中各自的H5插件管理器(H5PluginManager)进行传输。
进一步地,H5页面单元中的H5Widget可以在接收到消息后,通过H5页面组件(H5Page,简称H5页面)将该消息传输至H5页面插件管理器(H5页面PluginManager)中,并由H5页面PluginManager向H5会话单元中的H5会话插件管理器(H5会话PluginManager)传输该消息,最终,由会话H5会话PluginManager向H5服务单元中的H5服务插件管理器(H5服务PluginManager)传输该消息,从而使得Blueprint端发来的消息,在被H5Widget接收后,可以传输至每个H5单元中。从而通过不同H5单元中各自的H5PluginManager,实现了对消息的路由。
这里,H5Page可以是为H5页面PluginManager与H5Widget双方提供一个数据传输的接口,起到了数据传输的作用。
在一种实施方式中,为了得到更好的兼容性,消息传递的数据格式可以采用JSon(JavaScript Object Notation,JS,对象简谱)数据格式。
步骤106:依次按照H5服务单元、H5会话单元、以及H5页面单元中各自的H5插件对于该消息的处理能力,通过该各自的H5插件对该消息中未处理部分进行处理。
在前述步骤中,已经将Blueprint端发来的消息传输至各个H5单元,则在本步骤中,就可以对该消息进行处理。具体地,为了体现处理消息的优先级,可以先由H5服务PluginManager轮询H5服务单元中各个H5服务插件(H5服务Plugin)是否具备处理该消息中未处理部分的能力,若是,则由对应的H5服务Plugin处理消息中的未处理部分。
此后,可以将H5服务Plugin无法处理的消息通知H5会话PluginManager,并继续由H5会话PluginManager轮询H5会话单元中各个H5会话插件(H5会话Plugin)是否具有具备处理该消息中未处理部分的能力,若是,则由对应的H5会话Plugin继续对消息中未处理部分进行处理。
类似地,可以继续将H5会话Plugin无法处理的消息通知H5页面PluginManager,并继续由H5页面PluginManager轮询H5页面单元中各个H5页面插件(H5页面Plugin)是否具有具备处理该消息中未处理部分的能力,若是,则由对应的H5页面Plugin对消息中未处理部分进行处理。
也即H5服务单元、H5会话单元、以及H5页面单元中,均可以包含各自的H5插件管理器,而各自的H5插件管理器,则可以将接收到的消息中未处理部分路由到各自对应的H5插件进行处理。
由此可见,可以通过前述步骤从Blueprint端接收消息(通常可以是消息集合),并传输至各H5单元中各自的H5 PluginManager,此后,先由H5服务PluginManager筛选出H5服务Plugin可以处理的消息并进行处理,再由H5会话PluginManager从未处理的消息中筛选出H5会话Plugin可以处理的消息并进行处理,最后由H5页面PluginManager从未处理的消息中筛选出H5页面Plugin可以处理的消息并进行处理。
据此,可以将消息处理的流程分为消息的冒泡阶段(H5页面单元→ H5会话单元→H5服务单元进行传输),以及消息的捕获阶段(H5服务单元→ H5会话单元→H5页面单元进行处理),从而也就可以对来自Blueprint端的消息进行较为细粒度的处理,使消息的整个处理流程变得更加灵活,以便开发者可以根据项目的实际情况,在消息传递的不同阶段进行相应的处理。比如,可以在消息的冒泡阶段进行拦截,通过H5单元以外的其他插件进行处理;也可以在消息的捕获节点,将某个H5单元的处理步骤进行拦截,等。
在实际应用中,按照H5插件对于消息的处理能力进行处理的步骤,可以依据H5插件是否具有处理消息的能力进行处理。比如对于消息1而言,可以有一个H5服务Plugin具有处理这种消息的能力,则可以由这个H5服务Plugin对消息1进行处理。
而在实际应用中,也可以根据各个H5单元中各自H5Plugin对于消息数量的处理能力进行筛选。比如,接收到的消息集合中可以有100个消息,H5服务单元中的H5服务Plugin最多可以处理30个,那么当分配完30个消息后,则可以直接通知H5会话单元处理剩余的70个消息。也即在一种实施方式中,为了避免H5单元负载过量,依次按照H5服务单元、H5会话单元、以及H5页面单元中H5插件对于该消息的处理能力,通过H5插件对该消息中未处理部分进行处理,可以包括:依次按照H5服务单元、H5会话单元、以及H5页面单元中H5插件对于该消息数量的处理能力,通过H5插件对该消息中未处理部分进行处理。在实际的应用中,也有可能出现对Blueprint端发来的消息并未全部处理完的情况。通过这种方式,则可以使消息的整个处理流程变得更加灵活。
在接收到Blueprint端发来的消息并处理后,就可以结束处理流程,但在实际应用中,也可以将消息的处理结果,返回给本地Native端,所以在一种实施方式中,为了使Native端得到针对Blueprint端的消息的处理结果,本方法还可以包括:将各自的H5插件对消息的处理结果,通过该各自的H5插件发送至本地Native端。具体地,由H5服务单元中的H5服务Plugin处理了某个消息,就可以由这个H5服务Plugin将该消息的处理结果,发送至Native端。从而实现了通过不同H5单元中的H5插件,对消息处理结果进行较为准确的路由。而在实际应用中,为了提高H5插件与Native端之间的兼容性,各个H5插件可以由Native端代码或Blueprint端代码进行定义。
如图3所示,为H5页面端与蓝图端和本地端进行交互的示意图,图3中仅示出了H5页面单元(其余两个H5单元未示出),在H5页面单元中的H5页面Plugin对某个消息进行处理后,可以由处理这个消息的H5页面Plugin,将消息的处理结果发送至本地端。当然,在实际应用中,也可以将消息的处理结果,通过对应的H5插件发送至蓝图端。
在前文已经介绍,H5Page起到数据传输的作用,将H5Widget接收到的消息传输给H5页面PluginManager,而在实际应用中,还可以在H5Page中封装针对H5页面的渲染组件,提供针对H5页面的渲染功能,比如该渲染组件可以是Unreal平台提供的SWebBrowser组件,可以对H5页面进行渲染,也即在一种实施方式中,本方法还可以包括:利用H5页面单元中的H5页面组件,对接收到的H5页面进行渲染。
根据上文的介绍,为了实现H5服务单元、H5会话单元、H5页面单元这一处理优先顺序,当H5页面单元中的H5Widget接收到Blueprint端发送来的消息后,可以暂不处理,而是通过消息冒泡,传输至最上层即H5服务单元中,并通过消息捕获,由上至下进行处理。但在实际应用中,由于每个H5单元均可以有处理消息的能力,所以在一种实施方式中,也可以在通过应用的H5页面单元中的消息接收组件接收来自应用的Blueprint端的消息后,依次按照H5页面单元、H5会话单元、以及H5服务单元中H5插件对于该消息的处理能力,通过H5插件对该消息中未处理部分进行处理。
具体地,在通过H5页面单元中的H5Widget接收到来自Blueprint端发来的消息后,就可以先由H5页面PluginManager轮询H5页面单元中各个H5页面Plugin是否具备处理该消息中未处理部分的能力,若是,则由对应的H5页面Plugin处理消息中的未处理部分。
此后,可以将H5页面Plugin无法处理的消息通知H5会话PluginManager,并继续由H5会话PluginManager轮询H5会话单元中各个H5会话Plugin是否具有具备处理该消息中未处理部分的能力,若是,则由对应的H5会话Plugin继续对消息中未处理部分进行处理。
类似地,可以继续将H5会话Plugin无法处理的消息通知H5服务PluginManager,并继续由H5服务PluginManager轮询H5服务单元中各个H5服务Plugin是否具有具备处理该消息中未处理部分的能力,若是,则由对应的H5服务Plugin对消息中未处理部分进行处理。此后,也可以将消息的处理结果,通过对应的H5插件发送至Native端或Blueprint端。
而在实际应用中,H5服务单元,也可以接收到来自H5页面端的消息,比如在实际应用中,可以在H5页面中触发某个指令,通过改变H5页面显示的2D页面的数据,而改变3D场景。所以H5服务单元中的H5服务PluginManager也可以接收到来自H5页面端的消息,并通过类似于消息捕获的方式,依次按照H5服务单元、H5会话单元、以及H5页面单元中各自的H5插件对于该消息的处理能力,通过该各自的H5插件对该消息中未处理部分进行处理。
由以上实施例提供的技术方案可见,通过应用的H5页面单元中的消息接收组件接收Blueprint端的消息,并依次传输至H5会话单元、以及H5服务单元,再依次根据H5服务单元、H5会话单元、以及H5页面单元中各自的H5插件对接收的消息的处理能力,对该消息中未处理部分进行处理。从而能够使消息的整个处理流程变得更加灵活,以便开发者可以根据项目的实际情况,在消息传递的不同阶段进行相应的处理,进而实现较好地处理H5页面端和Blueprint端的交互的消息,以便较好地支持2D页面和3D场景的协同演示。
实施例2
基于相同的构思,本说明书实施例2提供了一种针对Blueprint的消息处系统,能够较好地处理H5页面端和Blueprint端的交互的消息,以便较好地支持2D页面和3D场景的协同演示。该系统的结构示意图如图4所示,包括:应用中的H5服务单元202、H5会话单元204、H5页面单元206、以及蓝图端208,其中,
H5页面单元206,可以用于:
通过消息接收组件接收来自Blueprint端208的消息,其中,该消息接收组件可以用于H5页面端与Blueprint端208进行消息传递;
将消息传输至H5会话单元204;
以及按照H5页面单元206中H5页面插件对于接收到的消息的处理能力,通过该H5页面插件对H5会话单元204处理完后的消息中未处理部分进行处理;
H5会话单元204,可以用于:
创建H5页面单元206;
将消息传输至H5服务单元202;
以及按照H5会话单元204中H5会话插件对于接收到的消息的处理能力,通过该H5会话插件对H5服务单元202处理完后的消息中未处理部分进行处理;
H5服务单元202,可以用于:
创建H5会话单元204;
以及按照H5服务单元202中H5服务插件对于接收到的消息的处理能力,通过该H5服务插件对该消息进行处理。
在一种实施方式中,
H5页面单元206,可以用于:
按照H5页面单元206中H5页面插件对于接收到的消息数量的处理能力,通过该H5页面插件对H5会话单元204处理完后的消息中未处理部分进行处理;
H5会话单元204,可以用于:
按照H5会话单元204中H5会话插件对于接收到的消息数量的处理能力,通过该H5会话插件对H5服务单元202处理完后的消息中未处理部分进行处理;
H5服务单元202,可以用于:
按照H5服务单元202中H5服务插件对于接收到的消息数量的处理能力,通过该H5服务插件对该消息进行处理。
在一种实施方式中,
H5页面单元206还可以用于:将H5页面插件对消息的处理结果,通过该H5页面插件发送至本地Native端;
H5会话单元204还可以用于:将H5会话插件对消息的处理结果,通过该H5会话插件发送至本地Native端;
H5服务单元202还可以用于:将H5服务插件对消息的处理结果,通过该H5服务插件发送至本地Native端。
在一种实施方式中,H5页面单元206,还用于:
利用H5页面单元206中的H5页面组件,对接收到的H5页面进行渲染。
在一种实施方式中,
H5服务单元202、H5会话单元204、以及H5页面单元206中,均可以包含各自的H5插件管理器,该各自的H5插件管理器可以用于将接收到的消息中未处理部分路由到各自对应的H5插件进行处理。
在一种实施方式中,该H5插件可以由本地Native端代码或Blueprint端代码进行定义。
在一种实施方式中,
H5服务单元202可以是应用中的唯一实例,可以控制一个或多个H5会话单元204的生命周期。
在一种实施方式中,
该应用中的H5会话单元204可以共享H5服务单元202内存储的数据;
该应用中的H5页面单元206可以共享H5服务单元202内存储的数据。
在一种实施方式中,
一个H5会话单元204可以控制一个或多个H5页面单元206的生命周期。
在一种实施方式中,
H5会话单元204控制的H5页面单元206可以共享H5会话单元204内存储的数据。
其中,H5会话单元204可以对应一个或多个H5窗口,一个H5窗口可以用于启动一个或多个H5页面单元206,该H5页面单元206可以对应H5页面。
在一种实施方式中,可以采用JSon数据格式,对消息进行传输。
在一种实施方式中,Blueprint端,可以采用Unreal平台提供的UStruct数据类型发送消息。
在一种实施方式中,该系统可以应用于基于虚幻引擎开发的应用中。
由以上实施例提供的装置可见,通过应用的H5页面单元中的消息接收组件接收Blueprint端的消息,并依次传输至H5会话单元、以及H5服务单元,再依次根据H5服务单元、H5会话单元、以及H5页面单元中各自的H5插件对接收的消息的处理能力,对该消息中未处理部分进行处理。从而能够使消息的整个处理流程变得更加灵活,以便开发者可以根据项目的实际情况,在消息传递的不同阶段进行相应的处理,进而实现较好地处理H5页面端和Blueprint端的交互的消息,以便较好地支持2D页面和3D场景的协同演示。
图5是本说明书的一个实施例电子设备的结构示意图。在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成针对Blueprint的消息处理装置。处理器,执行存储器所存放的程序,并具体用于执行以下操作:
通过应用的H5页面单元中的消息接收组件接收来自所述应用的Blueprint端的消息,所述消息接收组件用于H5页面端与Blueprint端进行消息传递;
将所述消息按顺序依次传输至H5会话单元、以及H5服务单元;
依次按照所述H5服务单元、所述H5会话单元、以及所述H5页面单元中各自的H5插件对于所述消息的处理能力,通过所述各自的H5插件对所述消息中未处理部分进行处理。
上述如本说明书图4所示实施例提供的针对Blueprint的消息处理装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(CentralProcessing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific IntegratedCircuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本说明书实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
结合本说明书实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
该电子设备还可执行图4所示实施例提供的针对Blueprint的消息处理装置在图5所示实施例的功能,本说明书实施例在此不再赘述。
本说明书实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的电子设备执行时,能够使该电子设备执行图4所示实施例中针对Blueprint的消息处理装置执行的方法,并具体用于执行:
通过应用的H5页面单元中的消息接收组件接收来自所述应用的Blueprint端的消息,所述消息接收组件用于H5页面端与Blueprint端进行消息传递;
将所述消息按顺序依次传输至H5会话单元、以及H5服务单元;
依次按照所述H5服务单元、所述H5会话单元、以及所述H5页面单元中各自的H5插件对于所述消息的处理能力,通过所述各自的H5插件对所述消息中未处理部分进行处理。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本说明书的实施例可提供为方法、系统、或计算机程序产品。因此,本说明书可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本说明书的实施例可提供为方法、系统或计算机程序产品。因此,本说明书可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本说明书的实施例而已,并不用于限制本说明书。对于本领域技术人员来说,本说明书可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书的权利要求范围之内。