一种游戏引擎渲染方法及装置制造方法

文档序号:6539019阅读:240来源:国知局
一种游戏引擎渲染方法及装置制造方法
【专利摘要】本发明公开了一种游戏引擎渲染方法。所述游戏引擎渲染方法包括:执行线程执行JS代码生成渲染命令组;将所述渲染命令组写入预设队列的空闲帧中;渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧;根据读取的所述可用帧中的渲染命令组进行渲染。本发明还相应公开了一种游戏引擎渲染装置。本发明实施例所提供的游戏引擎渲染方法及装置,通过设置预设队列,使执行线程与渲染线程分别作为两个独立的执行线程,两部分执行线程的执行很少受对方执行进程的限制,因此,缩短了游戏引擎的程序的循环周期,提高了渲染速度,也提高了渲染效率。
【专利说明】一种游戏引擎渲染方法及装置
【技术领域】
[0001]本发明涉及移动通信【技术领域】,更具体而言,涉及一种游戏引擎渲染方法及装置。【背景技术】
[0002]作为一款第五代超文本标记语言(HyperText Markup Language5, HTML5)游戏引擎,X-Canvas广泛应用于移动终端的游戏开发中,其工作流程包括JS (JavaScript脚本语言)执行部分和图像渲染部分。当进入游戏后,X-Canvas引擎被激活,开始执行JS程序。如图1所示,步骤S001,执行JS代码。JS执行部分通过执行JS代码生成一组渲染命令,这组渲染命令可以包括图像绘制命令、图形绘制命令、文字绘制命令及绘图环境设置命令,也可以包括采集图像数据的命令;步骤S002,执行渲染。执行渲染命令组所指定的操作,在步骤S002执行,步骤SOOl进入等待,当步骤S002的渲染过程执行完成后,程序进入下一轮运行,步骤SOOl的JS执行部分进入下一组渲染命令的计算。
[0003]可以发现,X-Canvas采用单线程程序执行模式,所述单线程程序执行模式是指,程序的执行路径是以时间为顺序的串行结构。也就是说,在X-Canvas的程序执行过程中,图像渲染部分必须在JS执行部分执行完成后才能开始执行,而JS执行部分在完成一次计算后,需要等待图像渲染部分执行完成后,才能进行下一次计算。因此,导致游戏引擎的程序循环周期过长,渲染效率过低。

【发明内容】

