一种用于实现不分线无缝游戏世界的方法和装置转让专利

申请号 : CN202010165979.3

文献号 : CN111459626B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郭鹏

申请人 : 完美世界(北京)软件科技发展有限公司

摘要 :

本申请提供了一种用于实现不分线无缝游戏世界的方法和装置,该方法包括:将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段;线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶段执行完毕。

权利要求 :

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中任一项所述的方法。

说明书 :

一种用于实现不分线无缝游戏世界的方法和装置

技术领域

[0001] 本申请涉及计算机技术领域,尤其涉及一种用于实现不分线无缝游戏世界的技术方案。

背景技术

[0002] 现有技术中,MMORPG(Massive Multiplayer Online Role‑Playing Game,多人在线游戏)通常仅能通过分线来在一个场景中承载大量玩家。分线是指将切分后的每个地图
场景再复制出多个一模一样的附属地图场景分别运行在不同的场景服务进程或者线程中,
基于分线来在一个场景中承载大量玩家的方案,在相同位置,不同线的人相互看不到对方,
玩家如果想在同一个地方看到对方,必须约定登陆进同一个线或者选择切换到同一个线,
这无疑会给玩家带来诸多不便,游戏体验较差。

发明内容

[0003] 本申请的目的是提供一种用于实现不分线无缝游戏世界的技术方案。
[0004] 根据本申请的一个实施例,提供一种用于实现不分线无缝游戏世界的方法,其中,所述方法包括:
[0005] 将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段;
[0006] 线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
[0007] 根据本申请的另一个实施例,还提供了一种用于实现不分线无缝游戏世界的装置,其中,所述装置包括:
[0008] 将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段;
[0009] 线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
[0010] 根据本申请的另一个实施例,还提供了一种设备,其中,所述设备包括:存储器,用于存储一个或多个程序;一个或多个处理器,与所述存储器相连,当所述一个或多个程序被
所述一个或者多个处理器执行时,使得所述一个或多个处理器执行如下操作:
[0011] 一种用于实现不分线无缝游戏世界的方法,其中,所述方法包括:
[0012] 将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段;
[0013] 线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
[0014] 根据本申请的另一个实施例,还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序可被处理器执行如下操作:
[0015] 一种用于实现不分线无缝游戏世界的方法,其中,所述方法包括:
[0016] 将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段;
[0017] 线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
[0018] 与现有技术相比,本申请具有以下优点:能够将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多
个阶段,之后使线程池每帧按阶段执行,由于只有在阶段切换时才同步不同线程间的数据,
使得能极大地降低同步数,以有限的阶段同步数去最大限度的利用CPU(central 
processing unit,中央处理器)多核性能,并且,通过在多人在线游戏中按帧按阶段同步线
程间逻辑,能够充分利用好每个线程的顺序执行能力,尽可能的减少线程之间的锁的行为,
且进一步地通过使用无锁队列来用于线程间的数据传递,能够实现数据同步并保证同步效
率和安全性,从而达到不分线来实现多人在线游戏无缝世界的目的,提高玩家的游戏真实
体验;此外,通过使用本申请中关于计算逻辑相关类的编程规范,也即计算逻辑中的数据和
方法的相关规范,能够以简单的规范实现在多线程间降低数据交互量的技术目的,以实现
具有更高的实时交互效率的不分线无缝世界,进一步提高玩家的游戏真实体验。

附图说明

[0019] 通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
[0020] 图1示出了本申请一个实施例的用于实现不分线无缝游戏世界的方法的流程示意图;
[0021] 图2示出了本申请一个实施例的用于实现不分线无缝游戏世界的装置的结构示意图;
[0022] 图3示出了可被用于实施本申请中所述的各个实施例的示例性系统。
[0023] 附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

