一种网络游戏中的指令处理方法

文档序号:6444994阅读:702来源:国知局
专利名称:一种网络游戏中的指令处理方法
技术领域
本发明涉及指令处理技术领域,特别涉及一种网络游戏中的指令处理方法。
背景技术
大型多人在线游戏(MMOG),尤其是实时超大型多人在线游戏(RSMMOG)需要具备同场景承载超过数千人甚至更高在线人数,同时保持实时响应玩家操作指令和及时反馈处理结果的能力。一直以来,MMOG最大的技术难点在于如何在保证快速响应玩家的操作指令的前提下,提高同时在线人数。而随着玩家和游戏内非玩家角色(NPC)数量的增加,服务器的运算压力和存储压力急剧上升,为了解决这一问题,一般有两类做法升级服务器硬件和提高服务器处理效率。前者由于硬件技术的限制,无法做到无限提升,且成本巨大;而后者则可以通过软件改进,成本低,是MMOG设计的主要关注方向。对于提高服务器处理效率,通常会采用以下几种方式中的一种或几种来实现①将玩家分组,并分配到不同场景中,每个场景只有较少的玩家,将不同场景分配给不同线程处理,不同场景之间的玩家不能实现完全交互。②允许大量的玩家聚集在单一场景,但这个场景只能做特定的某些操作,不能实现完全交互;③采用回合制游戏方式;④降低NPC的逻辑复杂度,或者降低NPC的逻辑调用频率,节省出来的处理能力集中处理玩家操作响应;⑤使用地形分割将场景分成小块,通过多线程或者多进程分担处理不同分块内玩家的操作指令。前4种方式虽然实现简单,但会限制网络游戏的功能或者降低玩家的体验,造成玩家间交互不足,或游戏玩法受限,或使NPC智能降低,实际上是因为服务器性能而对游戏性进行折中的做法,而第5种则对游戏性没有损失,且充分利用了服务器多线程机制,是一种比较先进的做法。具体来说,第5种方法就是把原本整块的场景分割为多个小块,由不同的线程或者进程分别处理不同小块的场景,从而充分利用服务器的多线程处理能力。虽然第五种方法可以在保证不影响游戏体验的前提下,一定程度上缓解服务器的压力,但这种方式的最终效果受具体游戏运行情况影响较大,具体来说,就是受到场景分块和玩家在场景中的分布情况影响,玩家比较分散时,服务器各进程之间处理负担比较均衡, 此时的处理效率较高,但是一旦出现玩家或NPC聚集在某一分块而其它分块空闲的情况, 服务器的处理效率就会很低,无法充分利用服务器的多线程处理能力。此外,把场景分块以后,相邻块中间的过渡区域处理是这种方法的一大难点,分块过多过小反而会使运行效率急剧降低。另外,除了在线程分配层面上存在处理效率不高的问题,在具体指令执行层面也存在一个问题,那就是数据竞争(Data Race),即当多个线程或者多个进程同时尝试对一个
3或一组数据进行写入时,假设线程A刚好先于线程B写入,则线程B写入的数据会部分或全部覆盖线程A写入数据,而这时候线程A认为数据依然是它写入的那个,从而导致执行错误,这种现象就称为数据竞争。数据竞争是多线程处理中最常见也最难处理的问题,通常会使用加锁、信号量等同步操作来避免。加锁或信号量等同步操作是为了避免数据竞争的发生,使线程在处理数据前,尝试对数据共享区进行锁定,当锁定成功,则继续数据处理过程,否则等待直到获得锁。加锁虽然能避免数据竞争的发生,但可能会使其它线程或进程进入等待状态,频繁的等待会极大的降低多线程处理的效率,在某些情况下会比单线程处理还要慢。所以,总的来说,现有的网络游戏在将用户操作指令的具体处理负载分配到多个线程的分配策略层面以及多线程具体的指令执行层面上,都存在着不能充分利用多线程处理能力,处理效率不高的问题。

