一种用于实现不分线无缝游戏世界的方法和装置转让专利
申请号 : CN202010165979.3
文献号 : CN111459626B
文献日 : 2021-06-01
发明人 : 郭鹏
申请人 : 完美世界(北京)软件科技发展有限公司
摘要 :
权利要求 :
1.一种用于实现不分线无缝游戏世界的方法,其中,所述方法包括:将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段;
线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶段执行完毕。
2.根据权利要求1所述的方法,其中,所述方法还包括:创建所述线程池,其中,所述线程池中的线程数是根据CPU核心数确定的。
3.根据权利要求1所述的方法,其中,所述将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段,包括:
将多人在线游戏的服务器中每帧都需执行的计算逻辑划分为管理数据逻辑和角色数据逻辑;
将管理数据逻辑归纳为多个管理逻辑类别,将角色数据逻辑归纳为多个角色逻辑类别;
根据所述多个管理逻辑类别和所述多个角色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或一个角色逻辑类别。
4.根据权利要求3所述的方法,其中,所述将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段,还包括:
将角色数据逻辑按照角色数量平分到线程池的各个线程中,其中,每个角色在生命周期内唯一绑定至一个线程;
将管理数据逻辑按照场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个线程。
5.根据权利要求3所述的方法,其中,所述角色逻辑类别至少包括以下任一项:属性计算逻辑;
视野同步逻辑;
网络协议处理逻辑;
战斗交互逻辑。
6.根据权利要求3所述的方法,其中,每个计算逻辑中的数据均为私有。
7.根据权利要求6所述的方法,其中,所述每个线程执行当前阶段对应的逻辑类别中的计算逻辑,包括:
对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据。
8.根据权利要求7所述的方法,其中,所述对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据,包括:对于角色逻辑类别中的每个计算逻辑,在执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若是,继续执行该公共接口函数,以访问该计算逻辑中的数据;若否,将异步逻辑数据发送到角色所绑定的线程的无锁队列中以等待异步执行,其中,所述异步逻辑数据包括该公共接口函数及该公共接口函数对应的传入参数。
9.一种用于实现不分线无缝游戏世界的装置,其中,所述装置包括:用于将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段的装置;
用于线程池在每帧中根据所述多个阶段来按阶段执行的装置,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶段执行完毕。
10.根据权利要求9所述的装置,其中,所述装置还包括:用于创建所述线程池的装置,其中,所述线程池中的线程数是根据CPU核心数确定的。
11.根据权利要求9所述的装置,其中,所述用于将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段的装置,用于:
将多人在线游戏的服务器中每帧都需执行的计算逻辑划分为管理数据逻辑和角色数据逻辑;
将管理数据逻辑归纳为多个管理逻辑类别,将角色数据逻辑归纳为多个角色逻辑类别;
根据所述多个管理逻辑类别和所述多个角色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或一个角色逻辑类别。
12.根据权利要求11所述的装置,其中,所述用于将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段的装置,还用于:
将角色数据逻辑按照角色数量平分到线程池的各个线程中,其中,每个角色在生命周期内唯一绑定至一个线程;
将管理数据逻辑按照场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个线程。
13.根据权利要求11所述的装置,其中,所述角色逻辑类别至少包括以下任一项:属性计算逻辑;
视野同步逻辑;
网络协议处理逻辑;
战斗交互逻辑。
14.根据权利要求11所述的装置,其中,每个计算逻辑中的数据均为私有。
15.根据权利要求14所述的装置,其中,所述每个线程执行当前阶段对应的逻辑类别中的计算逻辑,包括:
对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据。
16.根据权利要求15所述的装置,其中,所述对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据,包括:对于角色逻辑类别中的每个计算逻辑,在执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若是,继续执行该公共接口函数,以访问该计算逻辑中的数据;若否,将异步逻辑数据发送到角色所绑定的线程的无锁队列中以等待异步执行,其中,所述异步逻辑数据包括该公共接口函数及该公共接口函数对应的传入参数。
17.一种用于实现不分线无缝游戏世界的服务器,其中,所述服务器包括如权利要求9至16中任一项所述的用于实现不分线无缝游戏世界的装置。
18.一种用于实现不分线无缝游戏世界的系统,包括如权利要求17所述的服务器,以及客户端。
19.一种设备,其中,所述设备包括:存储器,用于存储一个或多个程序;
一个或多个处理器,与所述存储器相连,当所述一个或多个程序被所述一个或者多个处理器执行时,使得所述一个或多个处理器执行如权利要求1至8中任一项所述的方法。
20.一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序可被处理器执行如权利要求1至8中任一项所述的方法。
说明书 :
一种用于实现不分线无缝游戏世界的方法和装置
技术领域
背景技术
场景再复制出多个一模一样的附属地图场景分别运行在不同的场景服务进程或者线程中,
基于分线来在一个场景中承载大量玩家的方案,在相同位置,不同线的人相互看不到对方,
玩家如果想在同一个地方看到对方,必须约定登陆进同一个线或者选择切换到同一个线,
这无疑会给玩家带来诸多不便,游戏体验较差。
发明内容
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
所述一个或者多个处理器执行时,使得所述一个或多个处理器执行如下操作:
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
个阶段,之后使线程池每帧按阶段执行,由于只有在阶段切换时才同步不同线程间的数据,
使得能极大地降低同步数,以有限的阶段同步数去最大限度的利用CPU(central
processing unit,中央处理器)多核性能,并且,通过在多人在线游戏中按帧按阶段同步线
程间逻辑,能够充分利用好每个线程的顺序执行能力,尽可能的减少线程之间的锁的行为,
且进一步地通过使用无锁队列来用于线程间的数据传递,能够实现数据同步并保证同步效
率和安全性,从而达到不分线来实现多人在线游戏无缝世界的目的,提高玩家的游戏真实
体验;此外,通过使用本申请中关于计算逻辑相关类的编程规范,也即计算逻辑中的数据和
方法的相关规范,能够以简单的规范实现在多线程间降低数据交互量的技术目的,以实现
具有更高的实时交互效率的不分线无缝世界,进一步提高玩家的游戏真实体验。
附图说明
具体实施方式
多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其
操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理
可以对应于方法、函数、规程、子例程、子程序等等。
在存储器中预存的程序指令来执行预定处理过程,或是由专用集成电路(ASIC)、现场可编
程门阵列(FPGA)、数字信号处理器(DSP)等硬件执行预定处理过程,或是由上述二者组合来
实现。
由大量计算机或网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合
的计算机集组成的一个超级虚拟计算机。其中,所述计算机设备可单独运行来实现本申请,
也可接入网络并通过与网络中的其他计算机设备的交互操作来实现本申请。其中,所述计
算机设备所处的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络、无线自组织
网络(Ad Hoc网络)等。
施时,用以实施必要任务的程序代码或代码段可以被存储在机器或计算机可读介质(比如
存储介质)中。(一个或多个)处理器可以实施必要的任务。
仅仅受限于这里所阐述的实施例。
进行区分。举例来说,在不背离示例性实施例的范围的情况下,第一单元可以被称为第二单
元,并且类似地第二单元可以被称为第一单元。这里所使用的术语“和/或”包括其中一个或
更多所列出的相关联项目的任意和所有组合。
当理解的是,这里所使用的术语“包括”和/或“包含”规定所陈述的特征、整数、步骤、操作、
单元和/或组件的存在,而不排除存在或添加一个或更多其他特征、整数、步骤、操作、单元、
组件和/或其组合。
以基本上同时执行或者有时可以按照相反的顺序来执行。
的服务器包括主服务器以及分别用于处理不同业务数据的多种服务器,本实施例的方案主
要由用于处理战斗业务数据的战斗服务器来实施;2)本申请中所涉及的帧均是指多人在线
游戏的服务器端的帧(也称为服务器帧),服务器端的帧仅在服务器上运行,代表了服务器
的运行逻辑,需要说明的是,服务器端的帧与客户端的渲染帧是完全不同的概念;3)本申请
中所述的角色是指多人在线游戏中角色,包括但不限于玩家和NPC(Non‑Player
Character,非玩家角色),角色数据逻辑是指与角色对应的角色数据相关的逻辑,如与角色
属性相关的计算逻辑,角色逻辑类别是指对角色数据逻辑进行归纳得到的逻辑类别;4)本
申请中所述的场景是指多人在线游戏中的游戏场景,如游戏中某块地图中的某一个战斗场
景,管理数据逻辑是指与场景对应的管理数据相关的逻辑,通常为与场景相关的全局逻辑,
如控制场景中的NPC数量的逻辑、给进入此场景的玩家加buff(增益)的逻辑等,管理逻辑类
别是指对管理数据逻辑进行归纳得到的逻辑类别。
帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应
的多个阶段;在步骤S12中,线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个
阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且
当执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异
步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶
段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,
直至所述多个阶段执行完毕。
执行每帧都需执行的计算逻辑(也即需要按固定频率去执行的动态逻辑),而并非每帧都需
执行的逻辑由于对实时性要求不高,可分配到所述线程池以外的线程去执行。
同类别的计算逻辑归纳为一个逻辑类别,得到N个逻辑类别,M大于N。在一些实施例中,一个
逻辑类别下的计算逻辑访问的属性都有相似性,不同的逻辑类别访问的属性是不同或不相
似的。在一些实施例中,通过归纳操作,能够将各种计算逻辑(战斗交互数据相关逻辑)的管
理器(比如AI管理器,技能管理器等)按照线程池中线程的数量,实现成多线程安全的管理
器,以使不同线程对该管理器的访问都具备数据安全性。
阶段也唯一对应一个逻辑类别;根据所述多个逻辑类别,确定线程池对应的多个阶段,也即
相当于将所述多个逻辑类别划分为多个阶段,以实现逻辑类别与阶段之间的绑定。在一些
实施例中,阶段划分的依据是逻辑类别是否相同,或者说,逻辑访问的属性是否具备相同性
或相似性。作为一个示例,将多人在线游戏中每帧都需执行的计算逻辑归纳为N个逻辑类
别,之后根据该N个逻辑类别定义线程池的N个阶段,其中,每个阶段唯一对应一个逻辑类
别。在一些实施例中,所述多个阶段的执行顺序,以及每个阶段绑定的逻辑类别中所包含的
各个计算逻辑的执行顺序都是固定的,上述顺序是按多人在线游戏的设计逻辑来确定的,
也即多人在线游戏的设计逻辑决定了阶段的划分和阶段内计算逻辑的顺序,多人在线游戏
的设计逻辑是指游戏类别、玩法等带来的策划和程序上的设计。
执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步
逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段
对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直
至所述多个阶段执行完毕。线程池按阶段执行的目的,是为了减少不同线程间的数据同步
次数;在一个阶段内,各线程需执行相同的逻辑,否则无法做到不需要用锁的方式实现数据
同步;在每个阶段内每个线程需要完成自己内部的数据修改以及用无锁队列完成跨线程的
数据修改(即同步)。
计算逻辑执行完之后,在之后的阶段中就不会修改相关属性,从而使得各个线程都可以直
接访问相关属性,而不需要加锁同步,也即,本申请能够通过把贯穿整个阶段的属性修改放
到一个阶段去执行完,以使后续其他阶段可以直接访问这些属性,而不需要加锁同步。
程去修改数据时,把修改行为转移到数据所在线程去修改,以在不同线程间访问共享数据
时实现数据同步,避免了不同线程修改共享数据。
有者并非该线程所绑定的角色,则该线程可将异步逻辑数据发送至该公共接口函数的函数
持有者所绑定的另一个线程对应的无锁队列中,以由该线程调用该公共接口函数来修改共
享数据,从而实现不同线程间访问共享数据时的同步;作为一个示例,线程池按帧按阶段执
行,在一个阶段中,线程T1将需要由线程T2异步执行的异步逻辑数据放入到线程T2对应的
无锁队列中,该异步逻辑数据包括公共接口函数F1及其传入参数M1和M2;线程T2在执行完
当前阶段绑定的计算逻辑后,检测到其无锁队列中存在等待异步执行的该异步逻辑数据,
则线程T2调用该公共接口函数F1来修改相应的数据,从而实现共享数据的同步。
每个逻辑类别中包含多个计算逻辑,每个阶段对应的逻辑类别以及每个逻辑类别中的各个
计算逻辑的执行顺序由多人在线游戏的设计逻辑来确定,则线程池在服务器每帧的运行逻
辑如下:第一个阶段开始,线程池激活其中的K个线程,每个线程执行第一个阶段绑定的逻
辑类别中的计算逻辑,当执行完第一个阶段对应的计算逻辑后,检测本线程的无锁队列中
是否有等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;当
每个线程均执行完第一个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异
步逻辑时(也即每个线程的无锁队列中都不存在等待异步执行的异步逻辑数据),开始第二
个阶段;第二个阶段开始后,线程池激活其中的K个线程,每个线程执行第二个阶段绑定的
逻辑类别中的计算逻辑,当执行完第二个阶段对应的计算逻辑后,检测本线程的无锁队列
中是否有等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;
当每个线程均执行完第二个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的
异步逻辑时,开始第三个阶段;以此类推,直至N个阶段执行完毕。
数,其中,Nthreads表示线程数,Ncpu表示CPU核心数,Ucpu表示CPU使用率,w表示等待时间,
c表示计算时间;又例如,基于公式“线程数=CPU核心数/(1‑阻塞系数)”来计算线程数。本
申请并不限制根据CPU核心数确定线程池中的线程数的具体实现方式,任何能够用于根据
CPU核心数确定线程池中的线程数的实现方式,均应包含在本申请的保护范围内。
别,将角色数据逻辑归纳为多个角色逻辑类别;根据所述多个管理逻辑类别和所述多个角
色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或一
个角色逻辑类别。在一些实施例中,角色逻辑类别的数量与管理逻辑类别的数量之和大于
或等于阶段数;在一些实施例中,分阶段处理每个逻辑类别;在一些实施例中,角色逻辑类
别和管理逻辑类别可以在同一个阶段重合。在一些实施例中,一个阶段可以唯一绑定一个
管理逻辑类别,或者唯一绑定一个角色逻辑类别,或者绑定一个管理逻辑类别和一个角色
逻辑类别;在一些实施例中,由于采用无锁队列来实现数据同步,为了保证数据安全,一个
阶段不能同时绑定两个及以上角色逻辑类别,也不能同时绑定两个及以上管理逻辑类别。
在一些实施例中,所述角色逻辑类别包括任何对与角色相关的计算逻辑进行归纳所得到的
逻辑类别,所述管理逻辑类别包括任何对于场景相关的计算逻辑性归纳所得到的逻辑类
别。
申请所述的角色逻辑类别的范围内。
场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个线程。
在一些实施例中,以场景和角色为单位,将角色数据逻辑和管理数据逻辑评分平分到各个
线程中,每个角色、每个场景在生命周期内都有唯一的绑定线程;作为一种具体实施方式,
每当一个角色或一个场景的生命周期开始,便会唯一绑定至一个线程,在绑定时,可获取每
个线程已绑定的角色数量和场景数量,并选择已绑定的角色数量和场景数量最少的线程去
绑定。在一些实施例中,角色的生命周期以角色登入游戏或被场景创建出来为开始,以角色
退出登录或离开场景或死亡为结束;可选地,可基于游戏设计来调整生命周期的定义,也可
针对不同的角色设置不同的生命周期算法,如玩家和NPC可采用不同的生命周期算法,如玩
家的生命周期以玩家登入游戏为开始并以玩家退出登录为结束,NPC的生命周期以被场景
创建出来为开始以死亡为结束。在一些实施例中,场景的生命周期以场景的创建为开始,以
创景的销毁为结束。
的,因此,仅能角色本身访问,也即只有数据所在的线程才有权限修改该数据,或者说,所有
的数据修改都在各自线程内。在一些实施例中,若在不同线程间访问共享数据(也即有数据
在不同线程间被同时修改),则需要数据同步,而由于数据都是私有的,只有数据所在的线
程才有权限修改该数据,则可在需要数据同步时,将数据修改需求(也即异步逻辑数据)放
入需要修改的数据所在的线程对应的无锁队列中,以使数据所在线程自己去修改该数据,
数据所在线程完成修改之后可与其他线程共享修改后的数据,基于此,也就实现了不同线
程间的数据同步,该实现方式能够避免由于不同线程修改共享数据而影响共享数据的安全
性。例如,线程池包括线程T1和线程T2,线程T2不能直接改T1线程的数据,若线程T2需要修
改T1中的数据,即需要数据同步,线程T2必须通过将数据修改需求放入线程T1对应的无锁
队列中,以使线程T1自己去修改该数据,线程T1修改该数据之后,可与线程T2共享修改后的
数据,由此也即实现了线程T1和线程T2之间的数据同步。
辑中的数据。在一些实施例中,角色数据逻辑的方法按照方法前缀,分为私有方法和公共方
法;私有方法仅在角色所绑定的线程中调用,只有公共方法才会在不同线程间调用,从而产
生多线程之间的数据交互。
执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若
是,继续执行该公共接口函数,以访问该计算逻辑中的数据;若否,将异步逻辑数据发送到
角色所绑定的线程的无锁队列中以等待异步执行,其中,所述异步逻辑数据包括该公共接
口函数及该公共接口函数对应的传入参数。所述公共接口函数也即相当于公共方法。在一
些实施例中,检测当前执行的线程是否为角色所绑定的线程,也即对接口函数进行线程安
全检查,作为一种具体实现方式,在每个阶段中,接口函数在开始执行时,需判断当前的函
数调用线程是否为在函数持有者所在线程,从而确定当前阶段的执行是否线程安全;如安
全,继续执行;如不安全,要实现将接口函数真正逻辑和参数打包到函数持有者所在线程的
无锁队列中,等待异步执行。作为一个示例,一个公共接口函数的函数持有者为角色A,线程
T1调用该公共接口函数时,先判断线程T1是否为该公共接口函数的角色A所绑定的线程,若
是,线程T1继续执行该公共接口函数,若否,将该公共接口函数以及其传入参数打包到角色
A所绑定的线程的无锁队列中,等待异步执行。通过在检测到当前执行的线程并非角色所绑
定的线程时转为异步执行,能够在不采用锁的情况下保证数据安全。
用。
服务进程或者线程中,基于分线来在一个场景中承载大量玩家的方案,在相同位置,不同线
的人相互看不到对方,玩家若在同一个地方看到对方,必须约定登陆进同一个线或者选择
切换到同一个线,这无疑会给玩家带来诸多不便,游戏体验较差。
据,而同步量越大效率就越低,程序复杂性就越高,编程就更困难。
池每帧按阶段执行,由于只有在阶段切换时才同步不同线程间的数据,使得能极大地降低
同步数,以有限的阶段同步数去最大限度的利用CPU多核性能,并且,通过在多人在线游戏
的服务器中按帧按阶段同步线程间逻辑,能够充分利用好每个线程的顺序执行能力,尽可
能的减少线程之间的锁的行为,且进一步地通过使用无锁队列来用于线程间的数据传递,
能够实现数据同步并保证同步效率和安全性,从而达到不分线来实现多人在线游戏无缝世
界的目的,提高玩家的游戏真实体验;此外,通过使用本申请中关于计算逻辑相关类的编程
规范,也即计算逻辑中的数据和方法的相关规范,能够以简单的规范提供一种多线程间降
低数据交互量的算法,以实现在多线程间降低数据交互量的技术目的,从而进一步提高不
分线无缝世界中实时交互的效率以及玩家的游戏真实体验。
二装置12。
述线程池用于执行每帧都需执行的计算逻辑(也即需要按固定频率去执行的动态逻辑),而
并非每帧都需执行的逻辑由于对实时性要求不高,可分配到所述线程池以外的线程去执
行。
同类别的计算逻辑归纳为一个逻辑类别,得到N个逻辑类别,M大于N。在一些实施例中,一个
逻辑类别下的计算逻辑访问的属性都有相似性,不同的逻辑类别访问的属性是不同或不相
似的。在一些实施例中,通过归纳操作,能够将各种计算逻辑(战斗交互数据相关逻辑)的管
理器(比如AI管理器,技能管理器等)按照线程池中线程的数量,实现成多线程安全的管理
器,以使不同线程对该管理器的访问都具备数据安全性。
阶段也唯一对应一个逻辑类别;根据所述多个逻辑类别,确定线程池对应的多个阶段,也即
相当于将所述多个逻辑类别划分为多个阶段,以实现逻辑类别与阶段之间的绑定。在一些
实施例中,阶段划分的依据是逻辑类别是否相同,或者说,逻辑访问的属性是否具备相同性
或相似性。作为一个示例,将多人在线游戏中每帧都需执行的计算逻辑归纳为N个逻辑类
别,之后根据该N个逻辑类别定义线程池的N个阶段,其中,每个阶段唯一对应一个逻辑类
别。在一些实施例中,所述多个阶段的执行顺序,以及每个阶段绑定的逻辑类别中所包含的
各个计算逻辑的执行顺序都是固定的,上述顺序是按多人在线游戏的设计逻辑来确定的,
也即多人在线游戏的设计逻辑决定了阶段的划分和阶段内计算逻辑的顺序,多人在线游戏
的设计逻辑是指游戏类别、玩法等带来的策划和程序上的设计。
逻辑,且当执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步
执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行
完当前阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一
个阶段,直至所述多个阶段执行完毕。线程池按阶段执行的目的,是为了减少不同线程间的
数据同步次数;在一个阶段内,各线程需执行相同的逻辑,否则无法做到不需要用锁的方式
实现数据同步;在每个阶段内每个线程需要完成自己内部的数据修改以及用无锁队列完成
跨线程的数据修改(即同步)。
计算逻辑执行完之后,在之后的阶段中就不会修改相关属性,从而使得各个线程都可以直
接访问相关属性,而不需要加锁同步,也即,本申请能够通过把贯穿整个阶段的属性修改放
到一个阶段去执行完,以使后续其他阶段可以直接访问这些属性,而不需要加锁同步。
程去修改数据时,把修改行为转移到数据所在线程去修改,以在不同线程间访问共享数据
时实现数据同步,避免了不同线程修改共享数据。
有者并非该线程所绑定的角色,则该线程可将异步逻辑数据发送至该公共接口函数的函数
持有者所绑定的另一个线程对应的无锁队列中,以由该线程调用该公共接口函数来修改共
享数据,从而实现不同线程间访问共享数据时的同步;作为一个示例,线程池按帧按阶段执
行,在一个阶段中,线程T1将需要由线程T2异步执行的异步逻辑数据放入到线程T2对应的
无锁队列中,该异步逻辑数据包括公共接口函数F1及其传入参数M1和M2;线程T2在执行完
当前阶段绑定的计算逻辑后,检测到其无锁队列中存在等待异步执行的该异步逻辑数据,
则线程T2调用该公共接口函数F1来修改相应的数据,从而实现共享数据的同步。
类别中包含多个计算逻辑,每个阶段对应的逻辑类别以及每个逻辑类别中的各个计算逻辑
的执行顺序由多人在线游戏的设计逻辑来确定,则线程池在服务器每帧的运行逻辑如下:
第一个阶段开始,线程池激活其中的K个线程,每个线程执行第一个阶段绑定的逻辑类别中
的计算逻辑,当执行完第一个阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等
待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;当每个线程
均执行完第一个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时
(也即每个线程的无锁队列中都不存在等待异步执行的异步逻辑数据),开始第二个阶段;
第二个阶段开始后,线程池激活其中的K个线程,每个线程执行第二个阶段绑定的逻辑类别
中的计算逻辑,当执行完第二个阶段对应的计算逻辑后,检测本线程的无锁队列中是否有
等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;当每个线
程均执行完第二个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑
时,开始第三个阶段;以此类推,直至N个阶段执行完毕。
c)”来计算线程数,其中,Nthreads表示线程数,Ncpu表示CPU核心数,Ucpu表示CPU使用率,w
表示等待时间,c表示计算时间;又例如,基于公式“线程数=CPU核心数/(1‑阻塞系数)”来
计算线程数。本申请并不限制根据CPU核心数确定线程池中的线程数的具体实现方式,任何
能够用于根据CPU核心数确定线程池中的线程数的实现方式,均应包含在本申请的保护范
围内。
类别,将角色数据逻辑归纳为多个角色逻辑类别;根据所述多个管理逻辑类别和所述多个
角色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或
一个角色逻辑类别。在一些实施例中,角色逻辑类别的数量与管理逻辑类别的数量之和大
于或等于阶段数;在一些实施例中,分阶段处理每个逻辑类别;在一些实施例中,角色逻辑
类别和管理逻辑类别可以在同一个阶段重合。在一些实施例中,一个阶段可以唯一绑定一
个管理逻辑类别,或者唯一绑定一个角色逻辑类别,或者绑定一个管理逻辑类别和一个角
色逻辑类别;在一些实施例中,由于采用无锁队列来实现数据同步,为了保证数据安全,一
个阶段不能同时绑定两个及以上角色逻辑类别,也不能同时绑定两个及以上管理逻辑类
别。在一些实施例中,所述角色逻辑类别包括任何对与角色相关的计算逻辑进行归纳所得
到的逻辑类别,所述管理逻辑类别包括任何对于场景相关的计算逻辑性归纳所得到的逻辑
类别。在一些实施例中,基于角色数据逻辑归纳的角色逻辑类别至少包括以下任一项:
申请所述的角色逻辑类别的范围内。
按照场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个
线程。在一些实施例中,以场景和角色为单位,将角色数据逻辑和管理数据逻辑评分平分到
各个线程中,每个角色、每个场景在生命周期内都有唯一的绑定线程;作为一种具体实施方
式,每当一个角色或一个场景的生命周期开始,便会唯一绑定至一个线程,在绑定时,可获
取每个线程已绑定的角色数量和场景数量,并选择已绑定的角色数量和场景数量最少的线
程去绑定。在一些实施例中,角色的生命周期以角色登入游戏或被场景创建出来为开始,以
角色退出登录或离开场景或死亡为结束;可选地,可基于游戏设计来调整生命周期的定义,
也可针对不同的角色设置不同的生命周期算法,如玩家和NPC可采用不同的生命周期算法,
如玩家的生命周期以玩家登入游戏为开始并以玩家退出登录为结束,NPC的生命周期以被
场景创建出来为开始以死亡为结束。在一些实施例中,场景的生命周期以场景的创建为开
始,以创景的销毁为结束。
的,因此,仅能角色本身访问,也即只有数据所在的线程才有权限修改该数据,或者说,所有
的数据修改都在各自线程内。在一些实施例中,若在不同线程间访问共享数据(也即有数据
在不同线程间被同时修改),则需要数据同步,而由于数据都是私有的,只有数据所在的线
程才有权限修改该数据,则可在需要数据同步时,将数据修改需求(也即异步逻辑数据)放
入需要修改的数据所在的线程对应的无锁队列中,以使数据所在线程自己去修改该数据,
数据所在线程完成修改之后可与其他线程共享修改后的数据,基于此,也就实现了不同线
程间的数据同步,该实现方式能够避免由于不同线程修改共享数据而影响共享数据的安全
性。例如,线程池包括线程T1和线程T2,线程T2不能直接改T1线程的数据,若线程T2需要修
改T1中的数据,即需要数据同步,线程T2必须通过将数据修改需求放入线程T1对应的无锁
队列中,以使线程T1自己去修改该数据,线程T1修改该数据之后,可与线程T2共享修改后的
数据,由此也即实现了线程T1和线程T2之间的数据同步。
辑中的数据。在一些实施例中,角色数据逻辑的方法按照方法前缀,分为私有方法和公共方
法;私有方法仅在角色所绑定的线程中调用,只有公共方法才会在不同线程间调用,从而产
生多线程之间的数据交互。
执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若
是,继续执行该公共接口函数,以访问该计算逻辑中的数据;若否,将异步逻辑数据发送到
角色所绑定的线程的无锁队列中以等待异步执行,其中,所述异步逻辑数据包括该公共接
口函数及该公共接口函数对应的传入参数。所述公共接口函数也即相当于公共方法。在一
些实施例中,检测当前执行的线程是否为角色所绑定的线程,也即对接口函数进行线程安
全检查,作为一种具体实现方式,在每个阶段中,接口函数在开始执行时,需判断当前的函
数调用线程是否为在函数持有者所在线程,从而确定当前阶段的执行是否线程安全;如安
全,继续执行;如不安全,要实现将接口函数真正逻辑和参数打包到函数持有者所在线程的
无锁队列中,等待异步执行。作为一个示例,一个公共接口函数的函数持有者为角色A,线程
T1调用该公共接口函数时,先判断线程T1是否为该公共接口函数的角色A所绑定的线程,若
是,线程T1继续执行该公共接口函数,若否,将该公共接口函数以及其传入参数打包到角色
A所绑定的线程的无锁队列中,等待异步执行。通过在检测到当前执行的线程并非角色所绑
定的线程时转为异步执行,能够在不采用锁的情况下保证数据安全。
用。
于把大世界地图切割成无数的小地图,根据玩家所在的位置动态加载和释放各个小地图,
而基于本申请的系统,由于能够达到不分线来实现多人在线游戏无缝世界的目的,从而提
高玩家在游戏中的真实体验。
理器执行时,使得所述一个或多个处理器执行本申请所述的用于实现不分线无缝游戏世界
的方法。
NVM/存储设备1020)以及与该一个或多个计算机可读介质耦合并被配置为执行指令以实现
模块从而执行本申请中所述的动作的一个或多个处理器(例如,(一个或多个)处理器
1005)。
提供任意适当的接口。
例中,系统存储器1015可包括双倍数据速率类型四同步动态随机存取存储器(DDR4SDRAM)。
存储设备(例如,一个或多个硬盘驱动器(HDD)、一个或多个光盘(CD)驱动器和/或一个或多
个数字通用光盘(DVD)驱动器)。
可通过网络经由(一个或多个)通信接口1025进行访问。
意标准和/或协议来与无线网络的一个或多个组件进行无线通信。
(一个或多个)处理器1005中的至少一个可与系统控制模块1010的一个或多个控制器的逻
辑封装在一起以形成系统级封装(SiP)。对于一个实施例,(一个或多个)处理器1005中的至
少一个可与系统控制模块1010的一个或多个控制器的逻辑集成在同一模具上。对于一个实
施例,(一个或多个)处理器1005中的至少一个可与系统控制模块1010的一个或多个控制器
的逻辑集成在同一模具上以形成片上系统(SoC)。
中,系统1000可具有更多或更少的组件和/或不同的架构。例如,在一些实施例中,系统1000
包括一个或多个摄像机、键盘、液晶显示器(LCD)屏幕(包括触屏显示器)、非易失性存储器
端口、多个天线、图形芯片、专用集成电路(ASIC)和扬声器。
从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权
利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有
变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此
外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个
单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表
示名称,而并不表示任何特定的顺序。
所寻求的保护在所附权利要求书中做了阐述。在下列编号条款中规定了各个实施例的这些
和其他方面:
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
括:
包括:
计算逻辑中的数据;若否,将异步逻辑数据发送到角色所绑定的线程的无锁队列中以等待
异步执行,其中,所述异步逻辑数据包括该公共接口函数及该公共接口函数对应的传入参
数。
行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻
辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对
应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至
所述多个阶段执行完毕。
阶段的装置,用于:
阶段的装置,还用于:
计算逻辑中的数据;若否,将异步逻辑数据发送到角色所绑定的线程的无锁队列中以等待
异步执行,其中,所述异步逻辑数据包括该公共接口函数及该公共接口函数对应的传入参
数。