[0024] 在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作描述成顺序的处理,但是其中的许
多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其
操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理
可以对应于方法、函数、规程、子例程、子程序等等。
[0025] 在上下文中所称“设备”,是指可以通过运行预定程序或指令来执行数值计算和/或逻辑计算等预定处理过程的智能电子设备,其可以包括处理器与存储器,由处理器执行
在存储器中预存的程序指令来执行预定处理过程,或是由专用集成电路(ASIC)、现场可编
程门阵列(FPGA)、数字信号处理器(DSP)等硬件执行预定处理过程,或是由上述二者组合来
实现。
[0026] 本申请的技术方案主要由计算机设备来实现。其中,所述计算机设备包括但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算(Cloud Computing)的
由大量计算机或网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合
的计算机集组成的一个超级虚拟计算机。其中,所述计算机设备可单独运行来实现本申请,
也可接入网络并通过与网络中的其他计算机设备的交互操作来实现本申请。其中,所述计
算机设备所处的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络、无线自组织
网络(Ad Hoc网络)等。
[0027] 需要说明的是,上述计算机设备仅为举例,其他现有的或今后可能出现的计算机设备如可适用于本申请,也应包含在本申请保护范围以内,并以引用方式包含于此。
[0028] 本文后面所讨论的方法(其中一些通过流程图示出)可以通过硬件、软件、固件、中间件、微代码、硬件描述语言或者其任意组合来实施。当用软件、固件、中间件或微代码来实
施时,用以实施必要任务的程序代码或代码段可以被存储在机器或计算机可读介质(比如
存储介质)中。(一个或多个)处理器可以实施必要的任务。
[0029] 这里所公开的具体结构和功能细节仅仅是代表性的,并且是用于描述本申请的示例性实施例的目的。但是本申请可以通过许多替换形式来具体实现,并且不应当被解释成
仅仅受限于这里所阐述的实施例。
[0030] 应当理解的是,虽然在这里可能使用了术语“第一”、“第二”等等来描述各个单元,但是这些单元不应当受这些术语限制。使用这些术语仅仅是为了将一个单元与另一个单元
进行区分。举例来说,在不背离示例性实施例的范围的情况下,第一单元可以被称为第二单
元,并且类似地第二单元可以被称为第一单元。这里所使用的术语“和/或”包括其中一个或
更多所列出的相关联项目的任意和所有组合。
[0031] 这里所使用的术语仅仅是为了描述具体实施例而不意图限制示例性实施例。除非上下文明确地另有所指,否则这里所使用的单数形式“一个”、“一项”还意图包括复数。还应
当理解的是,这里所使用的术语“包括”和/或“包含”规定所陈述的特征、整数、步骤、操作、
单元和/或组件的存在,而不排除存在或添加一个或更多其他特征、整数、步骤、操作、单元、
组件和/或其组合。
[0032] 还应当提到的是,在一些替换实现方式中,所提到的功能/动作可以按照不同于附图中标示的顺序发生。举例来说,取决于所涉及的功能/动作,相继示出的两幅图实际上可
以基本上同时执行或者有时可以按照相反的顺序来执行。
[0033] 下面结合附图对本申请作进一步详细描述。
[0034] 在描述本申请的方案之前,首先对本申请上下文中提及的一些概念进行如下解释:1)本申请的方案主要由多人在线游戏的服务器来实施;在一些实施例中,多人在线游戏
的服务器包括主服务器以及分别用于处理不同业务数据的多种服务器,本实施例的方案主
要由用于处理战斗业务数据的战斗服务器来实施;2)本申请中所涉及的帧均是指多人在线
游戏的服务器端的帧(也称为服务器帧),服务器端的帧仅在服务器上运行,代表了服务器
的运行逻辑,需要说明的是,服务器端的帧与客户端的渲染帧是完全不同的概念;3)本申请
中所述的角色是指多人在线游戏中角色,包括但不限于玩家和NPC(Non‑Player 
Character,非玩家角色),角色数据逻辑是指与角色对应的角色数据相关的逻辑,如与角色
属性相关的计算逻辑,角色逻辑类别是指对角色数据逻辑进行归纳得到的逻辑类别;4)本
申请中所述的场景是指多人在线游戏中的游戏场景,如游戏中某块地图中的某一个战斗场
景,管理数据逻辑是指与场景对应的管理数据相关的逻辑,通常为与场景相关的全局逻辑,
如控制场景中的NPC数量的逻辑、给进入此场景的玩家加buff(增益)的逻辑等,管理逻辑类
别是指对管理数据逻辑进行归纳得到的逻辑类别。
[0035] 图1示出了本申请一个实施例的用于实现不分线无缝游戏世界的方法的流程示意图。本实施例的方法包括步骤S11和步骤S12。在步骤S11中,将多人在线游戏的服务器中每
帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应
的多个阶段;在步骤S12中,线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个
阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且
当执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异
步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶
段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,
直至所述多个阶段执行完毕。
[0036] 在步骤S11中,将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段。
[0037] 在一些实施例中,在所述步骤S11之前创建线程池,所述线程池中的线程数是固定的,创建线程池的实现方式将在后续实施例中予以详述;在一些实施例中,所述线程池用于
执行每帧都需执行的计算逻辑(也即需要按固定频率去执行的动态逻辑),而并非每帧都需
执行的逻辑由于对实时性要求不高,可分配到所述线程池以外的线程去执行。
[0038] 在一些实施例中,将服务器中每帧都需执行的计算逻辑中属于相同类别的计算逻辑归纳为一个逻辑类别,例如,每帧都需执行的计算逻辑有M个,将该M个计算逻辑中属于相
同类别的计算逻辑归纳为一个逻辑类别,得到N个逻辑类别,M大于N。在一些实施例中,一个
逻辑类别下的计算逻辑访问的属性都有相似性,不同的逻辑类别访问的属性是不同或不相
似的。在一些实施例中,通过归纳操作,能够将各种计算逻辑(战斗交互数据相关逻辑)的管
理器(比如AI管理器,技能管理器等)按照线程池中线程的数量,实现成多线程安全的管理
器,以使不同线程对该管理器的访问都具备数据安全性。
[0039] 在一些实施例中,根据归纳得到的多个逻辑类别,来定义线程池的阶段数,其中,线程池的阶段数小于等于逻辑类别的数量,一个逻辑类别唯一绑定一个阶段;优选地,一个
阶段也唯一对应一个逻辑类别;根据所述多个逻辑类别,确定线程池对应的多个阶段,也即
相当于将所述多个逻辑类别划分为多个阶段,以实现逻辑类别与阶段之间的绑定。在一些
实施例中,阶段划分的依据是逻辑类别是否相同,或者说,逻辑访问的属性是否具备相同性
或相似性。作为一个示例,将多人在线游戏中每帧都需执行的计算逻辑归纳为N个逻辑类
别,之后根据该N个逻辑类别定义线程池的N个阶段,其中,每个阶段唯一对应一个逻辑类
别。在一些实施例中,所述多个阶段的执行顺序,以及每个阶段绑定的逻辑类别中所包含的
各个计算逻辑的执行顺序都是固定的,上述顺序是按多人在线游戏的设计逻辑来确定的,
也即多人在线游戏的设计逻辑决定了阶段的划分和阶段内计算逻辑的顺序,多人在线游戏
的设计逻辑是指游戏类别、玩法等带来的策划和程序上的设计。
[0040] 在步骤S12中,线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当
执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步
逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段
对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直
至所述多个阶段执行完毕。线程池按阶段执行的目的,是为了减少不同线程间的数据同步
次数;在一个阶段内,各线程需执行相同的逻辑,否则无法做到不需要用锁的方式实现数据
同步;在每个阶段内每个线程需要完成自己内部的数据修改以及用无锁队列完成跨线程的
数据修改(即同步)。
[0041] 在一些实施例中,每帧中,每个线程在同一个阶段中执行同一个逻辑类别(也即执行相同逻辑),由于一个逻辑类别下的计算逻辑访问的属性都有相似性,因此,同一类别的
计算逻辑执行完之后,在之后的阶段中就不会修改相关属性,从而使得各个线程都可以直
接访问相关属性,而不需要加锁同步,也即,本申请能够通过把贯穿整个阶段的属性修改放
到一个阶段去执行完,以使后续其他阶段可以直接访问这些属性,而不需要加锁同步。
[0042] 在一些实施例中,使用无锁队列来用于线程间的数据传递,以实现数据同步并保证速度和安全性;无锁队列用于将计算逻辑放到其所在的线程去执行,能够在需要不同线
程去修改数据时,把修改行为转移到数据所在线程去修改,以在不同线程间访问共享数据
时实现数据同步,避免了不同线程修改共享数据。
[0043] 在一些实施例中,所述异步逻辑数据是指需要本线程异步执行的逻辑数据,当线程池中一个线程需要通过一个公共函数接口访问共享数据时,若该公共接口函数的函数持
有者并非该线程所绑定的角色,则该线程可将异步逻辑数据发送至该公共接口函数的函数
持有者所绑定的另一个线程对应的无锁队列中,以由该线程调用该公共接口函数来修改共
享数据,从而实现不同线程间访问共享数据时的同步;作为一个示例,线程池按帧按阶段执
行,在一个阶段中,线程T1将需要由线程T2异步执行的异步逻辑数据放入到线程T2对应的
无锁队列中,该异步逻辑数据包括公共接口函数F1及其传入参数M1和M2;线程T2在执行完
当前阶段绑定的计算逻辑后,检测到其无锁队列中存在等待异步执行的该异步逻辑数据,
则线程T2调用该公共接口函数F1来修改相应的数据,从而实现共享数据的同步。
[0044] 作为步骤S12的一个示例,线程池中包括K个线程,根据帧逻辑划分得到线程池对应的N个阶段,其中,每个阶段唯一对应一个逻辑类别,且一个逻辑类别唯一对应一个阶段,
每个逻辑类别中包含多个计算逻辑,每个阶段对应的逻辑类别以及每个逻辑类别中的各个
计算逻辑的执行顺序由多人在线游戏的设计逻辑来确定,则线程池在服务器每帧的运行逻
辑如下:第一个阶段开始,线程池激活其中的K个线程,每个线程执行第一个阶段绑定的逻
辑类别中的计算逻辑,当执行完第一个阶段对应的计算逻辑后,检测本线程的无锁队列中
是否有等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;当
每个线程均执行完第一个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异
步逻辑时(也即每个线程的无锁队列中都不存在等待异步执行的异步逻辑数据),开始第二
个阶段;第二个阶段开始后,线程池激活其中的K个线程,每个线程执行第二个阶段绑定的
逻辑类别中的计算逻辑,当执行完第二个阶段对应的计算逻辑后,检测本线程的无锁队列
中是否有等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;
当每个线程均执行完第二个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的
异步逻辑时,开始第三个阶段;以此类推,直至N个阶段执行完毕。
[0045] 在一些实施例中,所述方法还包括:创建所述线程池,其中,所述线程池中的线程数是根据CPU核心数确定的。例如,基于公式“Nthreads=Ncpu*Ucpu*(1+w/c)”来计算线程
数,其中,Nthreads表示线程数,Ncpu表示CPU核心数,Ucpu表示CPU使用率,w表示等待时间,
c表示计算时间;又例如,基于公式“线程数=CPU核心数/(1‑阻塞系数)”来计算线程数。本
申请并不限制根据CPU核心数确定线程池中的线程数的具体实现方式,任何能够用于根据
CPU核心数确定线程池中的线程数的实现方式,均应包含在本申请的保护范围内。
[0046] 在一些实施例中,所述步骤S11包括:将多人在线游戏的服务器中每帧都需执行的计算逻辑划分为管理数据逻辑和角色数据逻辑;将管理数据逻辑归纳为多个管理逻辑类
别,将角色数据逻辑归纳为多个角色逻辑类别;根据所述多个管理逻辑类别和所述多个角
色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或一
个角色逻辑类别。在一些实施例中,角色逻辑类别的数量与管理逻辑类别的数量之和大于
或等于阶段数;在一些实施例中,分阶段处理每个逻辑类别;在一些实施例中,角色逻辑类
别和管理逻辑类别可以在同一个阶段重合。在一些实施例中,一个阶段可以唯一绑定一个
管理逻辑类别,或者唯一绑定一个角色逻辑类别,或者绑定一个管理逻辑类别和一个角色
逻辑类别;在一些实施例中,由于采用无锁队列来实现数据同步,为了保证数据安全,一个
阶段不能同时绑定两个及以上角色逻辑类别,也不能同时绑定两个及以上管理逻辑类别。
在一些实施例中,所述角色逻辑类别包括任何对与角色相关的计算逻辑进行归纳所得到的
逻辑类别,所述管理逻辑类别包括任何对于场景相关的计算逻辑性归纳所得到的逻辑类
别。
[0047] 在一些实施例中,基于角色数据逻辑归纳的角色逻辑类别至少包括以下任一项:
[0048] 1)属性计算逻辑
[0049] 所述属性计算逻辑包括与角色属性相关的任何计算逻辑,如与角色力量相关的计算逻辑、与角色智力相关的计算逻辑等。
[0050] 2)视野同步逻辑
[0051] 所述视野同步逻辑包括与角色的视野同步相关的任何逻辑,如玩家移动时视野的变化逻辑等。
[0052] 3)网络协议处理逻辑
[0053] 所述网络协议处理逻辑包括与网络协议处理相关的任何逻辑。
[0054] 4)战斗交互逻辑
[0055] 所述战斗交互逻辑包括与战斗交互相关的任何逻辑,如与角色移动相关的逻辑、与技能释放相关的逻辑等。
[0056] 需要说明的是,上述角色逻辑类别仅为举例,而非对本发明的限制,任何通过将访问的属性相同或相似或相关联的角色数据逻辑归为一类所获得的逻辑类别,均应包含在本
申请所述的角色逻辑类别的范围内。
[0057] 在一些实施例中,所述步骤S11还包括:将角色数据逻辑按照角色数量平分到线程池的各个线程中,其中,每个角色在生命周期内唯一绑定至一个线程;将管理数据逻辑按照
场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个线程。
在一些实施例中,以场景和角色为单位,将角色数据逻辑和管理数据逻辑评分平分到各个
线程中,每个角色、每个场景在生命周期内都有唯一的绑定线程;作为一种具体实施方式,
每当一个角色或一个场景的生命周期开始,便会唯一绑定至一个线程,在绑定时,可获取每
个线程已绑定的角色数量和场景数量,并选择已绑定的角色数量和场景数量最少的线程去
绑定。在一些实施例中,角色的生命周期以角色登入游戏或被场景创建出来为开始,以角色
退出登录或离开场景或死亡为结束;可选地,可基于游戏设计来调整生命周期的定义,也可
针对不同的角色设置不同的生命周期算法,如玩家和NPC可采用不同的生命周期算法,如玩
家的生命周期以玩家登入游戏为开始并以玩家退出登录为结束,NPC的生命周期以被场景
创建出来为开始以死亡为结束。在一些实施例中,场景的生命周期以场景的创建为开始,以
创景的销毁为结束。
[0058] 在一些实施例中,每个计算逻辑中的数据均为私有,数据的访问只能通过接口函数去实现。例如,角色数据逻辑基于数据和方法(也即接口函数)去实现,由于数据是私有
的,因此,仅能角色本身访问,也即只有数据所在的线程才有权限修改该数据,或者说,所有
的数据修改都在各自线程内。在一些实施例中,若在不同线程间访问共享数据(也即有数据
在不同线程间被同时修改),则需要数据同步,而由于数据都是私有的,只有数据所在的线
程才有权限修改该数据,则可在需要数据同步时,将数据修改需求(也即异步逻辑数据)放
入需要修改的数据所在的线程对应的无锁队列中,以使数据所在线程自己去修改该数据,
数据所在线程完成修改之后可与其他线程共享修改后的数据,基于此,也就实现了不同线
程间的数据同步,该实现方式能够避免由于不同线程修改共享数据而影响共享数据的安全
性。例如,线程池包括线程T1和线程T2,线程T2不能直接改T1线程的数据,若线程T2需要修
改T1中的数据,即需要数据同步,线程T2必须通过将数据修改需求放入线程T1对应的无锁
队列中,以使线程T1自己去修改该数据,线程T1修改该数据之后,可与线程T2共享修改后的
数据,由此也即实现了线程T1和线程T2之间的数据同步。
[0059] 在一些实施例中,所述每个线程执行当前阶段对应的逻辑类别中的计算逻辑,包括:对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻
辑中的数据。在一些实施例中,角色数据逻辑的方法按照方法前缀,分为私有方法和公共方
法;私有方法仅在角色所绑定的线程中调用,只有公共方法才会在不同线程间调用,从而产
生多线程之间的数据交互。
[0060] 在一些实施例中,所述对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据,包括:对于角色逻辑类别中的每个计算逻辑,在
执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若
是,继续执行该公共接口函数,以访问该计算逻辑中的数据;若否,将异步逻辑数据发送到
角色所绑定的线程的无锁队列中以等待异步执行,其中,所述异步逻辑数据包括该公共接
口函数及该公共接口函数对应的传入参数。所述公共接口函数也即相当于公共方法。在一
些实施例中,检测当前执行的线程是否为角色所绑定的线程,也即对接口函数进行线程安
全检查,作为一种具体实现方式,在每个阶段中,接口函数在开始执行时,需判断当前的函
数调用线程是否为在函数持有者所在线程,从而确定当前阶段的执行是否线程安全;如安
全,继续执行;如不安全,要实现将接口函数真正逻辑和参数打包到函数持有者所在线程的
无锁队列中,等待异步执行。作为一个示例,一个公共接口函数的函数持有者为角色A,线程
T1调用该公共接口函数时,先判断线程T1是否为该公共接口函数的角色A所绑定的线程,若
是,线程T1继续执行该公共接口函数,若否,将该公共接口函数以及其传入参数打包到角色
A所绑定的线程的无锁队列中,等待异步执行。通过在检测到当前执行的线程并非角色所绑
定的线程时转为异步执行,能够在不采用锁的情况下保证数据安全。
[0061] 需要说明的是,场景的数据同样是私有的,但不同场景之间并不会发生交互;由于一个场景在其生命周期内被唯一绑定至一个线程,因此,并不会存在场景数据的跨线程调
用。
[0062] 现有技术中,MMORPG通常仅能通过分线来在一个场景中承载大量玩家。分线是指将切分后的每个地图场景再复制出多个一模一样的附属地图场景分别运行在不同的场景
服务进程或者线程中,基于分线来在一个场景中承载大量玩家的方案,在相同位置,不同线
的人相互看不到对方,玩家若在同一个地方看到对方,必须约定登陆进同一个线或者选择
切换到同一个线,这无疑会给玩家带来诸多不便,游戏体验较差。
[0063] 本申请发现,现有技术中通常选择分线来在一个场景中承载大量玩家是因为,若不分线,服务器在每帧计算内要在不同线程间同步大量玩家(如几千个甚至上万个)的数
据,而同步量越大效率就越低,程序复杂性就越高,编程就更困难。
[0064] 根据本实施例的方案,能够将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段,之后使线程
池每帧按阶段执行,由于只有在阶段切换时才同步不同线程间的数据,使得能极大地降低
同步数,以有限的阶段同步数去最大限度的利用CPU多核性能,并且,通过在多人在线游戏
的服务器中按帧按阶段同步线程间逻辑,能够充分利用好每个线程的顺序执行能力,尽可
能的减少线程之间的锁的行为,且进一步地通过使用无锁队列来用于线程间的数据传递,
能够实现数据同步并保证同步效率和安全性,从而达到不分线来实现多人在线游戏无缝世
界的目的,提高玩家的游戏真实体验;此外,通过使用本申请中关于计算逻辑相关类的编程
规范,也即计算逻辑中的数据和方法的相关规范,能够以简单的规范提供一种多线程间降
低数据交互量的算法,以实现在多线程间降低数据交互量的技术目的,从而进一步提高不
分线无缝世界中实时交互的效率以及玩家的游戏真实体验。
[0065] 图2示出了本申请一个实施例的用于实现不分线无缝游戏世界的装置的结构示意图。该用于实现不分线无缝游戏世界的装置(以下简称为不分线装置)包括第一装置11和第
二装置12。
[0066] 所述第一装置11用于将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段。
[0067] 在一些实施例中,在所述第一装置11执行操作之前创建线程池,所述线程池中的线程数是固定的,创建线程池的实现方式将在后续实施例中予以详述;在一些实施例中,所
述线程池用于执行每帧都需执行的计算逻辑(也即需要按固定频率去执行的动态逻辑),而
并非每帧都需执行的逻辑由于对实时性要求不高,可分配到所述线程池以外的线程去执
行。
[0068] 在一些实施例中,将服务器中每帧都需执行的计算逻辑中属于相同类别的计算逻辑归纳为一个逻辑类别,例如,每帧都需执行的计算逻辑有M个,将该M个计算逻辑中属于相
同类别的计算逻辑归纳为一个逻辑类别,得到N个逻辑类别,M大于N。在一些实施例中,一个
逻辑类别下的计算逻辑访问的属性都有相似性,不同的逻辑类别访问的属性是不同或不相
似的。在一些实施例中,通过归纳操作,能够将各种计算逻辑(战斗交互数据相关逻辑)的管
理器(比如AI管理器,技能管理器等)按照线程池中线程的数量,实现成多线程安全的管理
器,以使不同线程对该管理器的访问都具备数据安全性。
[0069] 在一些实施例中,根据归纳得到的多个逻辑类别,来定义线程池的阶段数,其中,线程池的阶段数小于等于逻辑类别的数量,一个逻辑类别唯一绑定一个阶段;优选地,一个
阶段也唯一对应一个逻辑类别;根据所述多个逻辑类别,确定线程池对应的多个阶段,也即
相当于将所述多个逻辑类别划分为多个阶段,以实现逻辑类别与阶段之间的绑定。在一些
实施例中,阶段划分的依据是逻辑类别是否相同,或者说,逻辑访问的属性是否具备相同性
或相似性。作为一个示例,将多人在线游戏中每帧都需执行的计算逻辑归纳为N个逻辑类
别,之后根据该N个逻辑类别定义线程池的N个阶段,其中,每个阶段唯一对应一个逻辑类
别。在一些实施例中,所述多个阶段的执行顺序,以及每个阶段绑定的逻辑类别中所包含的
各个计算逻辑的执行顺序都是固定的,上述顺序是按多人在线游戏的设计逻辑来确定的,
也即多人在线游戏的设计逻辑决定了阶段的划分和阶段内计算逻辑的顺序,多人在线游戏
的设计逻辑是指游戏类别、玩法等带来的策划和程序上的设计。
[0070] 所述第二装置12用于使线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算
逻辑,且当执行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步
执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行
完当前阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一
个阶段,直至所述多个阶段执行完毕。线程池按阶段执行的目的,是为了减少不同线程间的
数据同步次数;在一个阶段内,各线程需执行相同的逻辑,否则无法做到不需要用锁的方式
实现数据同步;在每个阶段内每个线程需要完成自己内部的数据修改以及用无锁队列完成
跨线程的数据修改(即同步)。
[0071] 在一些实施例中,每帧中,每个线程在同一个阶段中执行同一个逻辑类别(也即执行相同逻辑),由于一个逻辑类别下的计算逻辑访问的属性都有相似性,因此,同一类别的
计算逻辑执行完之后,在之后的阶段中就不会修改相关属性,从而使得各个线程都可以直
接访问相关属性,而不需要加锁同步,也即,本申请能够通过把贯穿整个阶段的属性修改放
到一个阶段去执行完,以使后续其他阶段可以直接访问这些属性,而不需要加锁同步。
[0072] 在一些实施例中,使用无锁队列来用于线程间的数据传递,以实现数据同步并保证速度和安全性;无锁队列用于将计算逻辑放到其所在的线程去执行,能够在需要不同线
程去修改数据时,把修改行为转移到数据所在线程去修改,以在不同线程间访问共享数据
时实现数据同步,避免了不同线程修改共享数据。
[0073] 在一些实施例中,所述异步逻辑数据是指需要本线程异步执行的逻辑数据,当线程池中一个线程需要通过一个公共函数接口访问共享数据时,若该公共接口函数的函数持
有者并非该线程所绑定的角色,则该线程可将异步逻辑数据发送至该公共接口函数的函数
持有者所绑定的另一个线程对应的无锁队列中,以由该线程调用该公共接口函数来修改共
享数据,从而实现不同线程间访问共享数据时的同步;作为一个示例,线程池按帧按阶段执
行,在一个阶段中,线程T1将需要由线程T2异步执行的异步逻辑数据放入到线程T2对应的
无锁队列中,该异步逻辑数据包括公共接口函数F1及其传入参数M1和M2;线程T2在执行完
当前阶段绑定的计算逻辑后,检测到其无锁队列中存在等待异步执行的该异步逻辑数据,
则线程T2调用该公共接口函数F1来修改相应的数据,从而实现共享数据的同步。
[0074] 作为一个示例,线程池中包括K个线程,根据帧逻辑划分得到线程池对应的N个阶段,其中,每个阶段唯一对应一个逻辑类别,且一个逻辑类别唯一对应一个阶段,每个逻辑
类别中包含多个计算逻辑,每个阶段对应的逻辑类别以及每个逻辑类别中的各个计算逻辑
的执行顺序由多人在线游戏的设计逻辑来确定,则线程池在服务器每帧的运行逻辑如下:
第一个阶段开始,线程池激活其中的K个线程,每个线程执行第一个阶段绑定的逻辑类别中
的计算逻辑,当执行完第一个阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等
待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;当每个线程
均执行完第一个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时
(也即每个线程的无锁队列中都不存在等待异步执行的异步逻辑数据),开始第二个阶段;
第二个阶段开始后,线程池激活其中的K个线程,每个线程执行第二个阶段绑定的逻辑类别
中的计算逻辑,当执行完第二个阶段对应的计算逻辑后,检测本线程的无锁队列中是否有
等待异步执行的异步逻辑数据,若有则执行所述异步逻辑数据以进行数据同步;当每个线
程均执行完第二个阶段对应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑
时,开始第三个阶段;以此类推,直至N个阶段执行完毕。
[0075] 在一些实施例中,所述不分线装置还包括用于创建所述线程池的装置,其中,所述线程池中的线程数是根据CPU核心数确定的。例如,基于公式“Nthreads=Ncpu*Ucpu*(1+w/
c)”来计算线程数,其中,Nthreads表示线程数,Ncpu表示CPU核心数,Ucpu表示CPU使用率,w
表示等待时间,c表示计算时间;又例如,基于公式“线程数=CPU核心数/(1‑阻塞系数)”来
计算线程数。本申请并不限制根据CPU核心数确定线程池中的线程数的具体实现方式,任何
能够用于根据CPU核心数确定线程池中的线程数的实现方式,均应包含在本申请的保护范
围内。
[0076] 在一些实施例中,所述第一装置11用于:将多人在线游戏的服务器中每帧都需执行的计算逻辑划分为管理数据逻辑和角色数据逻辑;将管理数据逻辑归纳为多个管理逻辑
类别,将角色数据逻辑归纳为多个角色逻辑类别;根据所述多个管理逻辑类别和所述多个
角色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或
一个角色逻辑类别。在一些实施例中,角色逻辑类别的数量与管理逻辑类别的数量之和大
于或等于阶段数;在一些实施例中,分阶段处理每个逻辑类别;在一些实施例中,角色逻辑
类别和管理逻辑类别可以在同一个阶段重合。在一些实施例中,一个阶段可以唯一绑定一
个管理逻辑类别,或者唯一绑定一个角色逻辑类别,或者绑定一个管理逻辑类别和一个角
色逻辑类别;在一些实施例中,由于采用无锁队列来实现数据同步,为了保证数据安全,一
个阶段不能同时绑定两个及以上角色逻辑类别,也不能同时绑定两个及以上管理逻辑类
别。在一些实施例中,所述角色逻辑类别包括任何对与角色相关的计算逻辑进行归纳所得
到的逻辑类别,所述管理逻辑类别包括任何对于场景相关的计算逻辑性归纳所得到的逻辑
类别。在一些实施例中,基于角色数据逻辑归纳的角色逻辑类别至少包括以下任一项:
[0077] 1)属性计算逻辑
[0078] 所述属性计算逻辑包括与角色属性相关的任何计算逻辑,如与角色力量相关的计算逻辑、与角色智力相关的计算逻辑等。
[0079] 2)视野同步逻辑
[0080] 所述视野同步逻辑包括与角色的视野同步相关的任何逻辑,如玩家移动时视野的变化逻辑等。
[0081] 3)网络协议处理逻辑
[0082] 所述网络协议处理逻辑包括与网络协议处理相关的任何逻辑。
[0083] 4)战斗交互逻辑
[0084] 所述战斗交互逻辑包括与战斗交互相关的任何逻辑,如与角色移动相关的逻辑、与技能释放相关的逻辑等。
[0085] 需要说明的是,上述角色逻辑类别仅为举例,而非对本发明的限制,任何通过将访问的属性相同或相似或相关联的角色数据逻辑归为一类所获得的逻辑类别,均应包含在本
申请所述的角色逻辑类别的范围内。
[0086] 在一些实施例中,所述第一装置11还用于:将角色数据逻辑按照角色数量平分到线程池的各个线程中,其中,每个角色在生命周期内唯一绑定至一个线程;将管理数据逻辑
按照场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个
线程。在一些实施例中,以场景和角色为单位,将角色数据逻辑和管理数据逻辑评分平分到
各个线程中,每个角色、每个场景在生命周期内都有唯一的绑定线程;作为一种具体实施方
式,每当一个角色或一个场景的生命周期开始,便会唯一绑定至一个线程,在绑定时,可获
取每个线程已绑定的角色数量和场景数量,并选择已绑定的角色数量和场景数量最少的线
程去绑定。在一些实施例中,角色的生命周期以角色登入游戏或被场景创建出来为开始,以
角色退出登录或离开场景或死亡为结束;可选地,可基于游戏设计来调整生命周期的定义,
也可针对不同的角色设置不同的生命周期算法,如玩家和NPC可采用不同的生命周期算法,
如玩家的生命周期以玩家登入游戏为开始并以玩家退出登录为结束,NPC的生命周期以被
场景创建出来为开始以死亡为结束。在一些实施例中,场景的生命周期以场景的创建为开
始,以创景的销毁为结束。
[0087] 在一些实施例中,每个计算逻辑中的数据均为私有。,数据的访问只能通过接口函数去实现。例如,角色数据逻辑基于数据和方法(也即接口函数)去实现,由于数据是私有
的,因此,仅能角色本身访问,也即只有数据所在的线程才有权限修改该数据,或者说,所有
的数据修改都在各自线程内。在一些实施例中,若在不同线程间访问共享数据(也即有数据
在不同线程间被同时修改),则需要数据同步,而由于数据都是私有的,只有数据所在的线
程才有权限修改该数据,则可在需要数据同步时,将数据修改需求(也即异步逻辑数据)放
入需要修改的数据所在的线程对应的无锁队列中,以使数据所在线程自己去修改该数据,
数据所在线程完成修改之后可与其他线程共享修改后的数据,基于此,也就实现了不同线
程间的数据同步,该实现方式能够避免由于不同线程修改共享数据而影响共享数据的安全
性。例如,线程池包括线程T1和线程T2,线程T2不能直接改T1线程的数据,若线程T2需要修
改T1中的数据,即需要数据同步,线程T2必须通过将数据修改需求放入线程T1对应的无锁
队列中,以使线程T1自己去修改该数据,线程T1修改该数据之后,可与线程T2共享修改后的
数据,由此也即实现了线程T1和线程T2之间的数据同步。
[0088] 在一些实施例中,所述每个线程执行当前阶段对应的逻辑类别中的计算逻辑,包括:对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻
辑中的数据。在一些实施例中,角色数据逻辑的方法按照方法前缀,分为私有方法和公共方
法;私有方法仅在角色所绑定的线程中调用,只有公共方法才会在不同线程间调用,从而产
生多线程之间的数据交互。
[0089] 在一些实施例中,所述对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据,包括:对于角色逻辑类别中的每个计算逻辑,在
执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若
是,继续执行该公共接口函数,以访问该计算逻辑中的数据;若否,将异步逻辑数据发送到
角色所绑定的线程的无锁队列中以等待异步执行,其中,所述异步逻辑数据包括该公共接
口函数及该公共接口函数对应的传入参数。所述公共接口函数也即相当于公共方法。在一
些实施例中,检测当前执行的线程是否为角色所绑定的线程,也即对接口函数进行线程安
全检查,作为一种具体实现方式,在每个阶段中,接口函数在开始执行时,需判断当前的函
数调用线程是否为在函数持有者所在线程,从而确定当前阶段的执行是否线程安全;如安
全,继续执行;如不安全,要实现将接口函数真正逻辑和参数打包到函数持有者所在线程的
无锁队列中,等待异步执行。作为一个示例,一个公共接口函数的函数持有者为角色A,线程
T1调用该公共接口函数时,先判断线程T1是否为该公共接口函数的角色A所绑定的线程,若
是,线程T1继续执行该公共接口函数,若否,将该公共接口函数以及其传入参数打包到角色
A所绑定的线程的无锁队列中,等待异步执行。通过在检测到当前执行的线程并非角色所绑
定的线程时转为异步执行,能够在不采用锁的情况下保证数据安全。
[0090] 需要说明的是,场景的数据同样是私有的,但不同场景之间并不会发生交互;由于一个场景在其生命周期内被唯一绑定至一个线程,因此,并不会存在场景数据的跨线程调
用。
[0091] 本申请还提供了一种用于实现不分线无缝游戏世界的服务器,其中,所述服务器包括本申请所述的不分线装置。
[0092] 本申请还提供了一种用于实现不分线无缝游戏世界的系统,该系统包括本申请所述的用于实现不分线无缝游戏世界的服务器,以及客户端。在一些实施例中,客户端通常用
于把大世界地图切割成无数的小地图,根据玩家所在的位置动态加载和释放各个小地图,
而基于本申请的系统,由于能够达到不分线来实现多人在线游戏无缝世界的目的,从而提
高玩家在游戏中的真实体验。
[0093] 本申请还提供了一种设备,其中,所述设备包括:存储器,用于存储一个或多个程序;一个或多个处理器,与所述存储器相连,当所述一个或多个程序被所述一个或者多个处
理器执行时,使得所述一个或多个处理器执行本申请所述的用于实现不分线无缝游戏世界
的方法。
[0094] 本申请还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序可被处理器执行本申请所述的用于实现不分线无缝游戏世界的方法。
[0095] 本申请还提供了一种计算机程序产品,当所述计算机程序产品被设备执行时,使得所述设备执行本申请所述的用于实现不分线无缝游戏世界的方法。
[0096] 图3示出了可被用于实施本申请中所述的各个实施例的示例性系统。
[0097] 在一些实施例中,系统1000能够作为本申请实施例中的任意一个处理设备。在一些实施例中,系统1000可包括具有指令的一个或多个计算机可读介质(例如,系统存储器或
NVM/存储设备1020)以及与该一个或多个计算机可读介质耦合并被配置为执行指令以实现
模块从而执行本申请中所述的动作的一个或多个处理器(例如,(一个或多个)处理器
1005)。
[0098] 对于一个实施例,系统控制模块1010可包括任意适当的接口控制器,以向(一个或多个)处理器1005中的至少一个和/或与系统控制模块1010通信的任意适当的设备或组件
提供任意适当的接口。
[0099] 系统控制模块1010可包括存储器控制器模块1030,以向系统存储器1015提供接口。存储器控制器模块1030可以是硬件模块、软件模块和/或固件模块。
[0100] 系统存储器1015可被用于例如为系统1000加载和存储数据和/或指令。对于一个实施例,系统存储器1015可包括任意适当的易失性存储器,例如,适当的DRAM。在一些实施
例中,系统存储器1015可包括双倍数据速率类型四同步动态随机存取存储器(DDR4SDRAM)。
[0101] 对于一个实施例,系统控制模块1010可包括一个或多个输入/输出(I/O)控制器,以向NVM/存储设备1020及(一个或多个)通信接口1025提供接口。
[0102] 例如,NVM/存储设备1020可被用于存储数据和/或指令。NVM/存储设备1020可包括任意适当的非易失性存储器(例如,闪存)和/或可包括任意适当的(一个或多个)非易失性
存储设备(例如,一个或多个硬盘驱动器(HDD)、一个或多个光盘(CD)驱动器和/或一个或多
个数字通用光盘(DVD)驱动器)。
[0103] NVM/存储设备1020可包括在物理上作为系统1000被安装在其上的设备的一部分的存储资源,或者其可被该设备访问而不必作为该设备的一部分。例如,NVM/存储设备1020
可通过网络经由(一个或多个)通信接口1025进行访问。
[0104] (一个或多个)通信接口1025可为系统1000提供接口以通过一个或多个网络和/或与任意其他适当的设备通信。系统1000可根据一个或多个无线网络标准和/或协议中的任
意标准和/或协议来与无线网络的一个或多个组件进行无线通信。
[0105] 对于一个实施例,(一个或多个)处理器1005中的至少一个可与系统控制模块1010的一个或多个控制器(例如,存储器控制器模块1030)的逻辑封装在一起。对于一个实施例,
(一个或多个)处理器1005中的至少一个可与系统控制模块1010的一个或多个控制器的逻
辑封装在一起以形成系统级封装(SiP)。对于一个实施例,(一个或多个)处理器1005中的至
少一个可与系统控制模块1010的一个或多个控制器的逻辑集成在同一模具上。对于一个实
施例,(一个或多个)处理器1005中的至少一个可与系统控制模块1010的一个或多个控制器
的逻辑集成在同一模具上以形成片上系统(SoC)。
[0106] 在各个实施例中,系统1000可以但不限于是:服务器、工作站、台式计算设备或移动计算设备(例如,膝上型计算设备、手持计算设备、平板电脑、上网本等)。在各个实施例
中,系统1000可具有更多或更少的组件和/或不同的架构。例如,在一些实施例中,系统1000
包括一个或多个摄像机、键盘、液晶显示器(LCD)屏幕(包括触屏显示器)、非易失性存储器
端口、多个天线、图形芯片、专用集成电路(ASIC)和扬声器。
[0107] 对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论
从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权
利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有
变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此
外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个
单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表
示名称,而并不表示任何特定的顺序。
[0108] 虽然前面特别示出并且描述了示例性实施例,但是本领域技术人员将会理解的是,在不背离权利要求书的精神和范围的情况下,在其形式和细节方面可以有所变化。这里
所寻求的保护在所附权利要求书中做了阐述。在下列编号条款中规定了各个实施例的这些
和其他方面:
[0109] 1.一种用于实现不分线无缝游戏世界的方法,其中,所述方法包括:
[0110] 将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段;
[0111] 线程池在每帧中根据所述多个阶段来按阶段执行,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执行完当前阶
段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻辑数据,若
有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对应的计算逻
辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至所述多个阶
段执行完毕。
[0112] 2.根据条款1所述的方法,其中,所述方法还包括:
[0113] 创建所述线程池,其中,所述线程池中的线程数是根据CPU核心数确定的。
[0114] 3.根据条款1所述的方法,其中,所述将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段,包
括:
[0115] 将多人在线游戏的服务器中每帧都需执行的计算逻辑划分为管理数据逻辑和角色数据逻辑;
[0116] 将管理数据逻辑归纳为多个管理逻辑类别,将角色数据逻辑归纳为多个角色逻辑类别;
[0117] 根据所述多个管理逻辑类别和所述多个角色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或一个角色逻辑类别。
[0118] 4.根据条款3所述的方法,其中,所述将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段,还
包括:
[0119] 将角色数据逻辑按照角色数量平分到线程池的各个线程中,其中,每个角色在生命周期内唯一绑定至一个线程;
[0120] 将管理数据逻辑按照场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个线程。
[0121] 5.根据条款3所述的方法,其中,所述角色逻辑类别至少包括以下任一项:
[0122] 属性计算逻辑;
[0123] 视野同步逻辑;
[0124] 网络协议处理逻辑;
[0125] 战斗交互逻辑。
[0126] 6.根据条款3所述的方法,其中,每个计算逻辑中的数据均为私有。
[0127] 7.根据条款6所述的方法,其中,所述每个线程执行当前阶段对应的逻辑类别中的计算逻辑,包括:
[0128] 对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据。
[0129] 8.根据条款7所述的方法,其中,所述对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据,包括:
[0130] 对于角色逻辑类别中的每个计算逻辑,在执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若是,继续执行该公共接口函数,以访问该
计算逻辑中的数据;若否,将异步逻辑数据发送到角色所绑定的线程的无锁队列中以等待
异步执行,其中,所述异步逻辑数据包括该公共接口函数及该公共接口函数对应的传入参
数。
[0131] 9.一种用于实现不分线无缝游戏世界的装置,其中,所述装置包括:
[0132] 用于将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个阶段的装置;
[0133] 用于线程池在每帧中根据所述多个阶段来按阶段执行的装置,其中,当一个阶段开始,线程池激活所有线程,每个线程执行当前阶段对应的逻辑类别中的计算逻辑,且当执
行完当前阶段对应的计算逻辑后,检测本线程的无锁队列中是否有等待异步执行的异步逻
辑数据,若有则执行所述异步逻辑数据以进行数据同步,当每个线程均执行完当前阶段对
应的计算逻辑并且每个线程都不存在等待异步执行的异步逻辑时,开始下一个阶段,直至
所述多个阶段执行完毕。
[0134] 10.根据条款9所述的装置,其中,所述装置还包括:
[0135] 用于创建所述线程池的装置,其中,所述线程池中的线程数是根据CPU核心数确定的。
[0136] 11.根据条款9所述的装置,其中,所述用于将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个
阶段的装置,用于:
[0137] 将多人在线游戏的服务器中每帧都需执行的计算逻辑划分为管理数据逻辑和角色数据逻辑;
[0138] 将管理数据逻辑归纳为多个管理逻辑类别,将角色数据逻辑归纳为多个角色逻辑类别;
[0139] 根据所述多个管理逻辑类别和所述多个角色逻辑类别,确定线程池对应的多个阶段,其中,一个阶段对应一个管理逻辑类别和/或一个角色逻辑类别。
[0140] 12.根据条款11所述的装置,其中,所述用于将多人在线游戏的服务器中每帧都需执行的计算逻辑归纳为多个逻辑类别,并根据所述多个逻辑类别,确定线程池对应的多个
阶段的装置,还用于:
[0141] 将角色数据逻辑按照角色数量平分到线程池的各个线程中,其中,每个角色在生命周期内唯一绑定至一个线程;
[0142] 将管理数据逻辑按照场景数量平分到线程池的各个线程中,其中,每个场景在生命周期内唯一绑定至一个线程。
[0143] 13.根据条款11所述的装置,其中,所述角色逻辑类别至少包括以下任一项:
[0144] 属性计算逻辑;
[0145] 视野同步逻辑;
[0146] 网络协议处理逻辑;
[0147] 战斗交互逻辑。
[0148] 14.根据条款11所述的装置,其中,每个计算逻辑中的数据均为私有。
[0149] 15.根据条款14所述的装置,其中,所述每个线程执行当前阶段对应的逻辑类别中的计算逻辑,包括:
[0150] 对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据。
[0151] 16.根据条款15所述的装置,其中,所述对于角色逻辑类别中的每个计算逻辑,执行该计算逻辑中的接口函数,以访问该计算逻辑中的数据,包括:
[0152] 对于角色逻辑类别中的每个计算逻辑,在执行该计算逻辑中的公共接口函数时,检测当前执行的线程是否为角色所绑定的线程;若是,继续执行该公共接口函数,以访问该
计算逻辑中的数据;若否,将异步逻辑数据发送到角色所绑定的线程的无锁队列中以等待
异步执行,其中,所述异步逻辑数据包括该公共接口函数及该公共接口函数对应的传入参
数。
[0153] 17.一种用于实现不分线无缝游戏世界的服务器,其中,所述服务器包括如条款9至16中任一项所述的用于实现不分线无缝游戏世界的装置。
[0154] 18.一种用于实现不分线无缝游戏世界的系统,包括如条款17所述的服务器,以及客户端。
[0155] 19.一种设备,其中,所述设备包括:
[0156] 存储器,用于存储一个或多个程序;
[0157] 一个或多个处理器,与所述存储器相连,
[0158] 当所述一个或多个程序被所述一个或者多个处理器执行时,使得所述一个或多个处理器执行如条款1至8中任一项所述的方法。
[0159] 20.一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序可被处理器执行如条款1至8中任一项所述的方法。
[0160] 21.一种计算机程序产品,当所述计算机程序产品被设备执行时,使得所述设备执行如条款1至8中任一项所述的方法。