具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参见图2,为本发明实施例提供的渲染方法的第一种实施方式方法流程图,本实施例中,执行线程的工作内容包括:执行JS代码生成渲染命令组;将所述渲染命令组写入预设队列的空闲帧,并执行下一次计算,重复上述步骤;渲染线程的工作内容包括:从所述预设队列按顺序读取已经写入渲染命令组的可用帧;根据读取的所述可用帧中的渲染命令组进行渲染,并重复执行下一次读取。其中,预设队列为执行线程与渲染所共用,使得执行线程与渲染线程形成两个独立的工作线程。
为了使本发明方案更加清楚,下面对本发明的方案按照步骤进行描述。参见图3,为本发明实施例提供的渲染方法的第二种实施方式方法流程图。所述方法包括:
步骤S101:执行线程执行JS代码生成渲染命令组。
用户进入游戏后,执行线程执行预先写入的程序,并生成渲染命令组。其中,根据游戏所处的运行状态的不同,渲染命令组可以包含一个渲染命令也可以包含多个渲染命令。例如,进入游戏时,执行线程根据用户的需求执行特定的程序段,所生成的渲染命令组包含一组渲染命令;当进入游戏后,游戏场景包含多个需要渲染的部分,每个需要渲染的部分对应一个渲染命令,此时,每个渲染命令组中包含多个渲染命令。渲染命令的数量根据游戏的不同而不同,本发明对此不做限制。
步骤S102:将渲染命令组写入预设队列的空闲帧中。
为了便于实现执行线程与渲染线程独立工作,X-Canvas引擎被激活后,创建一个可以容纳渲染命令组的队列,本发明中将其命名为预设队列。执行线程与渲染线程共用该预设队列。执行线程将所生成的渲染命令组写入该预设队列的空闲帧中,以便于渲染线程读取渲染命令组,并根据渲染命令组进行渲染。
需要指出的,由于执行线程和渲染线程的工作相对独立,为了提高渲染效率,执行线程将渲染命令组写入预设队列的空闲帧之后,向渲染线程发出通知,以便于渲染线程接收到通知后,进行下一步工作。此外,预设队列可以容纳至少一个帧,当预设队列容纳一个帧时,执行线程生成一个渲染命令组后,将渲染命令组写入该帧中,以便于渲染线程从该帧中读取渲染命令组;当预设队列可以容纳多个帧时,执行线程生成第一个渲染命令组并写入空闲帧后,执行线程继续执行程序生成第二个渲染命令组,按顺序写入预设队列的下一个空闲帧中,没有空闲帧,则等待。
步骤S103:渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧。
在执行线程将渲染命令组写入预设队列之后,渲染线程从预设队列中按顺序读取已经写入渲染命令组的可用帧。渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧时,若发现没有可用帧,则重复执行上一渲染操作,在重复上一次渲染操作完成后,回到循环的开始进入等待。
当预设队列容纳多个帧时,为了顺应游戏的运行过程,执行线程生成并向队列中写入渲染命令组时按照一定的顺序执行,因此,渲染线程读取已经写入渲染命令组的可用帧时也应当遵循该顺序,即读取已经写入渲染命令组的可用帧时遵循先入先出原则。
步骤S104:根据读取的所述可用帧中的渲染命令组进行渲染。
其中,本发明实施例中进行渲染包括根据图像绘制命令、图形绘制命令、文字绘制命令、绘图环境设置命令等进行渲染。例如,在进入游戏前,根据用户的选择对角色装饰的渲染及角色使用的工具的渲染;进入游戏后,随着游戏的进行,对游戏场景颜色的不断渲染,以及对角色所处的状态的渲染等。本发明中对游戏的渲染根据游戏不同而不同,本发明对此不做限制,同时,由于游戏渲染技术为本领域技术人员所熟知的技术,本发明在此不再赘述。
其中,在根据读取的可用帧中的渲染命令组进行渲染后,渲染线程将被读取的可用帧标识为空闲帧,这样使得执行线程执行写入操作时,判断出空闲帧(即原来被占用的帧变为空闲可写入),则将生成的渲染命令组按覆盖的方式写入。
由上述实施例可知,本发明实施例所提供的游戏引擎渲染方法,首先,执行线程执行JS代码生成渲染命令组,将所述渲染命令组写入预设队列的空闲帧中,将渲染命令组写入预设队列的空闲帧中,而渲染线程从预设队列按顺序读取已经写入渲染命令组的可用帧,根据读取的可用帧中的渲染命令组进行渲染。由此可见,本发明所提供的技术方案通过设置预设队列,使执行线程与渲染线程分别作为两个独立的执行线程,两部分执行线程的执行很少受对方执行进程的限制,因此,缩短了游戏引擎的程序的循环周期,提高了渲染效率。
在上述实施例的基础上,为了使本领域技术人员更加清楚的理解本方案,本发明更具体的描述了该渲染方法。参见图4,为本发明实施例提供的渲染方法的第三种实施方式方法流程图。该实施方式中,预设队列含有N个帧,N是一个可变量(N大于0)。本发明可以优选N为3。
所述方法包括:
步骤S201:执行线程执行JS代码生成渲染命令组。
其中,执行线程根据游戏所处的不同状态执行不同的程序段,所生成的渲染命令组也不相同,具体操作在上述实施例中已进行描述,本发明此处不再赘述。
步骤S202:判断所述预设队列是否有空闲帧,若是,执行步骤S203;若否,执行步骤S204。
由上述实施例可知,当预设队列容纳一个帧时,执行线程生成第一个渲染命令组后,将该渲染命令组写入该帧中,渲染线程从该帧读取渲染命令组,并根据所述渲染命令组进行图像渲染。由于预设队列为执行线程与渲染线程所共用,因此,当渲染线程完成渲染后,执行线程才能将所生成的第二个渲染命令组写入该帧中。为了提高渲染效率,当预设队列设置有多个帧时,执行线程生成第一个渲染命令组后,写入预设队列的第一个空闲帧,执行线程每生成一个渲染命令组,便顺次写入下一个空闲帧。
执行线程每生成一个新的渲染命令组,指针向下移动一个帧,以便于将新的渲染命令组写入该帧中。当预设队列的最后一个帧中写入渲染命令组后,前面的帧已经被渲染线程读取渲染命令组执行渲染后变成空闲帧,因此,指针再次指向前面的第一个空闲帧,并随着执行线程不断生成新的渲染命令组,重复执行上述过程。
步骤S203:将所述渲染命令组写入空闲帧中。
步骤S204:没有空闲帧,则执行线程等待(即停止写入操作)。
步骤S205:渲染线程判断所述预设队列是否有被写入渲染命令组的可用帧,若是,执行步骤S207;否则,执行步骤S206。
当预设队列仅能容纳一个帧时,直接对该帧进行判断。预设队列能容纳至少两个帧以上时,由上述描述可知,渲染命令组的写入和读取遵循先进先出的原则,因此,渲染线程读取第一个渲染命令组时,指针指向预设队列的第一个帧。
需要说明的是,如果一个帧,正被写入渲染命令组,属于正在被使用,此时不是可用帧;或者,如果一个帧,正在被渲染线程获取其中的渲染命令组,也属于正在被使用,此时也不是可用帧。即,本实施例说的可用帧,指渲染命令组已经被执行线程完成写入操作,并且没有正在被渲染线程调用。
步骤S206:没有被写入渲染命令组的可用帧,重复上一渲染操作,在重复上一次渲染操作完成后,回到循环的开始进入等待。
步骤S207:读取被写入渲染命令组的可用帧中的渲染命令组。
步骤S208:按照所述渲染命令组进行渲染。
步骤S206、步骤S207、步骤S208的实施方式与上述实施例相同,本发明在此不再赘述。
步骤S209:渲染线程将被读取的可用帧标识为空闲帧。
在根据读取的可用帧中的渲染命令组进行渲染后,渲染线程将被读取的可用帧标识为空闲帧,这样使得执行线程执行写入操作时,判断出空闲帧(即原来被占用的帧变为空闲可写入),则将生成的渲染命令组按覆盖的方式写入。
本实施例所述的方法,预设队列能够容纳至少两个帧,由于预设队列为执行线程与渲染线程所共用,当设置有多个帧时,执行线程与渲染线程能够同时工作,相互之间较少受到对方工作进程的牵制,提高了双线程渲染的工作效率。
需要指出的,在本发明中,执行线程可以生成两类命令:同步接口命令和异步接口命令。同步接口命令指根据用户的特定需求,需要渲染线程实时反馈数据的命令;异步接口命令指渲染线程无须实时执行的命令。同步接口命令包括获取图像数据命令,异步接口命令包括根据游戏进程对游戏画面进行渲染的一系列命令,如,图像渲染命令。与两种性质不同的命令相对应,渲染线程包括渲染模式和获取图像数据模式两种不同的执行模式,能够对应不同性质的命令进行切换。为了使本领域技术人员对本发明有更好的理解,下面通过两个具体示例分别对这两种命令进行详细描述。
如图5所示,为本发明提供的双线程渲染方式的第一示例图。在本实施例中,以获取图像数据命令为例进行描述。步骤一,执行线程根据用户的请求信息执行特定的JS程序段生成获取图像数据命令。由于执行线程不具备获取图像数据的执行平台,所以需要将获取图像数据命令传送给渲染线程。步骤二,将获取图像数据命令写入预设队列,并通知渲染线程,以便于渲染线程将执行模式切换为获取图像数据模式,然后执行线程进入休眠,等待结果。在本实施例中,预设队列可以为一个用于存储获取图像数据命令的位置变量,比如可以定义为“arg”。步骤三,渲染线程将执行模式切换后,读取“arg”中的获取图像数据命令,并执行该命令,生成一个结果数据,并将结果数据写入预设队列。本实施例中,可以将写入结果数据的位置定义为“result”。步骤四,执行线程从“result”中读取该结果数据,并将结果数据返回调用者,以便于调用者在终端上进行显示。
当然,上述仅以获取图像数据命令为例进行描述,同步接口命令还可以为其他命令,其渲染方法与上述描述相似,本发明在此不再赘述。
上述为本发明渲染方法中执行线程生成同步接口命令的方法,然而,当进入游戏后,随着游戏的运行,游戏场景不断变化,此时执行线程生成的是异步接口命令。
参见图6,为本发明提供的双线程渲染方式的第二示例图。进入游戏后,X-Canvas引擎激活,为了满足游戏场景的不断变化,进一步提高渲染效率,可以将预设队列创建为可以容纳N(N大于等于2)个帧的N重队列。N为多少可以根据不同游戏进行不同的设置,本发明对此不做限制。
本实施例中以3重队列为例对具体的渲染过程进行描述。随着游戏的运行,游戏场景不断变化,执行线程不断的生成渲染命令组。当执行线程生成一个渲染命令组后,指针从预设队列的上一个位置帧移动到当前帧。此处,上一个位置帧指该渲染命令组之前的渲染命令组所写入的帧。判断当前帧是否为空闲帧,若当前帧为空闲帧时,将渲染命令组写入该当前帧中;若当前帧不为空闲帧时,执行线程等待,直到当前帧为空闲帧时将渲染命令组写入当前帧。执行线程将渲染命令组写入当前帧后,指针顺次向后移动,指向当前帧的下一帧,执行线程进入下一次计算,生成新的渲染命令组,并重复执行上述过程。
与此同时,在执行线程写入第一个渲染命令组并通知渲染线程后,渲染线程开始执行读取渲染命令组,并根据所读取的渲染命令组进行渲染的步骤。渲染线程完成一次渲染后,指针从预设队列的上一个位置帧移动到当前位置帧,判断当前位置帧中是否是含有被写入渲染命令组的可用帧,若是,读取渲染命令组,并根据渲染命令组进行渲染,完成渲染后,将该可用帧标识为空闲帧,并指向下一个帧,重复执行上述过程;若否,重复执行上一渲染操作,在重复上一次渲染操作完成后,回到循环的开始进入等待。
其中,渲染命令组包括M个渲染命令,每个渲染命令对应游戏的一个部分,例如,渲染命令1对应游戏角色的服饰颜色,渲染命令2对应角色所在的位置,渲染命令M对应角色所处的环境的颜色。执行线程生成渲染命令组时,按照一定次序逐个生成渲染命令,并且每生成一个渲染命令便向预设队列相应的帧中写入一个渲染命令。渲染线程读取渲染命令的顺序与执行线程写入是的顺序相同,本发明此处不再赘述。
需要指出的,当上一个帧为预设队列的第三个帧时,指针移动到预设队列的第一个帧,并将第一个帧作为当前帧,当完成对当前帧的操作后,指针移动到当前帧的下一帧,即预设队列的第二个帧,并重复上述的执行过程,当完成对预设队列的第二帧的操作后,指针再次指向预设队列的最后一个帧。
X-Canvas引擎主要用于游戏中,在程序执行时,由于JS逻辑比较复杂,执行线程与渲染线程相比,执行耗时相对较长,执行线程的执行耗时是渲染线程执行耗时的4到5倍。假设执行线程的执行耗时为Lms,渲染线程的执行耗时为Gms,单线程执行模式的每秒传输帧数(Frames Per Second,FPS)的计算公式为:FPS_S=1000/(L+G),使用该发明所提供的双线程执行模式的FPS_M=1000/(L),提升的幅度为P=FPS_M-FPS_S)/FPS_S=G/L。
以在小米2S手机上正常流畅的运行的九游棋牌大厅3.0版主界面为例,得出如下比较结果:
由上述数据表明,本发明的双线程执行模式的运行效率比现有的单线程执行方法提高了(5400-4400)/4400=22%。
当然,上述仅仅为基于本发明方案的一个优选示例,对本发明不造成任何限制,如,所创建的队列可以根据不同需求进行不同设置,又如,针对其他游戏引擎,也可以进行与游戏引擎相适应的处理,本发明对此不做限制。
此外,X-Canvas不仅适用于Android平台,也适用于IOS及WP8运行平台,本发明在此不再赘述。
由以上描述可知,本发明实施例所提供的游戏引擎渲染方法,首先,执行线程执行JS代码生成渲染命令组,将渲染命令组写入预设队列的空闲帧中,而渲染线程从预设队列按顺序读取已经写入渲染命令组的可用帧,根据读取的可用帧中的渲染命令组进行渲染。由此可见,本发明所提供的技术方案通过设置预设队列,使执行线程与渲染线程分别作为两个独立的执行线程,两部分执行线程的执行很少受对方执行进程的限制,因此,缩短了游戏引擎的程序的循环周期,提高了渲染速度,也提高了渲染效率。
与上述实现方法相对应的,本发明实施例还提供了一种渲染装置,如图7所示,为本发明实施例提供的渲染装置的第一种实施方式结构示意图。
所述装置包括:生成单元11、写入单元12、读取单元13和渲染单元14。其中,所述生成单元11,用于执行线程执行JS代码生成渲染命令组;所述写入单元12,用于将所述渲染命令组写入预设队列的空闲帧中;所述读取单元13,用于从所述预设队列按顺序读取已经写入渲染命令组的可用帧;所述渲染单元14,用于根据所述读取单元13读取的所述可用帧中的渲染命令组进行渲染。
所述装置中各个单元的功能和作用的实现过程详见上述方法中对应的实现过程,在此不再赘述。
本发明实施例所提供的游戏引擎渲染装置,首先,执行线程执行JS代码生成渲染命令组,将渲染命令组写入预设队列的空闲帧中,而渲染线程从预设队列按顺序读取已经写入渲染命令组的可用帧,根据读取的可用帧中的渲染命令组进行渲染。由此可见,本发明所提供的技术方案通过设置预设队列,使执行线程与渲染线程分别作为两个独立的执行线程,两部分执行线程的执行很少受对方执行进程的限制,因此,缩短了游戏引擎的程序的循环周期,提高了渲染速度,也提高了渲染效率。
在上述实施例的基础上,参见图8,为本发明实施例提供的渲染装置的第二种实施方式结构示意图。
所述装置包括:生成单元21、判断单元22、写入单元24、通知单元25、读取单元26、渲染单元27和标识单元28,其中,所述生成单元21、所述写入单元24、所述读取单元26和所述渲染单元27的功能和作用与上述实施例相似,本发明在此不再赘述。
所述判断单元22,用于判断所述预设队列是否有空闲帧;所述写入单元24在所述预设队列有空闲帧时,一直执行将所述渲染命令组写入预设队列的空闲帧的步骤;在所述预设队列无空闲帧时,执行等待;所述通知单元25,用于当所述写入单元24将所述渲染命令组写入预设队列的空闲帧中后,通知渲染线程;所述标识单元28,用于在所述渲染单元完成渲染之后,将所述被读取的可用帧标识为空闲帧,以便于所述写入单元24将生成的渲染命令组按覆盖的方式写入。
在上述实施例的基础上,本实施例中,所述读取单元26,用于根据所述通知单元25的通知从所述预设队列按顺序读取已经写入渲染命令组的可用帧,具体是从所述预设队列按先入先出的顺序读取已经写入渲染命令组的可用帧。
所述装置中各个单元的功能和作用的实现过程详见上述方法中对应的实现过程,在此不再赘述。
本实施例所提供的装置,通过将预设队列设置为可以容纳多个帧的队列,进一步提高了渲染效率。
综上所述,本发明实施例所提供的游戏引擎渲染方法及装置,首先,执行线程执行JS代码生成渲染命令组,将渲染命令组写入预设队列的空闲帧中,而渲染线程从预设队列按顺序读取已经写入渲染命令组的可用帧,根据读取的可用帧中的渲染命令组进行渲染。由此可见,本发明所提供的技术方案通过设置预设队列,使执行线程与渲染线程分别作为两个独立的执行线程,两部分执行线程的执行很少受对方执行进程的限制,因此,缩短了游戏引擎的程序的循环周期,提高了渲染速度,也提高了渲染效率。
可以理解的是,本发明可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本发明的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。