发明内容
有鉴于此,本发明提供了一种网络游戏中的指令处理方法,可以充分利用服务器的多线程处理能力,具有极高的处理效率。为达上述目的,本发明的技术方案具体是这样实现的一种网络游戏中的指令处理方法,该方法包括将客户端发送给服务器的操作指令按照从复杂到简单的逻辑层级拆分为多个原子指令分配到多个线程或多个进程并行处理;其中,同一指令处理循环中,不同逻辑层级的原子指令不同时处理;所述原子指令包括逻辑指令和数据变更指令,其中每一个逻辑指令仅包含一个操作,且不对具体数据进行修改;每一个数据变更指令仅对一个数据变更一次。较佳地,对所述原子指令按照所述逻辑层级分层处理,处理前序层级的原子指令所产生的后续层级的原子指令在同一指令处理循环内的后续处理步骤进行进一步处理;后续层级的原子指令产生的前序层级的原子指令不在当前指令处理循环内处理。较佳地,所述一次指令处理循环包括逻辑处理和数据更改两个阶段;在所述逻辑处理阶段根据上一次指令处理循环的处理结果和本次处理循环输入的逻辑指令生成最终的数据变更指令;在所述数据变更阶段采用原子操作执行所述数据变更指令。由上述技术方案可见,本发明的这种网络游戏中的指令处理方法在指令执行层面对服务器需要处理的操作指令进行了分割,将复杂操作指令拆分成不同层级的原子指令, 每一条原子指令只进行一个单一的操作,在保证不同层级的原子指令不同时处理的前提下,同一指令处理循环中的原子指令可以任意分配给任意不同的线程并行执行,使得多线程机制得以充分发挥作用,多线程处理效率可以最大化。