[0004]有鉴于此,本发明实施例提供一种游戏引擎渲染方法及装置,能够缩短程序的循环周期,提高渲染效率。
[0005]第一方面,本发明实施例提供了一种游戏引擎渲染方法,所述方法包括:执行线程执行JS代码生成渲染命令组;将所述渲染命令组写入预设队列的空闲帧中;渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧;根据读取的所述可用帧中的渲染命令组进行渲染。
[0006]在第一方面的第一种可能的实现方式中,将所述渲染命令组写入预设队列的空闲帧中之前包括:判断所述预设队列是否有空闲帧;若是,一直执行将所述渲染命令组写入预设队列的空闲帧的步骤,若否,则等待。
[0007]结合第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,将所述渲染命令组写入预设队列的空闲帧中之后包括:执行线程通知渲染线程;渲染线程根据所述通知执行从所述预设队列按顺序读取已经写入渲染命令组的可用帧的步骤。
[0008]结合第一方面或第一方面的第一种或第二种可能的实现方式,在第三种可能的实现方式中,所述渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧包括:渲染线程从所述预设队列按先入先出的顺序读取已经写入渲染命令组的可用帧。
[0009]结合第一方面或第一方面的第一种或第二种或第三种可能的实现方式,在第四种可能的实现方式中,所述渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧时,若发现没有可用帧,则重复执行上一渲染操作。[0010]结合第一方面或第一方面的第一种或第二种或第三种或第四种可能的实现方式,在第五种可能的实现方式中,所述根据读取的可用帧中的渲染命令组进行渲染后,所述渲染线程将所述被读取的可用帧标识为空闲帧,使得所述执行线程执行写入操作时将生成的渲染命令组按覆盖的方式写入。
[0011]第二方面,本发明实施例还提供了一种游戏引擎渲染装置,所述装置包括:生成单元,用于执行线程执行JS代码生成渲染命令组;写入单元,用于将所述渲染命令组写入预设队列的空闲帧中;读取单元,用于从所述预设队列按顺序读取已经写入渲染命令组的可用帧;渲染单元,用于根据所述读取单元读取的所述可用帧中的渲染命令组进行渲染。
[0012]在第二方面的第一种可能的实现方式中,所述装置还包括:判断单元,其中,所述判断单元,用于判断所述预设队列是否有空闲帧;所述写入单元在所述预设队列有空闲帧时,一直执行将所述渲染命令组写入预设队列的空闲帧的步骤;在所述预设队列无空闲帧时,执行等待。
[0013]结合第二方面及第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述装置还包括,通知单元,其中,所述通知单元,用于当所述写入单元将所述渲染命令组写入预设队列的空闲帧中后,通知渲染线程。
[0014]结合第二方面及第二方面的第一种或第二种可能的实现方式,在第三种可能的实现方式中,所述装置还包括标识单元,所述标识单元,用于在所述渲染单元完成渲染之后,将所述被读取的可用帧标识为空闲帧,以便于所述写入单元将生成的渲染命令组按覆盖的方式写入。
[0015]由以上技术方案可知,本发明实施例所提供的游戏引擎渲染方法及装置,首先,执行线程执行JS代码生成渲染命令组,将渲染命令组写入预设队列的空闲帧中,而渲染线程从预设队列按顺序读取已经写入渲染命令组的可用帧,根据读取的可用帧中的渲染命令组进行渲染。由此可见,本发明所提供的技术方案通过设置预设队列,使执行线程与渲染线程分别作为两个独立的执行线程,两部分执行线程的执行很少受对方执行进程的限制,因此,缩短了游戏引擎的程序的循环周期,提高了渲染速度,也提高了渲染效率。
【专利附图】

