资源预览内容
亲,该文档总共5页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
网络游戏中的射线查询方法和场景服务器的制作方法专利名称:网络游戏中的射线查询方法和场景服务器的制作方法技术领域:本发明涉及网络游戏技术,特别涉及网络游戏中的射线查询方法和场景服务器。背景技术:碰撞检测是网络游戏中实现很多游戏效果和技术的基础,其中以射线查询应用最为广泛。所谓射线查询,其主要是使用射线作碰撞检测,查询空间中的射线是否与场景模型相交,如果相交则返回最近的交点等信息。例如刀剑贰中的跳跃、寻路、伤害判定等,都需要进行大量射线查询。 通常,网络游戏中用于射线查询的场景模型使用三角形网格表示,有时复杂的场景模型可能使用数十万乃至百万个三角形网格。为了加速计算,常常针对场景模型使用加速结构即kdtree、均匀网格等数据结构,其对空间进行划分,并将三角形划分到其覆盖的各个子空间,检测时只查找射线穿过的子空间,避免不必要的射线与三角形相交测试。但即使使用加速结构,射线查询也需要大量的计算。为了防止欺诈或外挂,更好的维护玩家权益,越来越多的网络游戏将涉及利益的射线查询放在服务器端计算,通常是由场景服务器的(PU执行。但是,场景服务器的CPU负责运行多个场景,包括世界和副本等,支持数以千计的玩家同时在线,毎秒运行数十个游戏帧,而每一游戏帧通常需要处理网络请求、人工智能、伤害判定、寻路、日志等大量任务,如果在额定的时间内不能完成任务,导致服务器延迟,不仅影响玩家体验,还会影响后续游戏帧的处理,导致各种问题。和其它任务相比,射线查询不仅计算密集,而且帧间负载不平衡,在某一游戏帧只有少量的查询,而下游戏帧就可能出现数百倍乃至千倍的查询,常常导致服务器延迟。发明内容本发明提供了网络游戏中的射线查询方法和场景服务器,以避免射线查询引起场景服务器的延迟。本发明提供的技术方案包括一种网络游戏中的射线查询方法,方法包括场景服务器针对每游戏帧执行以下操作在每游戏帧开始时,将针对该游戏帧的所有射线查询请求注册到射线查询管理器中;依据注册至该射线查询管理器的射线查询请求数量统计出当前是由CPU还是由图像处理器GPU执行射线查询;如果统计出是由CPU执行射线查询,则由CPU执行射线查询;如果统计出是由GPU执行射线查询,则调度GPU异步执行射线查询,而CPU在GPU执行射线查询期间执行非射线查询任务。一种应用于网络游戏中射线查询的场景服务器,包括注册单元,用于当每一游戏帧开始时,将针对该游戏帧的所有射线查询请求注册到射线查询管理器中;统计单元,用于依据注册至该射线查询管理器的射线查询请求数量统计出当前是由CPU还是由图像处理器GPU执行射线查询;CPU,用于在所述统计单元统计出是由CPU执行射线查询时,执行射线查询;GPU,用于在所述统计单元统计出是由GPU执行射线查询吋,异步执行射线查询,其中,所述CPU在GPU执行射线查询期间执行非射线查询任务。由以上技术方案可以看出,本发明中,依据每游戏帧开始时注册至该射线查询管理器的该游戏帧的所有射线查询请求数量统计出当前是由CPU还是由图像处理器GPU执行射线查询,如果统计出是由CPU执行射线查询,则由CPU执行射线查询,如果统计出是由GPU执行射线查询,则调度GPU异步执行射线查询,而CPU在GPU执行射线查询期间执行非射线查询任务,这是实现了并非一直由场景服务器的CPU执行射线查询任务,而GPU也可协助执行射线查询任务,这保证了场景服务器的流畅运行,避免射线查询引起场景服务器的 延迟。图I为GPU效果示意图;图2为本发明实施例提供的方法流程图;图3为本发明实施例提供的CPU计算时间和数据传输时间测试示意图;图4为本发明实施例提供的详细方法流程图;图5为本发明实施例提供的数据存储格式示意图;图6为本发明实施例提供的GPU执行射线查询流程图;图7为本发明实施例提供的查询数据和线程块数据示意图;图8为本发明实施例提供的场景服务器结构图。具体实施例方式为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。随着对图形处理能力的需求不断增长,图形处理器(GPU)得到了飞速发展。该GPU具有大量数据并行处理、计算密集的特点,其与CPU上大部分面积都被缓存占据有所不同,目前,GPU上有大约80%的晶体管用作运算,因此,GPU在密集型计算上比CPU更有优势,拥有更高的浮点计算能力,具体如图I所示。基于此,本发明可由GPU作为CPU的协处理器异步执行射线查询,具体见图2所/Jn 參见图2,图2为本发明实施例提供的方法流程图。如图2所示,该流程可包括步骤201,场景服务器针对每游戏帧执行步骤202至步骤204。步骤202,在每游戏帧开始时,将针对该游戏帧的所有射线查询请求注册到射线查询管理器中;步骤203,依据注册至该射线查询管理器的射线查询请求数量统计出当前是由CPU还是由GPU执行射线查询。步骤204,如果步骤203统计出是由CPU执行射线查询,则由CPU执行射线查询;如果步骤203统计出是由图像处理器GPU执行射线查询,则调度GPU异步执行射线查询,而CPU在GPU执行射线查询期间执行非射线查询任务。至此,完成图2所示方法的描述。其中,步骤203之所以统计出当前是由CPU还是由GPU执行射线查询,主要是因为虽然GPU可异步执行射线查询,但其需要与内存通过PCI-E总线通信,以便从内存复制用于执行射线查询的查询数据到显存(GPU的全局存储),以及还需要从显存复制执行射线查询的结果到内存,这都需要时间,为便于描述,将该时间简称为数据传输时间。根据本申请发明人的测试,只有该数据传输时间小于由CPU执行射线查询所需要的时间(简称为CPU计算时间)时,使用GPU执行射线查询才有意义,比如提高射线查询速度。因此,在执行射线查询时就需要从提高射线查询速度角度细分是由CPU还是由GPU执行射线查询。通常,CPU计算时间基本上与射线查询的数量成正比,而数据传输时间虽然随着传输数据大小的增加而增加,不过与传输数据大小并不成正比,增长较慢。本申请发明人以 NIVIDA GTX460显卡为例测试数据传输时间与CPU计算时间具体如图3所示。从图3可以看出,从射线查询请求的数量为16开始,CPU计算时间大于数据传输时间,因此可以得到当射线查询请求的数量小于16时使用CPU执行射线查询,而当大于等于16使用GPU异步执行射线查询,这能够保证射线查询速度最快。由于服务器的硬件配置不同,CPU计算时间等于或开始大于上述数据传输时间的射线查询请求数量N不同。为了获取N,本发明在场景服务器启动时,载入组预先生成的查询数据,取查询数据的数量为2k,从k=2开始依次测试CPU计算时间和数据传输时间,当测试结果为(PU计算时间等于或开始大于上述数据传输时间时,确定当前已使用的查询数据的数量为所述N。另外,根据步骤204的描述可以看出,场景服务器的CPU执行的任务分成如下两类射线查询任务和非射线查询任务。其中,当统计出是由CPU执行射线查询时,则由CPU执行射线查询任务。而当统计出由GPU执行射线查询吋,就调度GPU异步执行射线查询,而CPU在GPU执行射线查询期间执行非射线查询任务,这不仅能提高场景服务器计算射线查询的速度,而且能提高服务器处理任务的呑吐量。下面通过图4对图2所示流程进行详细描述參见图4,图4为本发明实施例提供的详细方法流程图。如图4所示,该流程可包括以下步骤步骤401,场景服务器启动,载入该场景服务器中所有游戏场景的碰撞模型至显存中,生成各个游戏场景的碰撞模型相关联的加速结构并复制至显存中。优选地,本发明中,游戏场景的碰撞模型可通过三角形网格表示。另外,本步骤401中,生成加速结构的方式可与现有技术类似,本申请不具体限定。步骤402,将每个游戏场景的碰撞模型地址、包围盒、以及加速结构地址复制到GPU的常量内存中。本步骤402中的数据使用频繁,数量较少,可以通过缓存(Cache)加速访问。为便于理解,图5示出了步骤401中数据和步骤402中数据的存储格式示意图。步骤403,载入预生成的查询数据,测试得到使用GPU计算射线查询的最小查询数量N。步骤404,循环针对各个游戏帧执行以下步骤405至步骤407,直至场景服务器程序退出。步骤405,在游戏帧开始时,将针对该游戏帧的所有射线查询请求注册到射线查询管理器中。步骤406,射线查询管理器按游戏场景记录射线查询请求,并统计射线查询请求数量。 其中,射线查询管理器按场景记录射线查询请求具体为同一游戏场景的射线查询请求记录在一起,不同游戏场景的射线查询请求不记录在一起,目的是便于以后生成线程块数据,具体见下文步骤603描述。步骤407,如果射线查询请求数量大于N,则调度GPU异步执行射线查询,否则,使用CPU执行射线查询。优选地,本发明中,在GPU执行射线查询时,CPU可继续处理非射线查询任务。其中,本发明中,GPU执行射线查询具体可參见图6所示流程。參见图6,图6为本发明实施例提供的GPU执行射线查询流程图。如图6所示,该流程可包括以下步骤步骤601,将查询数据从内存复制到显存中。本步骤601之所以将查询数据从内存复制到显存,主要是因为GPU不能直接访问内存,但可直接访问显存。另外,本发明中,所述查询数据至少包含以下分量射线原点的X坐标、y坐标和z坐标,以及射线方向的X坐标、I坐标和Z坐标、以及射线最远距离。在图7a中,该各个分量并非存储在个数组,而是将各个分量単独存为个数组,便于多处理器读取数据时,合并访存事务,减少访存次数。步骤602,划分线程网格为线程块。本步骤602中,可按照同一线程块执行同一游戏场景的射线查询、且线程块中的一个线程单独执行一个射线查询为原则执行划分操作。由于每个射线查询使用个单独的线程计算,因此,如果线程块的线程数量较多,则在某些线程等待射线查询时,可以调度其它线程进行计算,这可以隐藏访存延迟,不过由于执行射线查询时需要占用较多的资源,例如共享内存,因此,线程块内最多只能使用256个线程。步骤603,生成并复制线程块数据至显存中。由于每个线程块只处理个游戏场景的查询,因此,可以保证这样线程块内的所有线程共享线程块数据。优选地,所述线程块数据具体与其中的线程执行射线查询的信息有关,其大小可为12个int,至少包括查询数据、游戏场景索引、查询数据起始地址、射线查询结果地址。图7示出了线程块数据与查询数据之间的对应关系。步骤604,启动GPU的射线查询。本步骤604具体可为首先调用每个线程块的前12个线程读取线程块数据到共享内存中,并调用syncthreads ()同步线程,使得线程块内的线程等待线程块数据读取完成后再继续执行射线查询。其次,针对该线程块的每线程,获取该线程块每线程负责执行射线查询的查询数据在该线程块内的索引。其中,由于本发明使用维的线程块,所以每个线程获取的系统变量threadldx. x就是该线程负责执行射线查询的查询数据在该线程块内的索引。如此,每个线程在读取到共享内存中线程块数据的查询数据起始地址的基础上,用该索引进行偏移后得到其负责的查询数据地址,读取查询数据。之后由该线程利用所述查询数据执行射线查询。其中,基于图7所示的查询数据,以及上面描述的碰撞模型通过三角形网格表示,则由所述线程利用查询数据执行射线查询包括判断该查询数据对应的射线是否与游戏场景的包围盒相交,该游戏场景通过该查询数据所处线程块数据中的游戏场景索引确定,如果不相交,通过该线程将用于表示射线查询结果为不相交的第一标识比如False作为射线查询结果写入至共享内存中;如果相交,则,遍历该游戏场景的加速结构,寻找该射线与该游戏场景的三角形网格最近的交点,如果未寻找到所述交点,则通过该线程将用于表示射线查询结果为不相交的第一标识比如False作为射线查询结果写入至共享内存中,如果寻找到所述交点,则通过该线程将用于表示射线查询结果为相交的第二标识、以及所述交点与所述射线原点之间的距离作为射线查询结果写入共享内存中,以便后续CPU处理射线查询结果时可以根据该距
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号