图1为本发明实施例的指令处理方法示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。本发明主要是在指令执行层面对服务器需要处理的操作指令进行了分割,将复杂操作指令拆分成原子指令,每一条原子指令只进行一个单一的操作。而原子指令是由复杂到简单的顺序按照逻辑层级拆分处理的,前序层级的原子指令产生的后续层级的原子指令可以在同一处理循环内供后面的处理步骤进行进一步处理;后续层级的原子指令产生的属于前序层级的原子指令不能在本次处理循环内被处理。一次处理循环包括逻辑处理和数据变更两个处理阶段,对应处理原子指令中的逻辑指令和数据变更指令两大类,逻辑处理阶段根据上一次处理循环的处理结果和本次处理循环的输入指令生成最终的数据变更指令,这些数据变更指令在数据更改阶段被实际作用到内存数据中。逻辑处理阶段处理的逻辑指令不涉及具体的数据更改,对所有数据都只读, 不会发生数据竞争。而在数据变更阶段,一条数据变更指令只对一个数据变更一次,这些数据变更指令均属于原子操作,所以并行处理数据变更指令即使不加锁也不会发生数据竞争现象。因此,从复杂指令拆分出的原子指令,在保证不同层级的原子指令不同时处理的前提下,同一指令处理循环中的原子指令可以任意分配给任意不同的线程并行执行,使得多线程机制得以充分发挥作用,多线程处理效率可以最大化。以下举个具体的例子客户端向服务器发出一个操作指令,该操作指令的内容是玩家对目标NPC发动一个技能,该技能的具体效果是发出后一秒对目标NPC造成一个伤害, 同时让NPC附带一个眩晕3秒的状态,三秒后状态解除。对于这个操作指令,整个指令处理过程如下图1所示服务器通过网络模块接收到客户端发出的使用技能的操作指令后,生成一个逻辑指令(技能事件),输入逻辑模块,逻辑模块将该逻辑指令拆分成一个在时间队列中插入事件的逻辑指令,(对应一秒后对目标NPC造成的伤害并附带眩晕状态),以及一个数据变更指令(玩家自身进入施法状态),完成逻辑处理阶段,之后数据处理模块根据数据变更指令修改指定数据;完成数据变更阶段,结束一个指令处理循环(属于该指令循环的指令在图1 中采用实线箭头表示)。所谓一个指令循环结束即产生了最终的数据更改时,该指令循环结束ο一秒后,时间队列根据之前插入的事件产生一个逻辑指令(定时事件,对应对目标NPC造成的伤害并附带眩晕状态)输入逻辑模块,逻辑模块将该逻辑指令继续拆分为一个在时间队列中插入事件的逻辑指令(对应三秒后眩晕状态解除),以及两条数据变更指令(目标生命减少及目标添加眩晕状态),完成逻辑处理阶段,之后,数据处理模块根据数据变更指令修改指定数据,完成数据变更阶段,结束一个指令处理循环(属于该指令循环的指令在图1中采用短线段状虚线箭头表示)。三秒后,时间队列根据之前插入的事件产生一个逻辑指令(定时事件,对应眩晕状态解除)并输入逻辑模块,逻辑模块根据该逻辑指令生成一条数据变更指令(目标状态清除),完成逻辑处理阶段,之后,数据处理模块根据数据变更指令修改指定数据,完成数据变更阶段。完成最后一个指令处理循环(属于该指令循环的指令在图1中采用点状虚线箭头表示)。
5
至此,玩家的这个操作指令被完全执行完毕。上述操作指令的执行中,一个复杂的操作指令按照逻辑层级从复杂到简单的顺序拆分成功能单一的原子指令并执行,这些原子指令根据其功能和逻辑关系分属不同的层级,同一层级的原子指令相互之间没有逻辑关系;有逻辑前后关系的两条原子指令属于不同层级,例如上述实施例中的技能事件对于时间队列插入事件是前序层级的逻辑指令,而时间队列插入事件则是从技能事件中拆分出来的后续层级逻辑指令。即使同一时刻有多条同一层级的操作指令在被处理,如多个客户端同时发出的对于同一个NPC使用技能的指令,对于不同来源的技能指令,由于不涉及数据的更改,可以同时分配给不同的线程或进程进行处理。只要在每一个指令处理循环中,保证不同层级的原子指令不会同时被处理,如技能事件与后续的时间队列插入事件不被同时处理,就可以避免数据竞争问题;同时,在同一个指令循环中,相同层级的原子指令可以任意分配给不同的线程或进程并行处理,因此可以充分利用现有服务器硬件的多线程或多进程处理能力,提高处理效率。由上述的实施例可见,本发明的这种指令处理方法在逻辑模块进行逻辑处理的阶段,由于逻辑指令只读取上一次处理循环的结果数据,然后生成一系列原子指令,而不会同时对数据进行修改操作,所以即使两个线程需要用到同一个数据也不会产生数据竞争问题。而在数据处理模块进行数据更改的阶段,由于每次只对一个数据进行更改操作, 且不会同时对一个数据进行多个更改操作,所以这些操作都可以通过原子操作来实现,不需要使用锁和信号量等同步技术,各线程的操作不会产生相互等待的情况,保证了多线程并行处理的效率。由于整个处理过程是基于指令分割实现的,而且在几乎所有处理过程中都可以对本阶段处理的任意两条原子指令进行并行处理,也就是可以将原子指令任意分配给不同线程,理论上可以达到多线程执行能力始终满负荷,即使出现如背景技术第5种方法提到的那种玩家或NPC聚集的情况,也可以很自然的把各种输入的操作指令分派到各线程中同时处理,达到指令处理效率的最大化。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
权利要求
1.一种网络游戏中的指令处理方法,其特征在于,该方法包括将客户端发送给服务器的操作指令按照从复杂到简单的逻辑层级拆分为多个原子指令分配到多个线程或多个进程并行处理;其中,同一指令处理循环中,不同逻辑层级的原子指令不同时处理;所述原子指令包括逻辑指令和数据变更指令,其中每一个逻辑指令仅包含一个操作, 且不对具体数据进行修改;每一个数据变更指令仅对一个数据变更一次。
2.如权利要求1所述的方法,其特征在于,对所述原子指令按照所述逻辑层级分层处理,处理前序层级的原子指令所产生的后续层级的原子指令在同一指令处理循环内的后续处理步骤进行进一步处理;后续层级的原子指令产生的前序层级的原子指令不在当前指令处理循环内处理。
3.如权利要求2所述的方法,其特征在于,所述一次指令处理循环包括逻辑处理和数据更改两个阶段;在所述逻辑处理阶段根据上一次指令处理循环的处理结果和本次处理循环输入的逻辑指令生成最终的数据变更指令;在所述数据变更阶段采用原子操作执行所述数据变更指令。
全文摘要
本发明实施例公开了一种网络游戏中的指令处理方法,该方法包括将客户端发送给服务器的操作指令按照从复杂到简单的逻辑层级拆分为多个原子指令分配到多个线程或多个进程并行处理;其中,同一指令处理循环中,不同逻辑层级的原子指令不同时处理;所述原子指令包括逻辑指令和数据变更指令,其中每一个逻辑指令仅包含一个操作,且不对具体数据进行修改;每一个数据变更指令仅对一个数据变更一次。该方法可以充分利用服务器的多线程处理能力,具有极高的处理效率。
文档编号G06F9/38GK102436368SQ20111046059
公开日2012年5月2日 申请日期2011年12月31日 优先权日2011年12月31日
发明者钟文杰 申请人:北京像素软件科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1