【附图说明】
[0016]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。通过附图所示,本发明的上述及其它目的、特征和优势将更加清晰。在全部附图中相同的附图标记指示相同的部分。并未刻意按实际尺寸等比例缩放绘制附图,重点在于示出本发明的主旨。
[0017]图1为本发明实施例提供的现有的渲染方法流程图;
[0018]图2为本发明实施例提供的渲染方法的第一种实施方式方法流程图;
[0019]图3为本发明实施例提供的渲染方法的第二种实施方式方法流程图;
[0020]图4为本发明实施例提供的渲染方法的第三种实施方式方法流程图;
[0021]图5为本发明提供的双线程渲染方式的第一示例图;
[0022]图6为本发明提供的双线程渲染方式的第二示例图;[0023]图7为本发明实施例提供的渲染装置的第一种实施方式结构示意图;
[0024]图8为本发明实施例提供的渲染装置的第二种实施方式结构示意图。
【具体实施方式】
[0025]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0026]参见图2,为本发明实施例提供的渲染方法的第一种实施方式方法流程图,本实施例中,执行线程的工作内容包括:执行JS代码生成渲染命令组;将所述渲染命令组写入预设队列的空闲帧,并执行下一次计算,重复上述步骤;渲染线程的工作内容包括:从所述预设队列按顺序读取已经写入渲染命令组的可用帧;根据读取的所述可用帧中的渲染命令组进行渲染,并重复执行下一次读取。其中,预设队列为执行线程与渲染所共用,使得执行线程与渲染线程形成两个独立的工作线程。
[0027]为了使本发明方案更加清楚,下面对本发明的方案按照步骤进行描述。参见图3,为本发明实施例提供的渲染方法的第二种实施方式方法流程图。所述方法包括:
[0028]步骤SlOl:执行线程执行JS代码生成渲染命令组。
[0029]用户进入游戏后,执行线程执行预先写入的程序,并生成渲染命令组。其中,根据游戏所处的运行状态的不同,渲染命令组可以包含一个渲染命令也可以包含多个渲染命令。例如,进入游戏时,执行线程根据用户的需求执行特定的程序段,所生成的渲染命令组包含一组渲染命令;当进入游戏后,游戏场景包含多个需要渲染的部分,每个需要渲染的部分对应一个渲染命令,此时,每个渲染命令组中包含多个渲染命令。渲染命令的数量根据游戏的不同而不同,本发明对此不做限制。
[0030]步骤S102:将渲染命令组写入预设队列的空闲帧中。
[0031]为了便于实现执行线程与渲染线程独立工作,X-Canvas引擎被激活后,创建一个可以容纳渲染命令组的队列,本发明中将其命名为预设队列。执行线程与渲染线程共用该预设队列。执行线程将所生成的渲染命令组写入该预设队列的空闲帧中,以便于渲染线程读取渲染命令组,并根据渲染命令组进行渲染。
[0032]需要指出的,由于执行线程和渲染线程的工作相对独立,为了提高渲染效率,执行线程将渲染命令组写入预设队列的空闲帧之后,向渲染线程发出通知,以便于渲染线程接收到通知后,进行下一步工作。此外,预设队列可以容纳至少一个帧,当预设队列容纳一个帧时,执行线程生成一个渲染命令组后,将渲染命令组写入该帧中,以便于渲染线程从该帧中读取渲染命令组;当预设队列可以容纳多个帧时,执行线程生成第一个渲染命令组并写入空闲帧后,执行线程继续执行程序生成第二个渲染命令组,按顺序写入预设队列的下一个空闲帧中,没有空闲帧,则等待。
[0033]步骤S103:渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧。
[0034]在执行线程将渲染命令组写入预设队列之后,渲染线程从预设队列中按顺序读取已经写入渲染命令组的可用帧。渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧时,若发现没有可用帧,则重复执行上一渲染操作,在重复上一次渲染操作完成后,回到循环的开始进入等待。
[0035]当预设队列容纳多个帧时,为了顺应游戏的运行过程,执行线程生成并向队列中写入渲染命令组时按照一定的顺序执行,因此,渲染线程读取已经写入渲染命令组的可用帧时也应当遵循该顺序,即读取已经写入渲染命令组的可用帧时遵循先入先出原则。
[0036]步骤S104:根据读取的所述可用帧中的渲染命令组进行渲染。
[0037]其中,本发明实施例中进行渲染包括根据图像绘制命令、图形绘制命令、文字绘制命令、绘图环境设置命令等进行渲染。例如,在进入游戏前,根据用户的选择对角色装饰的渲染及角色使用的工具的渲染;进入游戏后,随着游戏的进行,对游戏场景颜色的不断渲染,以及对角色所处的状态的渲染等。本发明中对游戏的渲染根据游戏不同而不同,本发明对此不做限制,同时,由于游戏渲染技术为本领域技术人员所熟知的技术,本发明在此不再赘述。
[0038]其中,在根据读取的可用帧中的渲染命令组进行渲染后,渲染线程将被读取的可用帧标识为空闲帧,这样使得执行线程执行写入操作时,判断出空闲帧(即原来被占用的帧变为空闲可写入),则将生成的渲染命令组按覆盖的方式写入。
[0039]由上述实施例可知,本发明实施例所提供的游戏引擎渲染方法,首先,执行线程执行JS代码生成渲染命令组,将所述渲染命令组写入预设队列的空闲帧中,将渲染命令组写入预设队列的空闲帧中,而渲染线程从预设队列按顺序读取已经写入渲染命令组的可用帧,根据读取的可用帧中的渲染命令组进行渲染。由此可见,本发明所提供的技术方案通过设置预设队列,使执行线程与渲染线程分别作为两个独立的执行线程,两部分执行线程的执行很少受对方执行进程的限制,因此,缩短了游戏引擎的程序的循环周期,提高了渲染效率。
[0040]在上述实施例的基础上,为了使本领域技术人员更加清楚的理解本方案,本发明更具体的描述了该渲染方法。参见图4,为本发明实施例提供的渲染方法的第三种实施方式方法流程图。该实施方式中,预设队列含有N个巾贞,N是一个可变量(N大于O)。本发明可以优选N为3。
[0041]所述方法包括:
[0042]步骤S201:执行线程执行JS代码生成渲染命令组。
[0043]其中,执行线程根据游戏所处的不同状态执行不同的程序段,所生成的渲染命令组也不相同,具体操作在上述实施例中已进行描述,本发明此处不再赘述。
[0044]步骤S202:判断所述预设队列是否有空闲帧,若是,执行步骤S203 ;若否,执行步骤 S204。
[0045]由上述实施例可知,当预设队列容纳一个帧时,执行线程生成第一个渲染命令组后,将该渲染命令组写入该帧中,渲染线程从该帧读取渲染命令组,并根据所述渲染命令组进行图像渲染。由于预设队列为执行线程与渲染线程所共用,因此,当渲染线程完成渲染后,执行线程才能将所生成的第二个渲染命令组写入该帧中。为了提高渲染效率,当预设队列设置有多个帧时,执行线程生成第一个渲染命令组后,写入预设队列的第一个空闲帧,执行线程每生成一个渲染命令组,便顺次写入下一个空闲帧。
[0046]执行线程每生成一个新的渲染命令组,指针向下移动一个帧,以便于将新的渲染命令组写入该帧中。当预设队列的最后一个帧中写入渲染命令组后,前面的帧已经被渲染线程读取渲染命令组执行渲染后变成空闲帧,因此,指针再次指向前面的第一个空闲帧,并随着执行线程不断生成新的渲染命令组,重复执行上述过程。
[0047]步骤S203:将所述渲染命令组写入空闲帧中。
[0048]步骤S204:没有空闲帧,则执行线程等待(即停止写入操作)。
[0049]步骤S205:渲染线程判断所述预设队列是否有被写入渲染命令组的可用帧,若是,执行步骤S207 ;否则,执行步骤S206。
[0050]当预设队列仅能容纳一个帧时,直接对该帧进行判断。预设队列能容纳至少两个帧以上时,由上述描述可知,渲染命令组的写入和读取遵循先进先出的原则,因此,渲染线程读取第一个渲染命令组时,指针指向预设队列的第一个帧。
[0051]需要说明的是,如果一个帧,正被写入渲染命令组,属于正在被使用,此时不是可用帧;或者,如果一个帧,正在被渲染线程获取其中的渲染命令组,也属于正在被使用,此时也不是可用帧。即,本实施例说的可用帧,指渲染命令组已经被执行线程完成写入操作,并且没有正在被渲染线程调用。
[0052]步骤S206:没有被写入渲染命令组的可用帧,重复上一渲染操作,在重复上一次渲染操作完成后,回到循环的开始进入等待。
[0053]步骤S207:读取被写入渲染命令组的可用帧中的渲染命令组。
[0054]步骤S208:按照所述渲染命令组进行渲染。
[0055]步骤S206、步骤S207、步骤S208的实施方式与上述实施例相同,本发明在此不再赘述。
[0056]步骤S209:渲染线程将被读取的可用帧标识为空闲帧。
[0057]在根据读取的可用帧中的渲染命令组进行渲染后,渲染线程将被读取的可用帧标识为空闲帧,这样使得执行线程执行写入操作时,判断出空闲帧(即原来被占用的帧变为空闲可写入),则将生成的渲染命令组按覆盖的方式写入。
[0058]本实施例所述的方法,预设队列能够容纳至少两个帧,由于预设队列为执行线程与渲染线程所共用,当设置有多个帧时,执行线程与渲染线程能够同时工作,相互之间较少受到对方工作进程的牵制,提高了双线程渲染的工作效率。
[0059]需要指出的,在本发明中,执行线程可以生成两类命令:同步接口命令和异步接口命令。同步接口命令指根据用户的特定需求,需要渲染线程实时反馈数据的命令;异步接口命令指渲染线程无须实时执行的命令。同步接口命令包括获取图像数据命令,异步接口命令包括根据游戏进程对游戏画面进行渲染的一系列命令,如,图像渲染命令。与两种性质不同的命令相对应,渲染线程包括渲染模式和获取图像数据模式两种不同的执行模式,能够对应不同性质的命令进行切换。为了使本领域技术人员对本发明有更好的理解,下面通过两个具体示例分别对这两种命令进行详细描述。
[0060]如图5所示,为本发明提供的双线程渲染方式的第一示例图。在本实施例中,以获取图像数据命令为例进行描述。步骤一,执行线程根据用户的请求信息执行特定的JS程序段生成获取图像数据命令。由于执行线程不具备获取图像数据的执行平台,所以需要将获取图像数据命令传送给渲染线程。步骤二,将获取图像数据命令写入预设队列,并通知渲染线程,以便于渲染线程将执行模式切换为获取图像数据模式,然后执行线程进入休眠,等待结果。在本实施例中,预设队列可以为一个用于存储获取图像数据命令的位置变量,比如可以定义为“arg”。步骤三,渲染线程将执行模式切换后,读取“arg”中的获取图像数据命令,并执行该命令,生成一个结果数据,并将结果数据写入预设队列。本实施例中,可以将写入结果数据的位置定义为“result”。步骤四,执行线程从“result”中读取该结果数据,并将结果数据返回调用者,以便于调用者在终端上进行显示。
[0061]当然,上述仅以获取图像数据命令为例进行描述,同步接口命令还可以为其他命令,其渲染方法与上述描述相似,本发明在此不再赘述。
[0062]上述为本发明渲染方法中执行线程生成同步接口命令的方法,然而,当进入游戏后,随着游戏的运行,游戏场景不断变化,此时执行线程生成的是异步接口命令。
[0063]参见图6,为本发明提供的双线程渲染方式的第二示例图。进入游戏后,X-Canvas引擎激活,为了满足游戏场景的不断变化,进一步提高渲染效率,可以将预设队列创建为可以容纳N (N大于等于2)个帧的N重队列。N为多少可以根据不同游戏进行不同的设置,本发明对此不做限制。
[0064]本实施例中以3重队列为例对具体的渲染过程进行描述。随着游戏的运行,游戏场景不断变化,执行线程不断的生成渲染命令组。当执行线程生成一个渲染命令组后,指针从预设队列的上一个位置帧移动到当前帧。此处,上一个位置帧指该渲染命令组之前的渲染命令组所写入的帧。判断当前帧是否为空闲帧,若当前帧为空闲帧时,将渲染命令组写入该当前帧中;若当前帧不为空闲帧时,执行线程等待,直到当前帧为空闲帧时将渲染命令组写入当前帧。执行线程将渲染命令组写入当前帧后,指针顺次向后移动,指向当前帧的下一帧,执行线程进入下一次计算,生成新的渲染命令组,并重复执行上述过程。
[0065]与此同时,在执行线程写入第一个渲染命令组并通知渲染线程后,渲染线程开始执行读取渲染命令组,并根据所读取的渲染命令组进行渲染的步骤。渲染线程完成一次渲染后,指针从预设队列的上一个位置帧移动到当前位置帧,判断当前位置帧中是否是含有被写入渲染命令组的可用帧,若是,读取渲染命令组,并根据渲染命令组进行渲染,完成渲染后,将该可用帧标识为空闲帧,并指向下一个帧,重复执行上述过程;若否,重复执行上一渲染操作,在重复上一次渲染操作完成后,回到循环的开始进入等待。
[0066]其中,渲染命令组包括M个渲染命令,每个渲染命令对应游戏的一个部分,例如,渲染命令I对应游戏角色的服饰颜色,渲染命令2对应角色所在的位置,渲染命令M对应角色所处的环境的颜色。执行线程生成渲染命令组时,按照一定次序逐个生成渲染命令,并且每生成一个渲染命令便向预设队列相应的帧中写入一个渲染命令。渲染线程读取渲染命令的顺序与执行线程写入是的顺序相同,本发明此处不再赘述。
[0067]需要指出的,当上一个帧为预设队列的第三个帧时,指针移动到预设队列的第一个帧,并将第一个帧作为当前帧,当完成对当前帧的操作后,指针移动到当前帧的下一帧,即预设队列的第二个帧,并重复上述的执行过程,当完成对预设队列的第二帧的操作后,指针再次指向预设队列的最后一个帧。
[0068]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。[0069]以在小米2S手机上正常流畅的运行的九游棋牌大厅3.0版主界面为例,得出如下比较结果:
【权利要求】
1.一种游戏引擎渲染方法,其特征在于,所述方法包括: 执行线程执行JS代码生成渲染命令组; 将所述渲染命令组写入预设队列的空闲帧中; 渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧; 根据读取的所述可用帧中的渲染命令组进行渲染。
2.如权利要求1所述的方法,其特征在于,将所述渲染命令组写入预设队列的空闲帧中之前包括: 判断所述预设队列是否有空闲帧; 若是,一直执行将所述渲染命令组写入预设队列的空闲帧的步骤,若否,则等待。
3.如权利要求1所述的方法,其特征在于,将所述渲染命令组写入预设队列的空闲帧中之后包括: 执行线程通知渲染线程; 渲染线程根据所述通知执行从所述预设队列按顺序读取已经写入渲染命令组的可用中贞的步骤。
4.如权利要求1所述的方法,其特征在于,所述渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧包括: 渲染线程从所述预设队列按先入先出的顺序读取已经写入渲染命令组的可用帧。
5.如权利要求1所述的方法,其特征在于,所述渲染线程从所述预设队列按顺序读取已经写入渲染命令组的可用帧时,若发现没有可用帧,则重复执行上一渲染操作。
6.如权利要求1所述的方法,其特征在于,所述根据读取的可用帧中的渲染命令组进行渲染后,所述渲染线程将所述被读取的可用帧标识为空闲帧,使得所述执行线程执行写入操作时将生成的渲染命令组按覆盖的方式写入。
7.一种游戏引擎渲染装置,其特征在于,所述装置包括: 生成单元,用于执行线程执行JS代码生成渲染命令组; 写入单元,用于将所述渲染命令组写入预设队列的空闲帧中; 读取单元,用于从所述预设队列按顺序读取已经写入渲染命令组的可用帧; 渲染单元,用于根据所述读取单元读取的所述可用帧中的渲染命令组进行渲染。
8.如权利要求7所述的装置,其特征在于,所述装置还包括:判断单元,其中, 所述判断单元,用于判断所述预设队列是否有空闲帧; 所述写入单元在所述预设队列有空闲帧时,一直执行将所述渲染命令组写入预设队列的空闲帧的步骤;在所述预设队列无空闲帧时,执行等待。
9.如权利要求7所述的装置,其特征在于,所述装置还包括,通知单元,其中, 所述通知单元,用于当所述写入单元将所述渲染命令组写入预设队列的空闲帧中后,通知渲染线程。
10.如权利要求7所述的装置,其特征在于,所述装置还包括标识单元,其中, 所述标识单元,用于在所述渲染单元完成渲染之后,将所述被读取的可用帧标识为空闲帧,以便于所述写入单元将生成的渲染命令组按覆盖的方式写入。
【文档编号】G06T15/00GK103942823SQ201410069556
【公开日】2014年7月23日 申请日期:2014年2月27日 优先权日:2014年2月27日
【发明者】方任扬 申请人:优视科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1