掌桥专利:专业的专利平台
掌桥专利
首页

使用基于查询的兴趣的模拟系统和方法

文献发布时间:2023-06-19 11:14:36


使用基于查询的兴趣的模拟系统和方法

相关案例的交叉引用

本申请要求于2018年9月18日提交的标题为“Simulation Systems and MethodsUsing Query-Based Interest”的美国申请第16/134,372号的优先权,所述申请是于2018年8月3日提交的标题为“A Scalable Simulation System with Scalable DataPropagation”的美国申请第16/054,038号的部分接续案,所述申请要求于2018年6月14日提交的标题为“Simulation Systems and Methods”的美国申请第16/008,125号的优先权并且是其部分接续案,所述申请要求于2016年11月28日提交的标题为“SimulationSystems and Methods”的美国申请第15/361,874号的优先权并且是其接续案,所述申请要求Robert James Frederick Whitehead等人于2016年8月24日提交的标题为“SimulationSystems and Methods”的美国临时申请第62/378,715号的优先权。在先申请中的每一者都整体以引用方式并入本文用于全部目的。

技术领域

本文描述的各方面总体上涉及计算机、联网、硬件和软件。更具体地,本文描述的一些方面涉及基于分布式和持久性计算机的模拟,包括表达模拟的实体和/或部件的基于查询的兴趣。

背景技术

常规的模拟系统无法缩放为支持大量的对象以对那些对象进行实时模拟。此类系统通常依赖于在单个物理或虚拟计算机系统上运行的模拟引擎的单个实例来模拟整个模拟世界。这些模拟系统的消费者必须在正确性、图形逼真度和实时交互性之间进行选择,而没有解决方案能够在大规模系统上提供全部三者。如果消费者期望模拟复杂的真实世界问题,而这些问题可能需要比单个模拟引擎可以提供的计算能力更多的计算能力,那么情况的严重性和复杂性将进一步增加。例如,对城市的模拟可能需要对大量影响和有助于城市生活的车辆、行人、骑车人、交通模式、交通灯、地铁系统、运输车辆、飞机以及许多其他实体进行模拟。

在一种已知的方法中,已经将计算资源静态地分配给了模拟世界的一部分。这种方法的缺点可能是,当模拟对象、角色等随着模拟的进行在模拟世界中移动时,模拟对象可能聚集在模拟世界的很小的区域上。如果足够的对象移动到所述很小的区域,则计算资源可能会过载(导致处理速度较慢),模拟可能会意外终止,和/或模拟数据可能会丢失。这种方法的另一个缺点可能是,区域的模拟的状态信息可能集中在单个计算资源上,并且可能不会共享或散布在几个资源上,从而使得容错或从意外终止中恢复很困难且耗时。另外,这种方法可能无法轻易支持模拟对象跨区域边界的有状态迁移,并且因此模拟通常将有状态迁移仅限于玩家。

这些和其他问题在本文中得以解决。

发明内容

以下呈现了本文所述的各个方面的简化概述。该概述不是宽泛性综述,并且不意图标识关键的或重要的元素或描绘权利要求的范围。以下概述仅以简化形式呈现一些概念以作为下面提供的更详细描述的介绍性序言。

为了克服上述现有技术中的限制,并克服在阅读和理解本说明书后将显而易见的其他限制,本文所述的各方面是针对于存储计算机可执行指令的系统、方法、设备和计算机可读介质,所述计算机可执行指令在执行时使系统通过在多个工作器上模拟多个实体来执行模拟。多个实体中的每个实体可以包括一个或多个部件。所述系统可以在一个或多个机器上运行多个桥接器,并且所述多个桥接器可以被配置为促进多个工作器与一个或多个实体数据库之间的数据通信。可以将多个工作器中的每个工作器分配给多个桥接器中的不同桥接器。所述系统可以将多个实体中的一个实体修改为包括兴趣部件。兴趣部件可以指示对一个或多个实体数据库的查询订阅和/或用于从一个或多个实体数据库接收针对所述查询订阅的更新的频率。

在一些示例中,将实体修改为包括兴趣部件可以在与创建所述实体的时间相对应的时间执行。另外地或替代地,系统可以通过在模拟的运行时期间接收对更新查询订阅或者用于接收针对查询订阅的更新的频率中的一个或多个的请求来执行模拟。基于接收到所述请求,可以更新兴趣部件以指示更新后的查询订阅或更新后的频率中的一个或多个。

在一些示例中,所述系统可以通过使多个工作器中的一个工作器对多个实体中的所述实体的兴趣部件具有权限来执行模拟。基于工作器的实体-部件权限和兴趣部件,可以将工作器的兴趣集修改为包括对一个或多个实体数据库的查询订阅以及用于接收针对查询订阅的更新的频率。另外地或替代地,所述系统可以通过使多个工作器中的第二工作器对多个实体中的所述实体的不同部件具有权限来执行模拟。可以通过以下方式执行模拟:以用于接收针对查询订阅的更新的频率由多个桥接器中的并且分配给对所述实体的所述不同部件具有权限的第二工作器的一个桥接器来订阅查询订阅。桥接器可以向对所述实体的所述不同部件具有权限的第二工作器并且以接收更新的频率发送对一个或多个实体数据库的并且与所述查询订阅相对应的更新。

在一些示例中,可以将兴趣部件修改为指示对一个或多个实体数据库的更新后的查询订阅。另外地或替代地,频率可以包括第一频率,并且兴趣部件可以指示对一个或多个实体数据库的第二查询订阅,和/或用于从一个或多个实体数据库接收针对第二查询订阅的更新的第二频率,其中第二频率低于第一频率。

在一些示例中,兴趣部件可以基于多个实体中的所述实体的位置或多个实体中的不同实体的位置中的一个或多个而指示空间元素。另外地或替代地,兴趣部件可以基于与多个实体中的所述实体相关联的另一个部件的属性或者与多个实体中的不同实体相关联的部件的属性中的一个或多个。另外地或替代地,频率可以包括第一频率,并且兴趣部件可以指示与第一频率相关联的第一空间元素、对一个或多个实体数据库的第二查询订阅、用于从一个或多个实体数据库接收针对第二查询订阅的更新的第二频率、和/或与第一频率相关联的第二空间元素。

附图说明

通过参考以下考虑了附图的描述,可以获取对本文所述的各方面及其优点的更完整的理解,其中相同的附图标记表示相同的特征,并且其中:

图1描绘了可以根据本文所述的一个或多个说明性方面使用的说明性计算机系统架构。

图2描绘了可以根据本文所述的一个或多个说明性方面使用的说明性虚拟化(管理程序)系统架构。

图3描绘了可以根据本文所述的一个或多个说明性方面使用的说明性基于云的系统架构。

图4描绘了可以根据本文所述的一个或多个说明性方面使用的说明性实体架构。

图5描绘了可以根据本文所述的一个或多个说明性方面使用的说明性部件架构。

图6描绘了可以根据本文所述的一个或多个说明性方面使用的说明性工作器架构。

图7示出了根据本文所述的一个或多个说明性方面的说明性基于查询的模拟开发环境的高级架构。

图8示出了根据本文所述的一个或多个说明性方面的查询的聚合的示例。

图9示出了根据本文所述的一个或多个说明性方面的游戏模拟的示例。

图10示出了根据本文所述的一个或多个说明性方面的多个客户端以及数据源的示例。

图11示出了根据本文所述的一个或多个说明性方面的多个客户端、多个聚合器以及数据源的示例。

图12示出了根据本文所述的一个或多个说明性方面的查询的聚合的示例。

图13A至图13B示出了根据本文所述的一个或多个说明性方面的包括聚合器控制器的示例系统。

图14A至图14B示出了根据本文所述的一个或多个说明性方面的包括聚合器控制器的示例系统。

图15示出了根据本文所述的一个或多个说明性方面的客户端连接迁移的示例方法。

图16示出了根据本文所述的一个或多个说明性方面的多个客户端、多个聚合器以及数据源的示例。

图17示出了根据本文所述的一个或多个说明性方面的组合聚合器的示例。

图18示出了根据本文所述的一个或多个说明性方面的添加聚合器级别的示例。

图19示出了根据本文所述的一个或多个说明性方面的生成和分配聚合器的示例方法。

图20示出了根据本文所述的一个或多个说明性方面的数据高速缓存网络。

图21示出了根据本文所述的一个或多个说明性方面的说明性模拟环境的架构的一部分。

图22示出了根据本文所述的一个或多个说明性方面的示例负载平衡策略系统。

图23示出了根据本文所述的一个或多个说明性方面的说明性负载平衡系统的高级架构。

图24示出了根据本文所述的一个或多个说明性方面的分区和策略意图的示例。

图25示出了根据本文所述的一个或多个说明性方面的多个实体以及实体分配的示例。

图26示出了根据本文所述的一个或多个说明性方面的更换工作器的示例。

图27示出了根据本文所述的一个或多个说明性方面的分区重叠的示例。

图28示出了根据本文所述的一个或多个说明性方面的多个实体以及基于工作器的兴趣的示例。

图29示出了根据本文所述的一个或多个说明性方面的多个实体以及基于实体的兴趣的示例。

图30示出了根据本文所述的一个或多个说明性方面的多个实体以及基于实体的兴趣的另一个示例。

图31示出了根据本文所述的一个或多个说明性方面的多个实体以及基于实体的兴趣的示例。

具体实施方式

在以下对各种实施方案的描述中,参考了上面标识的且形成其一部分的附图,并且其中以图示的方式示出了可以实践本文所述的各方面的各种实施方案。应当理解,在不脱离本文所述的范围的情况下,可以利用其他的实施方案并且可以进行结构和功能上的修改。各个方面能够具有其他实施方案,并且能够以各种不同的方式来实践或进行。另外地,本文使用的措词和术语是出于描述的目的,而不应被认为是限制性的。相反地,本文所使用的短语和术语将被给予其最广泛的解释和含义。

如本领域技术人员在阅读以下公开文本时将认识到的,本文描述的各个方面可以体现为方法、计算机系统或计算机程序产品。因此,那些方面可以采取完全硬件实施方案、完全软件实施方案或结合软件和硬件方面的实施方案的形式。此外,这些方面可以采取计算机程序产品的形式,所述计算机程序产品由一个或多个计算机可读存储介质存储,所述计算机存储介质具有体现在存储介质之中或之上的计算机可读程序代码或指令。可以利用任何合适的计算机可读存储介质,包括硬盘、CD-ROM、光学存储装置、磁存储装置和/或它们的任何组合。特定的数据结构可以用于更有效地实现本文描述的一个或多个方面,并且此类数据结构被预期在本文描述的计算机可执行指令和计算机可用数据的范围内。另外,表示如本文所描述的数据或事件的各种信号可以按行进穿过信号传导介质(诸如金属线、光纤)和/或无线传输介质(例如,空气和/或空间)的电磁波形式在来源与目的地之间传送。

作为下面更详细描述的主题的大致介绍,本文描述的方面针对于用于提供分布式和持久性模拟开发环境的系统、方法和技术。在一些示例中,也可以对模拟开发环境进行空间优化。在一些其他示例中,可以不对模拟开发环境进行空间优化。本文描述的其他方面可以允许将现有的非分布式模拟程序集成到大规模分布式模拟中。本文描述的其他方面可以用于自动地和在空间上平衡和分布模拟工作负载。

除其他外,可以在包括独立的、联网的、虚拟化的和/或基于云的环境的各种不同的系统环境中利用计算机软件、硬件和网络。图1示出了可以根据本公开的一个或多个说明性实施方案使用的模拟计算系统100中的模拟计算装置(或系统)101的框图的一个示例。例如,模拟计算装置101可以是空间优化的模拟计算装置,并且模拟计算系统100可以是空间优化的模拟计算系统。模拟计算装置101可以包括处理器103,以用于控制模拟计算装置101及其相关联的部件(包括RAM 105、ROM 107、输入/输出(I/O)模块109和存储器111)的整体操作。模拟计算装置101以及一个或多个附加计算装置(例如,网络节点123、125、127、129和131)可以对应于本文描述的多个系统或装置中的任何一个,诸如模拟计算系统100(诸如空间优化的模拟计算系统)中的个人移动装置、客户端计算装置、专有模拟系统、附加外部服务器和其他各种装置。如本文所述,这些各种计算系统可以被单独地或组合地配置,以提供模拟计算系统100。除了上面描述的特征之外,本文描述的技术还可以用于允许集成现有的模拟程序,并且用于在模拟计算系统100上对模拟工作负载进行负载平衡,如将在本文中更全面地讨论的。本领域技术人员将了解,如本文所描述的模拟计算装置101(或装置123、125、127、129和131)的功能可以散布在例如多个处理装置上以将处理负载分布到多个计算机,以基于处理器负载、在模拟世界内的位置、用户访问级别、服务质量(QoS)等来分离事务。

各种网络节点123、125、127、129和131可以经由网络121(诸如互联网)互连。也可以使用或替代地使用其他网络,包括专用内联网、公司网络、局域网(LAN)、广域网(WAN)、城域网(MAN)、无线网络、个人网络(PAN)等。网络121是出于说明目的,并且可以用更少或另外的计算机网络代替。网络121可以具有任何已知网络拓扑中的一个或多个,并且可以使用各种不同协议中的一个或多个,诸如以太网。装置123、125、127、129、131以及其他装置(未示出)可以经由双绞线、同轴电缆、光纤、无线电波或其他通信介质连接到网络中的一个或多个。

应当理解的是,所示的网络连接是说明性的,并且可以使用在计算机之间建立通信链路的其他手段。假定存在各种网络协议(诸如TCP/IP、以太网、FTP、HTTP等)以及各种无线通信技术(诸如GSM、CDMA、Wi-Fi和WiMAX)中的任何一种,并且本文描述的模拟系统部件中的各种计算装置可以被配置为使用这些网络协议或技术中的任何一种进行通信。

如本文所用和附图中所描绘的术语“网络”不仅指其中远程计算装置经由一个或多个通信路径耦合在一起的系统,而且还指可以不时耦合至具有存储能力的这种系统的独立装置。因此,术语“网络”不仅包括“物理网络”还包括“内容网络”,内容网络由驻留在所有物理网络上的数据组成。

输入/输出(I/O)模块109可以包括模拟计算装置101的用户可以通过其提供输入的传声器、小键盘、触摸屏、游戏控制器、操纵杆和/或触笔,并且还可以包括用于提供音频输出的扬声器以及用于提供文本、视听和/或图形输出的视频显示装置中的一个或多个。软件可以存储在存储器111和/或存储装置内以向处理器103提供指令,以用于使模拟计算装置101能够执行各种动作。例如,存储器111可以存储由模拟计算装置101使用的软件,诸如操作系统113、应用程序115和相关联的内部数据库117。数据库117可以包括第二数据库(例如,作为单独的表、报告等)。也就是说,信息可以存储在单个数据库中,或者分成不同的逻辑、虚拟或物理数据库,这取决于系统设计。存储器111中的各种硬件存储器单元可以包括在任何方法或技术中实现的易失性和非易失性、可移动和不可移动介质,以用以存储信息,诸如计算机可读指令、数据结构、程序模块或其他数据。模拟计算装置101和/或计算装置127、129、131还可以是包括各种其他部件(诸如电池、扬声器和天线(未示出))的移动终端(例如,移动电话、智能电话、个人数字助理(PDA)、笔记本电脑等)。

本文描述的各方面也可以与许多其他通用或专用计算系统环境或配置一起操作。可以适合于与本文描述的各方面一起使用的其他计算系统、环境和/或配置的示例包括但不限于个人计算机、服务器计算机、手持或膝上型装置、基于车辆的计算装置、多处理器系统、基于微处理器的系统、可编程消费电子产品、网络个人计算机(PC)、小型计算机、大型计算机、包括上述系统或装置中的任一个的分布式计算环境等。

图2示出了说明性模拟系统的高级架构。可以对模拟系统进行空间优化。如图所示,模拟系统200可以是单服务器系统、多服务器系统或基于云的系统,包括至少一个虚拟服务器202,其可以被配置为向模拟系统200提供模拟功能和/或可以向一个或多个客户端计算装置(例如,计算装置123、125、127、129、131)提供对模拟系统200的访问。虚拟服务器202可以包括一个或多个虚拟机240a至240n(在本文中通常称为“虚拟机240”)。每个虚拟机240可以包括模拟运行时248的实例,以用于实例化、管理和监测服务器工作器进程249a至249n(在本文中通常称为“工作器249”)的一个或多个实例。如下面进一步详细描述的,模拟运行时248可以被配置为基于由模拟系统生成的模拟世界的特定分区的瞬时工作负载,根据需要自动地使工作器249加速或减速。模拟世界的分区可以是空间上的,但不必是空间上的。

虚拟服务器202内的模拟运行时248的一个或多个实例可以彼此通信以确定可以用作主实例的实例。例如,模拟运行时248实例可以利用共识协议来确定主实例。主模拟运行时248实例可以负责在虚拟服务器202内的其他模拟运行时248实例与在其他虚拟服务器202中执行的其他模拟运行时248之间路由通信。如将在下面更详细地解释的,模拟运行时248可以允许分布式模拟,其中模拟工作负载自动地分布在一个或多个可用虚拟服务器202上。图2所示的虚拟服务器202可以被部署为图1所示的模拟计算装置101的一个或多个实施方案或其他已知计算装置和/或由它们实现。

虚拟服务器202可以包括具有与虚拟服务器202通信的一个或多个硬件元件的硬件层210。任选地,硬件层210可以包括一个或多个物理磁盘212、一个或多个物理装置214、一个或多个物理处理器216以及一个或多个物理存储器218。物理部件212、214、216和218可以包括例如以上关于模拟计算装置101描述的任何部件。在一个示例中,物理装置214可以包括网络接口卡、视频卡、键盘、鼠标、输入装置、监测器、显示装置、扬声器、光学驱动器、存储装置、通用串行总线连接、打印机、扫描仪、网络元件(例如,路由器、防火墙、网络地址转换器、负载平衡器、虚拟专用网络(VPN)网关、动态主机配置协议(DHCP)路由器等)或者连接到虚拟化服务器301或与其通信的任何装置。物理存储器218可以包括任何类型的存储器。在另一个示例中,物理存储器218可以存储数据,并且可以存储一个或多个程序或一组可执行指令。存储在物理存储器218中的程序或可执行指令可以由虚拟服务器202的一个或多个处理器216执行。虚拟服务器202还可以包括主机操作系统220,所述主机操作系统可以存储在物理存储器218中的存储器元件中并且可以由物理处理器216中的一个或多个执行。

管理程序230可以以模拟可直接访问系统资源的操作系统246或工作器249的任何方式向操作系统246a至246n或在虚拟机240上执行的工作器249提供虚拟资源。系统资源可以包括但不限于物理磁盘212、物理装置214、物理处理器216、物理存储器218和硬件层210中包括的任何其他部件。管理程序230可以用于模拟虚拟硬件、对物理硬件进行分区、将物理硬件虚拟化、和/或执行向模拟运行时248和工作器249提供计算资源的虚拟机。管理程序230可以控制针对在虚拟服务器202上执行的虚拟机240的处理器调度和存储器分区。

管理程序230可以是类型2管理程序,其中管理程序可以在于虚拟服务器202上执行的主机操作系统220内执行。然后,虚拟机240可以在高于管理程序230的级别执行。类型2管理程序可以在主机操作系统220的上下文内执行,使得类型2管理程序与主机操作系统220交互。替代地,模拟系统200中的一个或多个虚拟服务器202可以包括类型1管理程序(未示出)。类型1管理程序可以通过直接访问硬件层210内的硬件和资源在虚拟服务器202上执行。也就是说,虽然类型2管理程序230通过主机操作系统220访问系统资源(如图所示),但是类型1管理程序可以在没有主机操作系统220的情况下直接访问所有系统资源。类型1管理程序230可以直接在虚拟服务器202的一个或多个物理处理器316上执行,并且可以包括存储在物理存储器318中的程序数据。

模拟运行时248可以使管理程序230创建一个或多个虚拟机240,其中附加的模拟运行时248和工作器249实例可以在访客操作系统246内执行。管理程序230可以加载虚拟机图像以创建虚拟机240。管理程序230可以在虚拟机240内执行访客操作系统246。虚拟机240可以执行访客操作系统246。

除了创建虚拟机240之外,管理程序230可以控制至少一个虚拟机240的执行。管理程序230可以向至少一个虚拟机240呈现由虚拟服务器202提供的至少一种硬件资源(例如,硬件层210内可用的任何硬件资源)的抽象。管理程序230可以控制虚拟机240可以访问虚拟服务器202中可用的物理处理器216的方式。控制对物理处理器216的访问可以包括确定虚拟机240是否应该访问处理器216以及将物理处理器能力呈现给虚拟机240的方式。

如图2所示,虚拟服务器202可以托管或执行一个或多个虚拟机240。虚拟机240是一组可执行指令,当由处理器216执行时,所述组可执行指令模仿物理计算机的操作,使得虚拟机240可以很像物理计算装置那样执行程序和进程。虽然图2示出了其中虚拟服务器202托管两个虚拟机240的实施方案,但是在其他实施方案中,虚拟服务器202可以托管任意数量的虚拟机240。管理程序230可以向每个虚拟机240提供该虚拟机240可用的物理硬件、存储器、处理器和其他系统资源的唯一虚拟视图。任选地,管理程序230可以向每个虚拟机240提供虚拟机240可用的物理硬件、存储器、处理器和其他系统资源的基本相似的虚拟视图。

每个虚拟机240可以包括虚拟磁盘242a至242n(统称为242)和虚拟处理器244a至244n(统称为244)。虚拟磁盘242可以是虚拟服务器202的一个或多个物理磁盘212的虚拟化视图,或可以是虚拟服务器202的一个或多个物理磁盘212的一部分。物理磁盘212的虚拟化视图可以由管理程序230生成、提供和管理。管理程序230可以为每个虚拟机240提供物理磁盘212的唯一视图。因此,当与其他虚拟磁盘240相比时,每个虚拟机240中包括的特定虚拟磁盘242可以是唯一的。

虚拟机240a至240n可以使用虚拟处理器244a至244n使用访客操作系统246a至246n执行一个或多个工作器249a至249n。访客操作系统246可以是以下操作系统的非穷举列表中的任何一个:WINDOWS、UNIX、LINUX、iOS、ANDROID、SYMBIAN。访客操作系统246可以是基于上述操作系统中的一个或多个的专用操作系统。例如,访客操作系统246可以由LINUX的专用版本组成,所述版本可以仅包括支持工作器249的操作所必需的功能模块。任选地,并且如下面进一步详细描述的,虚拟机240a至240n可以执行与在虚拟机240a至240n中执行的一个或多个工作器249a至249n相对应的一个或多个桥接器模块(未示出)。

图2仅示出了可以使用的模拟系统的一个示例,并且本领域的技术人员将理解,所使用的特定系统架构和计算装置可以改变,并且次于其所提供的功能,如本文进一步所述。

参考图3,本文描述的一些方面可以在基于云的环境中实现。图3示出了基于基于云的计算平台系统300的模拟环境(例如,开发环境)的示例。可以对基于基于云的计算平台系统300的模拟环境进行空间优化。如图3所示,客户端计算装置340a至340n(统称为340)可以经由互联网330进行通信以访问在基于云的计算平台310的虚拟服务器202(例如,模拟运行时248、服务器工作器249、桥接器模块(未示出)等)上执行的模拟。

模拟运行时248包含用于实现构成模拟环境的元素和部件的程序代码,如本文中进一步详细描述的。例如,模拟运行时248可以包括针对基于云的计算平台310的桥接器模块中的一个或多个的实现代码,如本文中进一步描述和如图7说明性地示出的,并且提供工作器管理功能(启动进程、停止进程等)。另外地和替代地,模拟运行时248也可以公开应用程序编程接口(API),所述应用程序编程接口可以用于即时和/或周期性地监测模拟环境的状态。监测API也可以用于调试模拟环境的状态和行为。在说明性实施方案中,模拟运行时248可以被实现为JAR(Java ARchive)。

基于云的计算平台310可以包括专用和/或公共硬件和软件资源和部件。例如,云可以被配置为待由一个或多个特定客户或客户端计算装置340和/或通过专用网络使用的专用云。公共云或混合的公共-专用云可以由其他客户通过开放网络或混合网络使用。可以替代地使用已知的云系统,例如,MICROSOFT AZURE(华盛顿州雷德蒙德市的微软公司)、AMAZON EC2(华盛顿州西雅图市的亚马逊公司)、GOOGLE COMPUTE ENGINE(加利福尼亚州山景城的谷歌公司)等。

模拟开发环境300可以被部署为基于平台即服务(PaaS)云的计算服务,其可以提供用于允许用户开发、运行和管理模拟的平台。这可能允许用户或客户端创建模拟而无需了解分布式计算的复杂性或要求访问基础设施团队或超级计算机。模拟开发环境300可以作为公共云服务从提供商处交付。在这种情况下,客户端组织可以提供可以与模拟开发环境300集成的预先存在的模型、模拟和/或数据库。替代地,模拟开发环境可以在客户端组织的专用网络内作为专用服务交付。

基于云的计算平台310可以包括一个或多个虚拟服务器202a至202f(统称为202),诸如图2中所示的虚拟服务器202。任选地,基于云的计算平台310可以包括可以被配置为提供本文所述的模拟功能的专用虚拟和/或物理计算资源。虽然图3示出了六个虚拟服务器202(即202a至202f),但是本领域的技术人员将理解,基于云的计算平台310可以包括任意数量的虚拟服务器202。虚拟服务器202可以以允许每个虚拟服务器202以对等方式直接与基于云的计算平台310中的任何其他虚拟服务器202通信的方式经由一个或多个网络互连。任选地,虚拟服务器202可以被布置到虚拟服务器的多个集群中。例如,可以基于由基于云的计算平台310所使用的物理计算资源的物理位置来布置虚拟服务器的集群。在这种示例中,一个集群可以是位于加利福尼亚的第一云数据中心,而另一个集群可以是位于爱尔兰的第二云数据中心(这些仅仅是说明性位置)。在另一个示例中,可以基于对模拟的分配来布置虚拟服务器集群。在这种情况下,一个集群可以由虚拟服务器202的分配给第一模拟的第一子集组成,而另一个集群可以是虚拟服务器202的分配给第二模拟的第二子集。如果或当虚拟服务器202被移动时或者如果或当对第一模拟和第二模拟的计算资源要求可能随着时间改变时,可以将虚拟服务器202手动地或者动态地重新分配给不同的集群。连接到虚拟服务器202的客户端计算装置340可能不知道虚拟服务器202属于哪个集群(如果有的话),并且也可能不知道虚拟服务器202在连接过程期间是否可以将成员资格从一个集群改变为另一个集群。

基于云的计算平台系统300还可以包括基于云的数据存储区320。基于云的数据存储区320中的存储资源可以包括存储磁盘(例如,固态驱动器(SSD)、磁硬盘等)和其他存储装置。替代地,可以由已知的基于云的存储提供商来提供基于云的数据存储区320,诸如AMAZON S3(华盛顿州西雅图市的亚马逊公司)、GOOGLE CLOUD STORAGE(加利福尼亚州山景城的谷歌公司)或其他。任选地,如图3所示,可以与基于云的计算平台310分开地实现或部署基于云的数据存储区320。任选地,可以在基于云的计算平台310内实现或部署基于云的数据存储区320。例如,基于云的计算平台310和基于云的数据存储区320都可以由云系统提供商提供,作为由提供商分配给云系统的资源的一部分。

基于云的数据存储区320可以包括一个或多个应用程序组件322。应用程序组件322可以包括可以定义模拟的实体和部件的数据,以及可以定义模拟中的实体和部件中的每一个的一个或多个行为的程序。任选地,应用程序组件322可以包括可以定义组成模拟的实体和部件的模式、数据结构、序列化对象等。任选地,应用程序组件322可以包括计算机可读代码或指令、脚本、静态链接库、动态链接库等,它们可以为模拟中的元素定义一个或多个行为。基于云的计算平台310中的虚拟服务器202可以从基于云的数据存储区320中加载应用程序组件。每个虚拟服务器202中的模拟运行时248可以使用应用程序组件322中包括的数据和程序来引起分布式、持久性和空间优化的模拟的执行。基于云的数据存储区320还可以包括初始化数据和/或程序324,其定义用于模拟的起始或初始条件。例如,基于云的计算平台310可以从基于云的数据存储区320加载初始化数据324,这可以使预定数量的实体和部件被实例化和初始化为预定的初始状态。在另一个示例中,基于云的计算平台310可以加载并且可以执行一个或多个初始化程序324,所述初始化程序可以使预定数量的实体和部件被实例化和初始化为预定状态。在又一个示例中,可以基于由基于云的计算平台310从基于云的数据存储区320加载的初始化数据324和初始化程序324的组合,将实体和部件实例化和初始化为预定状态。

基于云的数据存储区320可以包括模拟的快照326。模拟快照326可以定义模拟的有效状态,并且可以包括数据和/或程序,如果或当所述数据和/或程序被基于云的计算平台310从基于云的数据存储区320加载和/或执行时,所述数据和/或程序可以将模拟返回到该有效状态。快照326定义的有效模拟状态可以是模拟的已知状态或期望状态。任选地,由快照326定义的模拟状态可以是正在运行的模拟的先前保存的状态。快照326可以存储模拟的某种状态,其可能不是在特定时间的模拟的完整表示。当基于云的计算平台310加载此类快照时,工作器内的用户代码可能够导出有效状态。

基于云的计算平台310的一部分可以是相关的,例如,一个或多个虚拟服务器202可以代表同一最终用户或者代表隶属于同一公司或组织的不同用户来执行模拟。在其他示例中,某些虚拟服务器202可能是不相关的,诸如隶属于不同公司或组织的用户。对于不相关的客户端,关于任何一个用户的虚拟服务器202或基于云的数据存储区320的信息可能对其他用户隐藏。

在一些情况下,客户端计算装置340可以实现、合并和/或以其他方式包括计算装置101和计算装置202的一个或多个方面。客户端计算装置340可以是任何类型的计算装置,其能够经由一个或多个用户界面接收和处理输入,经由一个或多个用户界面提供输出,并且向一个或多其个他计算装置和/或从一个或多个其他计算装置传达输入、输出和/或其他信息。例如,客户端计算装置340可以是台式计算机、膝上型计算机、平板计算机、智能电话等。另外,并且如下面更详细地示出的,在一些情况下,任何和/或所有客户端计算装置340可以是被配置为执行特定功能的专用计算装置。

客户端计算装置340可以包括工作器集成库342和工作器进程249的实例。客户端计算装置340可以利用工作器集成库342和工作器进程249来连接到在基于云的计算平台310中执行的模拟。如下面进一步详细描述的,客户端计算装置340可以从基于云的计算平台310接收描述模拟的相关部分的数据。在客户端计算装置340中执行的工作器进程249可以利用接收到的数据在显示器或其他用户界面装置上渲染模拟的相关部分。客户端计算装置340还可以将数据和命令传输到基于云的计算平台310,这可能影响模拟的状态。可以响应于用户输入来传输数据和命令。任选地,可以响应于由工作器集成库342或工作器进程249执行的计算来生成所传输的数据和命令。

有利地,并且如上面更详细地示出的,使用模拟开发环境的模拟开发人员可能够将游戏或模拟放大到大大超过使用单个机器可能的规模。另外,模拟开发环境可以允许任意数量的用户参与者和数据源集成到模拟中。此外,模拟开发环境可以无需模拟开发人员担心模拟的不同部分之间的可扩展性或数据同步。

图3仅示出了可以使用的模拟开发环境的一个示例,并且本领域的技术人员将理解,所使用的特定系统架构和计算装置可以改变,并且次于其所提供的功能,如本文进一步所述。

图4示出了可以根据本公开的一个或多个说明性示例来实现的模拟的框图的一个示例。模拟世界410可以包括实体(例如,实体1420、实体2 430和实体N 430)的集合。实体可以代表模拟世界410的基本计算单元或其他单元。虽然图4示出了包括三种实体类型的模拟世界410,但是在其他示例中模拟世界410可以包括任何数量的实体类型。另外地,模拟世界410可以包括每种实体类型的任意数量的实例。例如,在城市模拟中,模拟世界410可以包括汽车实体、行人实体、交通信号实体、道路实体、建筑物实体等。在这种情况下,城市模拟可以包括每个实体的大量且不同数量的实例。在另一个示例中,在视频游戏世界模拟中,模拟世界410可以包括怪物实体、玩家实体、武器实体、树实体、岩石实体等。视频游戏模拟世界可以包括怪物实体的少数实例、游戏中活跃的每个玩家的一个玩家实体实例以及树和岩石实体的潜在数百万个实例。在又一个示例中,在交易模拟中,模拟世界410可以包括交易者实体、股票实体、共同基金实体、市场代理实体等。模拟交易世界可以包括少量的交易者和市场代理实体,并且还可以包括数千个股票和共同基金实体。

实体(例如,420、430和440)的状态和行为可以通过实体所包括的部件(例如,421、422、423、431、432、433和441)的组合来确定。每个部件(例如,421、422、423、431、432、433和441)可以整体上包括归属于实体(例如,420、430和440)的状态和行为的子集。例如,如图4所示,实体1 420可以包括部件A 421、部件B 422和部件C 423;实体2 430可以包括部件A431、部件D 432和部件E 433;并且实体N 440可以包括部件F 441。如本领域技术人员将理解的,任何一个实体所包括的部件的数量和类型可以是任意的,并且不限于图4所示的示例。任选地,如果或当两个或更多个实体具有一组共同的属性和行为时,所述两个或更多个实体可以包括特定部件的不同实例。例如,实体1 420可以表示视频游戏模拟中的岩石,而实体2 430可以表示同一模拟中的怪物。两个实体(即420和430)可以共享部件A(例如,421和431),它们可以定义刚体的属性和行为,例如质量和速度。

实体(例如,420、430和440)可以包括在所有实体上可以通用的属性。例如,实体(例如,420、430和440)可以包括标识符值,所述标识符值可以用于唯一地标识模拟世界410内的每个实体实例。实体(例如,420、430和440)可以包括可以在多个部件上共享的属性。例如,视频游戏模拟中的实体(例如,420、430和440)可以包括位置和速度值,因为这种模拟中的大多数部件可能都需要访问这些值。另外地,在实体内定位常用属性可以减少部件之间的耦合并促进实体的部件之间的通信。

参照图5,本文描述的一些方面可以由一个或多个部件421、422、423、431、432、433和441实现、结合和/或以其他方式包括。图5示出了如本文所述的模拟系统(诸如空间优化的模拟系统)中的部件510的示例实现方式。部件510可以包括相关的持久性属性530a至530n(统称为530)和事件550a至550z(统称为550)的集合。作为服务器工作器249a至249n的一部分,程序540可以在服务器中执行,所述服务器诸如图2至图3中所示的服务器(例如,240a至240n、202a至202f和340a至340n)之一。程序540可以是工作器类型的一部分,其实例正在模拟属于特定实体的部件(例如,实体-部件)的实例。程序540可以改变实体-部件的属性的值并且可以生成事件。模拟运行时248或其他软件实体可以将属性的写入权限和事件生成从部件510委派给工作器560。在模拟内执行的其他部件和/或工作器可以经由命令520a至520m(统称为520)引起或触发部件510的状态的更新。替代地,不进行委派。可以将特定实体-部件的权限赋予不同工作器类型的不同工作器实例。因此,与特定实体-部件相关联的一组程序可以根据模拟它的工作器而改变。

部件可以包括一个或多个属性530。部件510的状态可以由部件510所包括的属性530所持有的值来定义。类似地,实体的状态可以由实体所包括的所有部件的属性530所持有的值来定义。属性的值可以是例如指向其他数据(例如大型资产)的指针或URL。部件510的状态可以存储在本地存储器(例如,242a至242n、244a至244n、218)中,以在模拟的执行期间进行访问。任选地,部件510的状态可以作为快照326的一部分存储在基于云的数据存储区320中,并且因此可以在模拟运行中保存。可以周期性地(例如,连续地)存储部件510的状态。部件510的状态被保存的速率可以基于一个或多个因素而变化。例如,如果或当部件510的状态快速改变时,存储速率也可以与改变速率相对应地增加。在另一个示例中,对于可能需要比其他属性更高的准确度的属性,存储速率可能更高。

在描述实体或部件可能表现出某种行为时,应理解,另一个元素(诸如工作器模块)例如可以代表该实体或部件执行所需的计算,并发出或接收相应的信号或数据。

事件550可以指示在部件510上发生瞬时动作。响应于做出确定(或可以针对一个或多个部件510发出事件550)、达到特定结果、接收到用户输入或另一种类型的触发,部件510可以发出一个或多个事件550。模拟内的其他部件可以监测事件550的发生并响应于事件550更新其状态或执行动作。与发出部件相同的实体(例如,工作器模块)可以包括其他部件,或者模拟内的其他实体可以包括其他部件。例如,如果或当交通信号指示器变为红色时,城市模拟中的交通信号实体可能会发出事件。城市模拟中的车辆实体可以接收事件,并且可以响应于事件而停止。在另一个示例中,如果或当刚体部件确定已经与另一个对象碰撞时,则它可能会发出事件。

任选地,程序540可用于更新属性530的值,以及使部件510发出事件550。程序540还可以从其他部件和/或模拟运行时248接收并处理命令520。因此,程序540可以定义模拟内的部件510的行为。替代地,模拟运行时248可以将部件510的行为的实现委派给工作器560。在这种情况下,模拟运行时248可以将对属性530和事件550的写访问权限从部件510委派给工作器560。部件510可以在任何时候最多分配一个写入器。工作器可以进行部件更新并且为其具有权限的部件触发事件。任何工作器都可以向属于特定实体的部件发送命令,并且该命令可以在工作器处进行处理,所述工作器对该部件具有权限。任选地,工作器560可以基于被模拟的物理实体的实时和/或真实世界的行为来实现部件的行为。例如,工作器560可以周期性地从安装在车辆或其他移动体上的一个或多个传感器收集位置、速度和方向数据,并使用该信息来修改属性530并发出部件510的事件550。在另一个示例中,工作器560可以接收车辆或其他移动体的先前记录的真实世界位置、速度和方向数据,并使用该信息来修改属性530并发出部件510的事件550。因此,工作器560可以用于将实时和/或真实世界结合到模拟中。任何其他真实世界的对象、人、事件和/或系统都可以用来生成数据作为模拟的输入。

委派可能要求指定工作器约束条件,所述工作器约束条件可以标识能够模拟部件510的行为的工作器的类型。工作器560可以是可以专门用于执行某些类型的计算的多种工作器类型之一。工作器560可能仅理解定义模拟410内的实体(例如,420、430和440)的部件(例如,421、422、423、431、432、433和441)的子集。例如,在城市模拟中,一种工作器类型可以模拟车辆位置,另一种工作器类型可以模拟交通信号,而又一种类型可以模拟环境排放。

工作器560可以包括数据结构和/或对象和软件程序,以模拟模拟410内的部件(例如,421、422、423、431、432、433和441)的子集的行为。工作器560可以是与工作器249的一个或多个方面相对应的进程,如图2和图3中所述。因此,工作器560可以作为服务器工作器249a至249n的一部分在诸如图2至图3中所示的服务器(例如,240a至240n、202a至202f和340a至340n)之一之类的服务器中执行。工作器560可以读取模拟410中任何部件(例如,421、422、423、431、432、433和441)的属性530。但是,工作器560只能写入已将其写入权限委派给工作器560的那些部件(例如,421、422、423、431、432、433和441)的属性530。如果或当运行时已将部件的写入权限委派给工作器560时,可以说工作器560对部件510具有权限。工作器560可以对模拟410内的实体(例如,420、430和440)的子集的一个或多个部件具有权限。任选地,工作器560可以对一个或多个实体具有权限,所述实体可以在模拟410内彼此靠近。

为了模拟部件(例如,421、422、423、431、432、433和441)的行为,工作器560可能需要来自模拟410内的附近实体(例如,420、430和440)的信息(例如,属性、事件)。例如,在城市模拟中模拟交通路口的工作器可能需要来自附近路口的车辆的信息而不是来自离该路口几英里远的车辆的信息。工作器560的兴趣区域可以包括包含工作器560需要来自其的信息的附近实体(例如,420、430和440)的所有区域。工作器560的兴趣区域可以包括工作器560对其没有权限的实体(例如,420、430和440)。模拟410可以自动地在工作器560与对附近实体具有权限的其他工作器之间使数据同步。

如图6所示,工作器560可以经由桥接器610与模拟410(例如,与实体)通信。图6示出了如本文所述的工作器560在模拟410中与桥接器610通信的示例实现方式。桥接器610可以负责在模拟410内将相关信息(例如,属性、事件)从工作器560传达到数据库,诸如实体数据库。桥接器610可以负责在模拟410内将命令从工作器560传达到其他感兴趣的工作器。桥接器610还可以负责在模拟410内将相关信息从数据库传达到工作器560。桥接器610还可以负责为工作器560传达来自兴趣区域内的附近实体的相关信息。桥接器610可以仅被分配给一个工作器560,并且工作器560可以仅与一个桥接器610通信。也就是说,桥接器610和工作器560之间可能存在一对一的关系。在一些示例中,包括多个工作器的进程或机器可以具有多个连接,每个连接使用单独的桥接器。桥接器610可以作为服务器工作器249a至249n的一部分在诸如图2至图3所示的服务器(例如,240a至240n、202a至202f和340a至340n)之一之类的服务器中执行。

可以经由工作器应用程序编程接口(API)来实现桥接器610与工作器560之间的通信。任选地,工作器560可以包括用户代码以及代码在其内运行的潜在其他框架。用户代码可以使用工作器API 630与运行时进行交互,诸如经由桥接器。工作器API可以允许可能已经独立于模拟开发环境开发的工作器560可能在桥接器610内运行并由其进行管理。任选地,工作器API可以允许将预先存在的非分布式模拟程序集成到大规模分布式模拟中。例如,可以将游戏引擎(例如,加利福尼亚州旧金山市的Unity Technologies SF的UNITY)集成到模拟中,以模拟刚体物理或提供客户端侧渲染和导航。在另一个示例中,可以将多模式交通流模拟软件包(例如,开源MATSIM或其他市售软件包)集成到城市模拟中。可以替代地使用或也可以使用其他工作器引擎或程序。

在另一示例实现方式中,工作器560可能需要专用硬件或其他物理资源,所述专用硬件或其他物理资源可能在基于云的平台310内不可用。在这种场景中,工作器API 630和桥接器610可以驻留在物理上远离基于云的平台310定位的计算装置上,并且可以经由互联网或另一种类型的网络连接到基于云的平台310。可以驻留在基于云的平台310之外(例如,可以在客户端装置340a至340n上执行)的这种工作器560可以被称为外部工作器。并且可以在基于云的平台310内执行(例如,可以在服务器240a至240n、202a至202f上执行)的另一个工作器560可以被称为内部工作器。参考基于云的平台310描述的特征中的任何一个或多个可以在该示例实现方式中使用或与之一起使用。

工作器API可以允许桥接器从工作器的兴趣区域(例如,从工作器的世界视图)添加或移除实体的部件,向工作器通知部件状态改变,将部件委派给工作器或移除委派,用信号通知针对工作器具有权限的部件的部件状态改变,以及如本文所述的其他相关功能。在一些示例中,实体的规范表示的部件也可以被动态地添加到实体数据库或从其中移除。

工作器API提供的函数中可以包括用于添加或移除实体的函数。任选地,工作器API 630可以包括当实体进入工作器560的兴趣区域时将由桥接器610调用的处理程序方法。例如,方法1是可用于将实体添加到工作器560的兴趣区域的方法签名的一个示例。

方法1:

void OnEntityAdd(EntityId eid,EntityState initialState);其中

eid是可以唯一地标识被添加的实体的值;和

initialState是可以描述被添加的实体的初始状态的数据结构和/或对象。

尽管提供方法1作为用于将实体添加到工作器560的兴趣区域的示例,但是可以使用各种其他方法和/或函数。例如,在不脱离本公开的情况下,其他参数可以被包括在所述方法中。然后可以将方法1传递给RegisterEntityAddHandler()工作器API函数,这可以在应添加实体的任何时候导致调用方法1处理程序。

任选地,工作器API 630可以包括当实体离开工作器560的兴趣区域时将由桥接器610调用的处理程序方法。例如,方法2是可用于从工作器560的兴趣区域中移除实体的方法签名的一个示例。

方法2:

void OnEntityRemove(EntityId eid);其中

eid是可以唯一地标识被移除的实体的值。

尽管提供方法2作为用于从工作器560的兴趣区域中移除实体的示例,但是可以使用各种其他方法和/或函数。例如,在不脱离本公开的情况下,其他参数可以被包括在所述方法中。然后可以将方法2传递给RegisterEntityRemoveHandler()工作器API函数,这可以在应移除实体的任何时候导致调用方法2处理程序。

工作器API还可以包括用于向工作器通知工作器的兴趣区域内的部件的属性已经改变状态的函数。例如,工作器API 630可以包括当工作器560的兴趣区域内的部件的属性已经改变状态时将由桥接器610调用的处理程序方法。方法3是可用于向工作器560通知所改变的状态的方法签名的一个示例。

方法3:

void OnStateChanged_Component1(EntityId eid,SomeState state);其中

eid是可以唯一地标识可以包括其属性已经改变状态的部件的实体的值;和

state是可以描述部件的状态的数据结构和/或对象。

尽管提供了方法3作为向工作器560通知所改变的状态的示例,但是可以使用各种其他方法和/或函数。例如,在不脱离本公开的情况下,其他参数可以被包括在所述方法中。在一些变型中,为了效率,state参数可以仅包括部件的自上次更新以来已经改变的属性子集。然后可以将方法3传递给AddComponentStateChangeHandler()工作器API函数,这可以在工作器的兴趣区域内的部件的属性已经改变状态的任何时候导致调用方法3处理程序。

工作器API提供的函数中可以包括用于动态地改变部件权限分配的函数。工作器API 630可以包括当工作器560现在可能对部件具有权限时将由桥接器610调用的处理程序方法。例如,方法4是可用于将部件权限委派给工作器560的方法签名的一个示例。

方法4:

void OnComponentDelegate(EntityId eid,ComponentId cid);其中

eid是可以唯一地标识可以包括被委派的部件的实体的值;和

cid是可以唯一地标识被委派的部件的值。

尽管提供了方法4作为将部件权限委派给工作器560的示例,但是可以使用各种其他方法和/或函数。例如,在不脱离本公开的情况下,其他参数可以被包括在所述方法中。然后可以将方法4传递给RegisterComponentDelegateHandler()工作器API函数,这可以在工作器560现在可能对部件具有权限的任何时候导致调用方法4处理程序。

任选地,工作器API 630可以包括当工作器560可能不再对部件具有权限时将由桥接器610调用的处理程序方法。例如,方法5是可用于从工作器560中移除部件的委派权限的方法签名的一个示例。

方法5:

void OnComponentUndelegate(EntityId eid,ComponentId cid);其中

eid是可以唯一地标识可以包括被取消委派的部件的实体的值;和

cid是可以唯一地标识被取消委派的部件的值。

尽管提供了方法5作为从工作器560中移除部件的委派权限的示例,但是可以使用各种其他方法和/或函数。例如,在不脱离本公开的情况下,其他参数可以被包括在所述方法中。然后可以将方法5传递给RegisterComponentUndelegateHandler()工作器API函数,这可以在工作器560可能不再对部件具有权限的任何时候导致调用方法5处理程序。在分布式系统中,可以在桥接器已发送相应消息之后的某个时间调用回调。例如,这可能意味着工作器可能在其不再对部件具有权限时认为自己具有权限,并且反之亦然。

在其他示例中,工作器API 630可以包括用于将工作器560设置或取消设置为对部件具有权限的将由桥接器610调用的处理程序方法。例如,方法7是可用于为工作器560设置或移除部件的委派权限的方法签名的一个示例。

方法6:

void SetIsAuthoritative(EntityId eid,ComponentId cid,BooleanisAuthoritative);其中

eid是可以唯一地标识可以包括部件的实体的值;

cid是可以唯一地标识部件的值;以及

isAuthoritative是可以指示是将工作器560设置还是取消设置为对部件具有权限的一个真/假值。

尽管提供了方法6作为将工作器560设置或取消设置为对部件具有权限的示例,但是可以使用各种其他方法和/或函数。例如,在不脱离本公开的情况下,其他参数可以被包括在所述方法中。

对数据库(诸如实体数据库)的改变可以通过任何进程(诸如工作器、一些其他外部系统或运行时系统本身(例如,负载平衡强制器,如将在下面进一步详细描述))进行。例如,响应于数据库中的规范状态中的一些其他改变,过程可以对所述规范状态进行改变。又例如,实体数据库可能具有一些内部系统,这些内部系统可以潜在地基于一些其他状态改变来更新规范状态。可以经由工作器API向工作器内的用户代码通知对工作器对其没有权限的部件所做的改变。工作器API630可以包括当工作器560对其具有权限的部件的属性已经改变状态时将由工作器API 630调用的方法。方法7是可用于更新工作器560对其具有权限的部件的属性的方法签名的一个示例。

方法7:

void UpdateState_Component1(EntityId eid,SomeState state);其中

eid是可以唯一地标识可以包括其属性已经改变状态的部件的实体的值;和

state是可以描述部件的更新后状态的数据结构和/或对象。

尽管提供了方法7作为更新工作器560对其具有权限的部件的属性的示例,但是可以使用各种其他方法和/或函数。例如,在不脱离本公开的情况下,其他参数可以被包括在所述方法中。每当工作器560对其具有权限的部件的属性已经改变状态时,都可以调用方法7。

任选地,工作器560可以被配置为周期性地将心跳信号发送到桥接器610。如果或当工作器560停止传输心跳信号时,桥接器610可以确定工作器进程560可能已意外终止。响应于该确定,更高级别的系统(诸如工作器调度器(如将在下面进一步详细描述))可以终止桥接器610,并请求分配和实例化替换工作器进程560(和新的对应桥接器610)。

经由分层聚合器和连接迁移的数据订阅的动态负载平衡的示例

在诸如计算机游戏之类的模拟中,模拟可以具有某种形式的状态,所述状态的部分将可供模拟的参与者(例如,游戏玩家)使用。状态可能会不断改变,并且改变可能会显示给一个或多个参与者。可能有很多参与者、状态以及对状态的频繁改变。例如,在在线游戏中,可能有很多玩家、很多游戏状态和/或对状态的频繁改变。这些改变可能是由玩家自身和/或由内部系统(诸如由控制非玩家角色(例如,怪物实体、树实体等)的行为的人工智能(AI)系统)引起的。

图9示出了根据本文所述的一个或多个说明性方面的游戏模拟900的示例。游戏模拟900可以包括多个玩家902A、902B、902C、902D和/或其他玩家。如前所述,每个玩家可以由例如游戏模拟900中的玩家实体表示。游戏模拟900可以包括分布式网关904,其可以将玩家连接到分布式游戏服务器906。分布式网关904可以充当客户端(例如,玩家)的一组连接端点。这些端点可以分布在许多机器间,这可以实现可扩展数量的这种端点。分布式网关可以充当例如工作器与运行时内其余服务之间的分布式代理。分布式网关还可以充当查询负载平衡层,如将在下面进一步详细描述的。

游戏模拟900可以包括分布式游戏服务器906。分布式游戏服务器906可以被配置为为玩家902A至902D和其他玩家、非玩家实体(例如,怪物实体、武器实体、树实体等)以及游戏世界的其他部分提供模拟功能。如前所述,游戏服务器906可以包括一个或多个物理服务器、一个或多个虚拟服务器或其组合。游戏服务器906可以包括分布式游戏状态908,其可以表示实体(诸如玩家和非玩家实体和/或实体的部件)的状态。游戏服务器906还可以包括游戏系统910,诸如用于非玩家实体的AI、用于玩家和其他实体的刚体物理以及其他游戏系统。可以使用高效且可扩展的数据分布机制来容纳大量玩家、很多游戏状态和/或对游戏状态的频繁改变。具有许多参与者、状态和/或状态改变的其他类型的模拟(例如,流行病模拟、城市模拟、交易模拟等)可以类似地受益于高效且可扩展的数据分布机制。

可以经由数据源使模拟状态和/或状态改变对客户端可用,所述数据源可以在单个机器或多个机器上可用。数据源存储和/或提供给客户端的数据可以称为数据域。模拟可以包括多条数据,并且所述数据可以具有不同的数据类型,诸如标量、空间、协议或其他数据类型。标量数据可以包括标量值,诸如单值、双值或其他标量类型。空间数据可以包括描述空间中的点的向量。例如,空间的x、y和z分量可以分别由s

查询可以涉及数据域中的特定子域。例如,查询可以包括与一些数据项匹配的谓词。如果查询q与一些数据x匹配,我们写入q(x),而如果不匹配,我们写入

查询语言可以用于表达数据域的子域或查询,诸如数据源的数据。数据源(例如,实体数据库,如将在下面进一步详细描述的)可以支持查询语言以定义可能涉及数据源状态的子集的查询。例如,查询可以对应于数据源的视图,并且所述视图可以包括数据源状态的子集。可以针对某些类型的查询(诸如,针对涉及模拟空间的特定区域的查询)优化数据源。

可以使用像SQL的语言来表达查询。例如,表达式:

SELECT*FROM Entity WHERE states.position WITHIN(Vector3(0,0,0),Vector3(10,10,10))

可用于匹配其位置在包围盒[(0,0,0),(10,10,10)]内的实体。

可以在不同机器上运行的多个客户端可以经由网络连接到数据源(例如,实体数据库)。数据源可以支持订阅。连接到数据源后,客户端可以订阅一个或多个查询,诸如通过使用查询语言。查询可以包括流查询。对于流查询,如果对数据源的更新改变了与客户端订阅的流查询相对应的数据,则所述更新可能导致将更新发送给客户端。例如,在客户端订阅流查询之后,客户端可以连续地从数据源接收在流查询的域内的数据。如果数据有更新,则客户端可以经由订阅接收数据。另外地或替代地,客户端可以经由其订阅来周期性地接收数据。客户端可以为流查询或者客户端订阅的查询构建数据源的视图。因为数据源处的数据可以诸如通过客户端本身或通过一些其他手段(例如,其他客户端、内部系统等)在任何时候进行更新,所以客户端可以连续接收与其流查询订阅相关的更新。所述过程可以旨在(例如,连续地)使客户端处的视图与对应于一个或多个流查询的数据源处的视图同步。客户端可以关闭流查询,使得不再将针对该流查询的更新发送回客户端。客户端还可以修改流查询,并且可以接收与修改后的流查询相对应的数据库更新。在一些情况下,发送给客户端的更新可能不是具有流查询订阅的客户端接收到的更新。例如,更新可以在某个晚些的时间到达,可能与该更新之后的一个或多个其他更新(可能来自不同的发送者)合并和/或由其盖写(例如,部分或完全盖写)。

客户端可以直接连接到数据源,并订阅数据源提供的一个或多个查询。图10示出了根据本文所述的一个或多个说明性方面的多个客户端1002A(C

在一些示例中,聚合器可以充当客户端与数据源之间的代理。客户端可以经由聚合器中的一个或多个连接到数据源,并使用一个或多个聚合器订阅由数据源提供的一个或多个查询。向外发送数据可能是一项资源密集型任务,这可能导致系统瓶颈。为了减少数据源向外发送给客户端的数据量,可以使用另一层机器(例如,聚合器)来聚合查询。例如,聚合器可以组合客户端的查询并订阅包括连接到聚合器的客户端的查询的组合查询,如将在下面进一步详细描述的。

图11示出了根据本文所述的一个或多个说明性方面的多个客户端1102A(C

图12示出了根据本文所述的一个或多个说明性方面的查询的聚合的示例。例如,查询1106A(q

返回图11,客户端1102A可以订阅查询1106A(q

客户端查询的重叠可能会增加,以减少客户端与一个或多个数据源之间传输的数据量并节省带宽。例如,可以通过控制每个客户端连接到哪个聚合器来增加连接到聚合器的客户端查询的重叠。可以包括可以位于单独机器上的软件模块的聚合器控制器可以用于修改连接。例如,聚合器控制器可以知道聚合器的数量,并且聚合器控制器可以在逻辑上将数据域划分为与聚合器的数量相同数量的子域。因此,可以创建从子域(可以表示为查询)到聚合器的映射。代替将数据域预先划分为固定数量的子域(例如,大小相等),聚合器控制器可以根据传入的客户端查询动态地对数据域进行分区,使得将大致相同数量的客户端连接到每个聚合器。

图13A至图13B示出了根据本文所述的一个或多个说明性方面的包括聚合器控制器1312的示例系统。参考图13A,在连接到聚合器之前,客户端1302(C

例如,假定聚合器控制器1312确定客户端1302要连接到聚合器1308A。在聚合器控制器1312确定针对客户端1302的聚合器之后,聚合器控制器1312可以向客户端1302和/或聚合器1308A发送指示客户端1302要连接到聚合器1308A的响应。基于该响应,客户端1302可以连接到聚合器1308A,如图13B所示。客户端1302可以订阅来自聚合器1308A的查询1306。数据源1304可以连接到聚合器1308A(A

在一些示例中,客户端可以被动态地重新连接到不同的聚合器。图14A至图14B示出了根据本文所述的一个或多个说明性方面的包括聚合器控制器1412的示例系统。聚合器控制器1412(AC)可以确定每个客户端要连接到哪个聚合器。参考图14A,客户端1402A(C

聚合器控制器1412可以连接到聚合器1408A、聚合器1408B或其他聚合器(未示出)并与之通信,以例如,i)确定其客户端的良好分区,和ii)告知客户端(例如,间接地)要连接或切换到哪个聚合器。取决于聚合器控制器1412是否可以从数据源1404获取信息以执行其分区策略,聚合器控制器1412还可以连接到数据源1404。

聚合器控制器1412可以动态地在聚合器间重新分配客户端,以便减少数据源1404发送的流量。例如,查询可能大部分是空间的。当查询以一种或另一种方式限制数据域的模拟空间时,查询可能是空间的。例如,如果查询包含InSphere(

,),则可能会将数据域限制为模拟空间的该子集。如果查询大部分是空间的,则可能的重新分配算法可以(i)在可用的聚合器间分配空间,并且(ii)动态地告知每个客户端连接到与该客户端的一个或多个查询的中心点相对应的聚合器。例如,聚合器控制器可以连接到与客户端的查询具有最大重叠的子域查询相对应的聚合器。由于客户端可以动态地改变其查询,因此可以动态地告知客户端重新连接到不同的聚合器。

又例如,聚合器控制器可以根据信息的类型在聚合器间对数据域在逻辑上进行分区。例如,如果客户端(例如,工作器)连接并且仅对任何实体的部件X感兴趣,无论该实体在模拟空间中的位置如何,聚合器控制器都可以告知客户端连接到负责部件X的聚合器。这样,例如,如果有100个这种客户端连接到该聚合器,则聚合器可能仅从其数据源接收针对部件X的更新的单个流。

图15示出了根据本文所述的一个或多个说明性方面的客户端连接迁移的示例方法1500。假定在模拟运行时(例如,空间模拟运行时248或另一个模拟运行时)期间,一个或多个客户端、一个或多个聚合器和一个或多个数据源之间的连接如图14A所示。例如,客户端1402B可以连接到聚合器1408A。聚合器控制器1412可以从聚合器1408A或1408B、客户端1402A、1402B或1402C和/或数据源1404接收数据。返回图15,在步骤1502中,聚合器控制器1412可以确定是否将客户端迁移到不同的聚合器。例如,客户端1402B的查询可能在模拟期间不断改变。当客户端1402B的查询改变时,客户端1402B的查询与连接到同一聚合器(例如,聚合器1408A)的其他一个或多个客户端的查询之间的重叠量可能减少。另一方面,客户端1402B的查询与连接到不同聚合器(例如,聚合器1408B)的其他一个或多个客户端的查询之间的重叠量可能增加。在某个时刻,聚合器控制器1412可以基于客户端1402B的查询与连接到聚合器1408B的另一个客户端(例如,客户端1402C)的查询之间的重叠量的增加和/或基于客户端1402B的查询与客户端1402A的查询之间的重叠量的减少来确定将客户端1402B迁移到不同的聚合器1408B。如果聚合器控制器1412确定不将客户端连接迁移到不同的聚合器(步骤1502:否),则聚合器控制器1412可以继续运行一个或多个分区算法以确定是否迁移客户端连接。如果聚合器控制器1412确定将客户端连接迁移到不同的聚合器(步骤1502:是),则方法可以进行到步骤1504。例如,聚合器控制器1412可以确定将客户端1402B从聚合器1408A迁移到聚合器1408B。

在步骤1504中,聚合器控制器1412可以向聚合器1408A发送将连接到聚合器1408A的客户端1402B迁移到不同的聚合器1408B的请求。在步骤1506中,聚合器1408A可以向客户端1402B发送将很快将客户端1402B连接到聚合器1408B的指示。该指示可以指示聚合器1408B和/或指示迁移时间。

在步骤1508中,客户端1402B可以开始临时存储(例如,缓冲)要发送的数据。在客户端1402B接收到迁移消息之后(例如,在步骤1506中),客户端1402B可以停止向聚合器1408A发送更新,而是可以开始缓冲更新。在一些示例中,客户端1402B可以立即停止向聚合器1408A发送更新,例如,近似往返路程时间(RTT)。客户端1402B还可以告知聚合器1408A它已经开始缓冲更新。客户端1402B可以在过渡期进入不同的操作模式,在过渡期更新被缓冲而不是被发送。客户端1402B缓冲的数据可以包括客户端1402B正在不断发送的数据(例如,对数据存储区1404的更新)。

在步骤1510中,聚合器1408A可以确定客户端1402B的数据的临时存储是否已经完成。例如,客户端1402B可以在客户端1402B已经完成其缓冲过程时通知聚合器1408A。聚合器1408A还可以停止向客户端1402B发送诸如与查询相关联的数据之类的数据。如果客户端1402B处的临时存储未完成(步骤1510:否),则聚合器1408A可以等待直到临时存储完成。如果在客户端1402B处的临时存储完成(步骤1510:是),则方法可以进行到步骤1512。

在步骤1512中,聚合器1408A(例如,源聚合器)可以向聚合器1408B(例如,目标聚合器)发送指示聚合器1408A发送到客户端1402B或以其他方式知道的关于订阅的数据的当前(例如最新)版本或视图的信息。例如,聚合器1408A可以向聚合器1408B发送关于与客户端1402B的连接状态的信息(例如,关于一个或多个查询视图的哪些部分已经被同步的信息)。通过发送该信息,可以减少重新发送一些信息(例如,客户端1402B已经具有的信息)的需要,从而节省了网络带宽以用于其他用途。聚合器1408A可以直接与聚合器1408B传达该信息,或者可以诸如经由聚合器控制器1412与聚合器1408B间接通信。聚合器1408A还可以向客户端1402B发送将客户端1402B连接到新的聚合器1408B的请求。

在步骤1514中,客户端1402B可以与聚合器1408A断开连接并且连接到新的聚合器1408B。简要参考图14B,客户端1402B可以与聚合器1408A断开连接并且连接到聚合器1408B。返回图15,在步骤1516中,客户端1402B可以用聚合器1408B订阅查询。因为客户端1402B的查询可能会不断改变,所以客户端1402B可以订阅其最近用聚合器1408A订阅的相同查询。替代地,客户端1402B可以订阅与客户端1402B之前用聚合器1408A订阅的查询不同的查询。例如,期望的查询可能已在迁移过程期间改变。方法可以返回到步骤1502,以确定是否存在另一个客户端要迁移到不同的聚合器。

如前所述,聚合器1408B可以接收(例如,在步骤1512中)指示客户端1402B具有的数据的当前版本(诸如其视图)的信息。聚合器1408B可能不需要将相同的数据重新发送到现在连接到聚合器1408B的客户端1402B,从而导致传输更少的数据并且更高效地利用可用网络带宽。通过执行图15所示的步骤中的一个或多个,系统可以动态地调整客户端分区以减少从数据源1404流出的流量的量。因为方法可能是动态的,所以方法可以(i)处理客户端改变其查询的情况,并且(ii)很好地处理从系统中动态地添加或移除聚合器的情况。在该系统中,客户端可能也不需要在首次连接时询问要连接哪个聚合器,因为可能会告知客户端根据其订阅的查询重新连接(例如,立即重新连接)。

图16示出了根据本文所述的一个或多个说明性方面的多个客户端、多个聚合器以及数据源的示例。例如,所述系统可以包括三个聚合器1608A(A

图17示出了根据本文所述的一个或多个说明性方面的组合聚合器的示例。聚合器控制器(未示出)可以组合图16中所示的聚合器1608A和聚合器1608B,以生成图17所示的聚合器1708A。例如,聚合器控制器可以移除聚合器1608B,并指示将先前连接到聚合器1608B的客户端C

聚合器控制器还可以基于新连接来调整查询。例如,可以组合图16所示的查询q

在一些情况下,组合聚合器可能会导致聚合器过载。例如,聚合器控制器可以知道组合聚合器1608A和1608B将导致组合的聚合器1708A过载。聚合器控制器可以跟踪(例如,通过聚合器的帮助)有多少数据正在通过匹配所涉及的不同查询的不同连接,诸如聚合器与数据源之间的连接和/或聚合器与客户端之间的连接。如将在下面进一步详细描述的,可以存在多层聚合器(例如,两层、三层、十层等)。聚合器控制器还可以跟踪有多少数据正在通过聚合器之间的不同连接,所述聚合器可能在不同的层中。基于通过连接中的一个或多个的数据量,聚合器控制器可以确定目标配置(例如,聚合器的数量和聚合器的连接)。例如,对于连接中的一个或多个,聚合器控制器可以尝试将通过连接的数据量保持在阈值数据量以下。如将在下面进一步详细描述的,一个或多个聚合器控制器还可以尝试将通过多个连接(例如,用于配置的连接或用于配置的一部分的连接)的数据总量保持在阈值数据量以下。在一些示例中,聚合器控制器可以在组合之后(例如,紧随其后)接收到所组合的聚合器1708A过载的指示。例如,聚合器1708A现在可以将与之前的聚合器1608A和1608B两者加一起相同的数据量发送到客户端C

图18示出了根据本文所述的一个或多个说明性方面的添加聚合器级别的示例。聚合器控制器(未示出)可以诸如通过引入聚合器1808A来添加聚合器级别。数据源1604的负载可以与图17所示的示例中相同。例如,数据源1604可以将流查询q

如上所述,聚合器控制器可以将聚合器的配置从图16所示的配置改变为图17所示的配置。如果如图17所示的新配置仍然过载,那么聚合器控制器可以确定从图17所示的配置改变为图18所示的配置。替代地,聚合器控制器可以直接从图16所示的配置转到图18所示的配置或其他配置。

通常,可以根据需要引入聚合器层次结构中的一个或多个额外层,和/或通过消除过载情况来改进系统效率。聚合器控制器可以连接到聚合器(例如,所有聚合器)和/或数据存储区。聚合器控制器可以确定(i)聚合器的总体布局,(ii)是否添加和/或移除任何聚合器,和/或(iii)是否改变客户端或中间聚合器连接的对象。中间聚合器可以使用与上面针对客户端描述的相同或相似的重新连接协议。

可以使用多个聚合器控制器,诸如如果对于单个聚合器控制器来说工作量太多的话。多个聚合器控制器中的每一个可以处理聚合器层次结构的一部分。图19示出了根据本文所述的一个或多个说明性方面的生成和分配聚合器的示例方法1900。在步骤1902中,分析数据域。例如,开发人员可以针对特定用例分析数据域,并且可以静态地定义聚合器的一个或多个底层。可以创建几个聚合器控制器,并将所述聚合器控制器分配给这些聚合器和其通向客户端的子树。又例如,主聚合器控制器可以负责数据存储区以及连接到数据存储区的即时聚合器。主聚合器控制器可以动态地确定是否要创建更多或更少的聚合器控制器(例如,取决于主聚合器是否过载),以将树的部分的管理委派给其他聚合器控制器。

在步骤1904中,可以(例如,由开发人员或主聚合器控制器)确定客户端订阅的查询或一个或多个子域。客户端可以选择其自己的查询,并且客户端选择的查询类型可能取决于特定的用例。例如并且参考图18,系统可以确定客户端C

返回图19,在步骤1906中,系统可以将客户端及其相应查询进行分组。参考图18,系统可以将客户端C

如前所述,除了分析查询重叠的量之外,聚合器控制器还可以分析有多少流量匹配所涉及的查询的每个子部分。有多少查询重叠可以指示通过组合查询可以少发送多少数据。例如,如果两个查询重叠,但是通过连接的数据不与两个查询的相交或重叠相匹配,则可能没有节省。另一方面,如果通过的所有或大量数据与重叠相匹配,则即使重叠很小,组合查询也可以节省流量。如上所述,一个或多个聚合器控制器可以尝试减少通过多个连接(例如,针对特定聚合器配置的连接或针对配置的一部分的连接)的数据总量。

通常,诸如经由一个或多个聚合器控制器,系统可以考虑一个或多个不同因素来确定聚合器的配置和系统的连接。一个或多个聚合器控制器可以尝试致使更新从发送者到一个或多个数据源和/或从一个或多个数据源到最终客户端的正确递送。例如,一个或多个聚合器控制器可以尝试避免使一个或多个数据源和/或任何中间聚合器过载。一个或多个聚合器控制器可以通过使从数据源或聚合器向其客户端发送的通信量减少或最小化来做到这一点。反过来,这可以通过动态分析和利用所发送的数据的模式并移动客户端的连接以便受益于客户端对所发送的数据的查询重叠来完成。换句话说,系统可以尝试使所发送的重复信息的量最小化,以便实现可扩展性。如前所述,查询重叠量和通过每个连接传输的数据量可用于确定配置,以减少重复信息的传输。对通过组合或拆分查询将少或多发送多少数据以及系统的相应部分的过载或欠载程度的估计,可以确定是从系统中引入或移除节点(例如,聚合器)还是将节点组合在系统中。一个或多个聚合器控制器还可以尝试使用更少的机器(例如,尽可能少的机器)使成本减少或最小化。

简要参考图8,假定客户端C

聚合器控制器可以诸如在时间上的实例或一段时间内评估与构成组合的查询的子查询相对应的流量。聚合器控制器可以确定与组合的流查询的重叠部分相对应的传输数据量。例如,聚合器控制器可以确定与查询a和查询b的重叠相对应的传输流量的量,与查询a和查询c的重叠相对应的传输流量的量,与查询b和查询c的重叠相对应的传输流量的量,和/或与查询a、查询b和查询c的重叠相对应的传输流量的量。

聚合器控制器可以另外地或替代地确定与组合的流查询的非重叠部分相对应的传输数据量。例如,聚合器控器制可以确定与查询a(但不是查询b或查询c)相对应的传输数据量,与查询b(但不是查询a或查询c)相对应的传输数据量,和/或与查询c(但不是查询a或查询b)相对应的传输数据量。假定基于传输数据量的确定,聚合器控制器确定在实践中,虽然客户端C

如前所述,查询重叠量和/或传输数据量可用于确定聚合器和连接的适当配置。可以使用一个或多个其他因素来确定配置。例如,聚合器控制器可以考虑聚合器上的资源使用率。如果聚合器过载或运行接近容量(例如,内存和/或CPU使用率),则聚合器控制器可能不会向聚合器添加进一步的查询或客户端。聚合器控制器还可以考虑对从客户端到聚合器、聚合器到聚合器或聚合器到数据源的某些连接的约束条件。例如,聚合器控制器可以考虑连接是否具有最大阈值带宽,并且聚合器控制器可能不添加将导致传输数据量超过阈值带宽的另一个查询。聚合器控制器还可以考虑所服务的客户端的地理分布。例如,如果聚合器正在为几个客户端服务,则出于延迟一致的目的,可能期望将来自同一地理区域的客户端分配给同一聚合器或聚合器组。

返回图19,在步骤1908中,系统可以生成一个或多个聚合器以处理客户端的查询或一个或多个子域。可以基于客户端的分组来生成聚合器。例如,可以为每组客户端生成一个聚合器。系统可以将每组客户端分配给其相应的聚合器。参考图18,系统可以将客户端C

系统还可以生成一个或多个其他聚合器,所述聚合器可以在不同的层。例如,系统可以在数据源1604正上方的一层生成图18所示的聚合器1808A。如先前参考图17和图18所述,可以生成聚合器的附加层以防止聚合器过载。可以使每个聚合器负责子域或查询中的一个或多个。

返回图19,在步骤1910中,系统可以将一个或多个聚合器控制器分配给聚合器层次结构的各部分。例如,一个聚合器控制器可以被分配给图18所示的所有的聚合器1608A、1608B、1608C和1808A(以及其相应的客户端和/或查询)。替代地,可以将多个聚合器控制器用于层次结构。例如,一个聚合器控制器可以负责聚合器1608A、1608B和1608C,而另一个聚合器控制器可以负责聚合器1808A。又例如,一个聚合器控制器可以负责聚合器1608A和1608B,而另一个聚合器控制器可以负责聚合器1608C和1808A。如前所述,确定树的哪些部分被分配给哪些聚合器控制器可以是静态地完成的。例如,开发人员可以配置系统,诸如仅为靠近数据源的几个聚合器(及其子树)配置系统。替代地,聚合器控制器(例如,主聚合器控制器)可以取决于主聚合器控制器本身的繁忙程度来创建更多的聚合器控制器。例如,主聚合器控制器可以创建子聚合器控制器,并使子聚合器控制器负责主聚合器控制器自己的子树中最繁忙的子树。最繁忙的子树可以基于通过它的流量的量(以及可能连接到它的客户端数量)来确定。在对客户端进行分组并分配了聚合器和聚合器控制器之后,系统可以继续监测数据以确定是否迁移客户端、生成附加聚合器、移除聚合器等,以减少系统的每个部件的负载,如前所述。例如,所述方法可以进行到图15所示的步骤1502以确定是否将客户端连接迁移到不同的聚合器。

如前所述,查询聚合可以包括查询集的扩展。例如,在给定查询集Q={q

换句话说,对于每个数据x,如果Q中有一些查询匹配x,则ΔQ也匹配x。例如,ΔQ可能过逼近该集Q。结果可能是:

例如,如果一些数据x不匹配ΔQ,则也没有q∈Q匹配x。扩展可以比原始查询集匹配更多的数据项。特别是,对于任何查询集,TRUE可能都是有效的扩展。

例如,假定存在查询Q={inrange(0,10),inrange(15,20)}。Q的一些可能的扩展可能是:

ΔQ=inrange(0,10)∨inrange(15,20)

ΔQ=inrange(0,20)

ΔQ=inrange(0,∞)

ΔQ=TRUE

还可以定义查询和数据索引的扩展。对于查询索引,可能是索引中查询集的扩展,而对于数据索引D:

和之前一样,ΔD可能过逼近D。如果一些数据项x不匹配ΔD,则

例如,假定存在数据索引D={0,4,10}。D的一些可能的扩展可能是:

(ΔD)(x)≡x=0∨x=4∨x=10

ΔD=inrange(0,10)

ΔD=TRUE

实体高速缓存可能包含世界中的实体的某个子集。高速缓存可能具有直接写入高速缓存中的数据的本地进程。高速缓存可以一起连接到网络中。高速缓存对可以共享某个实体子集。写入可以发生在网络中的任何高速缓存处。高速缓存可以交换消息,以便在它们之间同步数据。例如,高速缓存C

高速缓存还可以发出描述高速缓存已发生的突变的事件。例如,本地进程可以将实体1337在高速缓存C

StateUpdated(id:1337,old_state:{position:(0,0,0)},new_state:{position:(0,0,1)},update:{entity_id:1337,position:(0,0,0)}

高速缓存发出的事件可以包括高速缓存的事件流。

高速缓存的网络可以被同步。图20示出了根据本文所述的一个或多个说明性方面的数据高速缓存网络。高速缓存可以一起连接到网络中。如以上所讨论的,每个聚合器可以被视为高速缓存,并且聚合器可以充当其直接客户端的数据源。所连接的高速缓存可以作为对等方连接或以客户端/服务器关系连接。在图20中,诸如C

可以使用递归查询。为了使高速缓存C

服务器C

可以实现同步的高速缓存。高速缓存可以包含某个实体集,并且高速缓存可以知道某个其他高速缓存集。这些高速缓存中的每一个都可以订阅特定的查询。本地进程可以在高速缓存中搜索实体的数据,并且可以对高速缓存中的实体的数据进行突变。这可以通过使用数据索引存储实体并使用查询索引存储针对每个连接的高速缓存的查询来高效地实现。如果客户端高速缓存更新了其查询,则服务器高速缓存可以重新计算其扩展的查询,并且(如果已改变)在其对等方间更新其自己的查询。例如,客户端的更新后的查询可能包括不在先前扩展的查询内的数据。当客户端或对等方将其查询从q更新为q′时,系统可以确定是否要添加或移除的新实体。要找到待添加的实体,可以对数据索引执行查询

高速缓存或本地进程可以订阅高速缓存的事件流(例如,流查询)。如前所述,订阅者可以订阅关于被订阅者的查询。可以针对每个发出的事件来匹配查询,并且可以将匹配的事件转换成被订阅者可以发送给订阅者的命令。命令可以描述订阅者待应用的改变,以便反映事件描述的状态。例如,高速缓存C

SELECT update.position FROM SyncEvent WHEREnew_state.position WITHIN((0,0,0),(10,10,10))ANDnew_state.is_spider=TRUE

又例如,每当在附接电缆时打开灯开关时或当将电缆附接到接通开关时,都可能希望向本地进程发送消息。它可以订阅以下查询:

SELECT update FROM SyncEvent WHERE NOT(old_state.switch=TRUE ANDold_state.cable=TRUE)AND(new_state.switch=TRUEAND new state.cable=TRUE)

再例如,高速缓存C

SELECT update FROM SyncEvent WHERE INRANGE(new_state.position,(0,0,0),5000)AND NOT(INRANGE(new_state.position,(0,0,0),1000))AND RAND()<0.1)

用于基于查询的模拟的架构示例

图7示出了根据本文所述的一个或多个说明性方面的说明性基于查询的模拟开发环境的高级架构。所述架构可以分为例如三层:工作器层705、桥接器层715和数据库层725。每个层可以在用于该层的机器方面和/或在每个机器上的部件方面是可扩展的,如图7中各个地方的点所示。

工作器层705可以包括多个工作器。工作器可以包括受管理的工作器(诸如受管理的工作器730a至730c)以及不受管理的工作器(诸如客户端工作器720a至720c)。平台可以管理受管理的工作器,诸如在受管理的工作器的整个生命周期中。受管理的工作器可以在诸如虚拟机的机器上运行。模拟运行时可以决定哪些受管理的工作器在哪些虚拟机上运行。模拟运行时还可以将工作器从一个虚拟机移动到另一个,诸如通过停止一个并启动另一个。不受管理的工作器可以从外部进行控制,诸如在不受管理的工作器的整个生命周期中。例如,不受管理的工作器可以包括外部工作器,应用程序的终端用户运行该外部工作器以连接到模拟世界。每个客户端机器可以包括一个客户端部件,或者可以包括多个客户端机器。受管理的和不受管理的工作器可以连接到平台。

客户端工作器720和受管理的工作器730可以合并和/或以其他方式包括如图5和图6所示的工作器560的一个或多个方面。客户端工作器720a可以在客户端计算装置和/或虚拟机710a内执行;客户端工作器720b可以在客户端计算装置和/或虚拟机710b内执行;并且,客户端工作器720c可以在客户端计算装置和/或虚拟机710c内执行。客户端计算装置710a至710c可以合并和/或以其他方式包括如图3所示的客户端计算装置340的一个或多个方面。受管理的工作器730a和730b可以在计算装置或虚拟机710f内执行;受管理的工作器730c可以在计算装置或虚拟机710g内执行。计算装置710f和710g可以包括服务器(诸如图2至图3所示的服务器(例如,240a至240n、202a至202f))以及具有不同架构的其他系统(例如,图1的全部或部分)。

通过工作器的连接或其他方式,工作器可以充当客户端,诸如数据库的客户端。例如,工作器可以订阅零个或更多个数据库订阅或查询,以便更新其世界的一个或多个局部视图。此外,工作器可以经由其连接请求对数据库的更新。可以通过例如将部件从一个机器移动到另一个来实现对每一层中诸如虚拟机之类的机器的数量和/或大小的改变。例如,可以通过使一个工作器停止并启动一个等同物来移动受管理的工作器。

桥接器层715可以包括多个桥接器。桥接器层715可以充当分布式网关,诸如图9所示的分布式网关904,供工作器连接。桥接器层715中的桥接器可以用作工作器连接到的端点。桥接器层715还可以充当工作器与数据库层725之间的代理。如前所述,每个工作器可以具有桥接器,并且桥接器可以充当特定工作器的连接端点。如图7所示,客户端工作器720a、720b和720c可以分别与桥接器740a、740b和740d通信。类似地,受管理的工作器730a、730b和730c可以分别与桥接器740c、740e和740f通信。桥接器740a至740f可以结合和/或以其他方式包括如图6所示的桥接器610的一个或多个方面。桥接器740a至740f也可以彼此通信。每个桥接器都可以向其工作器提供最新的世界视图,并允许工作器修改世界内的某些实体。

每个桥接器可以例如具有世界的两个视图:一个是其工作器有兴趣看到的实体的视图,因为实体存在于数据库层725中;另一个是由桥接器的工作器看到的实体的视图。桥接器可能负责使这两个视图彼此一致,从而弄清楚需要告诉哪一边什么才能使视图就世界的状态达成共识。工作器视图可以包括桥接器对工作器已经被告知的事情的了解(例如,对于其订阅的一个或多个查询)。数据库视图可以包括桥接器对工作器视图将是什么的了解。例如,桥接器可以从数据库接收对数据库视图的更新。桥接器可以接受数据库视图,存储数据库视图和/或将数据库视图与工作器视图进行比较。如果工作器视图与数据库视图不同,则桥接器可以向工作器发送来自数据库视图的具有新值或更新后的值的更新。桥接器还可以更新其关于工作器看到的内容的视图(例如,工作器视图)以对应于数据库视图。

如果工作器将更新发送到其桥接器,则桥接器可以将更新发送到数据库,以更新数据库的规范状态。例如,来自工作器的更新可以绕过数据库视图和工作器视图,并直接发送到数据库。如果更新成功应用于数据库,则数据库可以将其更新后的视图传播回桥接器,诸如如果订阅的查询匹配所发送的更新的话。桥接器可以接收对数据库视图的更新,并执行前面描述的步骤中的一个或多个。例如,桥接器可以存储更新后的数据库视图,将数据库视图与工作器视图进行比较,并且如果工作器视图与更新后的数据库视图不同则将更新发送给工作器和/或更新工作器视图等。

桥接器层715可以包括多个数据库客户端,诸如数据库客户端750a、数据库客户端750b或其他数据库客户端。数据库客户端可以包括将桥接器连接到数据库层725中的一个、一些或所有数据库分片的软件部件。如图7所示,桥接器740a至740c可以各自经由通信信道与模拟环境700中的数据库客户端750a通信。桥接器740a、740b、740c和数据库客户端750a可以在诸如虚拟机的机器710d内运行。桥接器740d至740f可以各自经由通信信道与模拟环境700中的数据库客户端750b通信。桥接器740d、740e、740f和数据库客户端750b可以在诸如虚拟机的机器710h内运行。虚拟机710d和710h中的每一个可以是桥接服务。部署可以包含多个桥接服务,这些桥接服务一起可以充当工作器的分布式网关。桥接服务可以组合或聚合与其连接的工作器的订阅或查询,并且可以充当例如单个更高效的数据库客户端,以便避免重复的流量。

图7所示的部件中的一些可以作为对等方进行通信,并且部件中的一些可以作为服务器/客户端进行通信。例如,数据库客户端750a和750b可以作为对等方进行通信。桥接器740a至740c可以是数据库客户端750a的客户端。类似地,桥接器740d至740f可以是数据库客户端750b的客户端。工作器可以是桥接器的客户端。例如,客户端工作器720a可以是桥接器740a的客户端,客户端工作器720b可以是桥接器740b的客户端,受管理的工作器730a可以是桥接器740c的客户端,依此类推。

可以通过例如将部件从一个机器移动到另一个来实现对每一层中诸如虚拟机之类的机器的数量和/或大小的改变。例如,可以经由桥接器迁移来修改桥接器。在模拟期间,运行时可以执行桥接器迁移。例如,运行时可以告知工作器动态地连接到不同的桥接器,该桥接器可能在不同的桥接服务上。随着模拟700的进行,可以指定桥接器740a从机器710d迁移到机器710h。在这种情况下,可以在机器710h中实例化新的桥接器实例(未示出),并且在实现桥接器迁移的同时,客户端工作器720a可以临时连接到桥接器740a和新的桥接器实例两者。一旦迁移完成,客户端工作器720a可以与桥接器740a断开连接,并且桥接器740a可以终止。替代地或另外地,桥接器740a可以在机器710d中终止并且在机器710h上恢复。例如,可以从运行时内临时存储的数据或从数据库(例如,实体数据库)中存储的数据恢复桥接器。快照(诸如快照326)通常可用于半定期地(例如,每10分钟或某个其他间隔)获取实体数据库(例如,整个实体数据库)的备份副本。

如前所述,运行时模拟可以将可能具有重叠的订阅查询的工作器的桥接器放置在同一桥接服务上。因此,运行时可以通过减少重复来减少从数据库层725中的数据库分片到桥接服务710d和710h的流量。这可以通过将查询聚合为单个(例如,较大的)查询来完成。当聚合器(例如,拥有多个桥接器的桥接服务)从其数据源之一(例如,通过数据库桥接器的数据库分片)接收到匹配其查询的数据时,聚合器可以将该数据转发到其查询也匹配接收到的数据的客户端。

图8示出了根据本文所述的一个或多个说明性方面的查询的聚合的示例。有界区域中的每一个都可以表示一个查询。例如,有界区域805可以表示查询a;有界区域810可以表示查询b;有界区域815可以表示查询c;有界区域820可以表示查询d;并且有界区域825可以表示查询e。查询d可以包括查询a和b的聚合,这可以是查询的扩展。查询e可以包括查询a至d的聚合,这也可以被认为是查询的扩展。在一些示例中,查询可以是空间的。在其他示例中,查询可能不是空间的。在又其他示例中,一些查询可能是空间的,而其他查询可能不是空间的。

返回图7,工作器720a可以经由桥接器740a连接。假定工作器720a具有对图8所示的查询a和b的订阅。工作器720b可以经由桥接器740b连接。假定工作器720b具有对图8所示的查询c的订阅。桥接器740a和桥接器740b可以位于同一桥接服务710d上。此外,一些查询a至c可以重叠,并且可以聚合查询以减少工作器与桥接器之间和/或桥接器和/或数据分片之间的流量的量。例如,桥接器740a可以聚合查询a和b,从而创建组合的查询d。如图8所示,查询d可以大于查询a和b的并集。桥接器740b可能不聚合查询,因为工作器720b可能仅订阅了查询c。经由数据库客户端750a,桥接服务710d可以聚合查询c和d,从而创建组合的查询e。如图8所示,查询e可以大于查询c和d的并集。图12示出了查询聚合的另一个示例。先前描述了查询聚合的其他示例。在一些示例中,数据库客户端(例如,750a或750b)可以是先前参考图11至图19描述的聚合器。工作器(例如,客户端工作器720a至720c或受管理的工作器730a至730c)和/或其相应的桥接器(例如,桥接器740a至740f)可以是先前参考图11至图19描述的客户端。数据库层725可以对应于先前参考图11至图19描述的数据源。

数据库层725可以包括例如用于模拟的分布式内存数据库。例如,数据库可以包括实体数据库,模拟实体的状态的一部分或全部可以存储在实体数据库中。实体数据库可以作为快照(例如,定期地)保存到磁盘或另一种介质以进行长期存储。实体数据库也可以从快照中还原。实体数据库还可以存储平台的内部信息。在于2018年7月23日提交的标题为“ENTITY DATABASE”的美国申请第16/042,068号中描述了实体数据库的各种示例,其全部内容通过引用合并于此。

数据库层725可以包括可以包括虚拟机的多个机器710j、710k等。每个虚拟机可以包括在虚拟机内运行的一个或多个部件。例如,虚拟机710j可以包括多个数据库分片,诸如数据库分片770a、数据库分片770b或其他数据库分片。虚拟机710k可以包括数据库分片770c和/或其他数据库分片。每个数据库分片可以保存对应于数据域的不同子集的数据。这可以通过按实体ID(例如,对数据库分片的数量取模)划分数据域来实现。然后,每个数据库分片都可以充当根数据源,诸如上述数据源(例如,数据源1004、1104、1304、1404或1604)。因此,虽然图7的系统包括一个聚合层(例如,一个桥接器层),但图7的系统可以在桥接器层715与数据库层725之间包括一个或多个额外的聚合层,如前所述。

每个虚拟机可以包括数据库桥接器,该数据库桥接器可以包括用于在一侧上的数据库客户端(例如,数据库客户端750a、750b等)和在另一侧上的数据库分片(例如,数据库分片770a至770c)的连接端点。数据库的客户端可以连接到一些或所有实体数据库分片,以便例如对数据库进行读取或写入。例如,数据库桥接器760a可以将数据库客户端750a连接到数据库分片770a和/或数据库分片770b。类似地,数据库桥接器760a可以将数据库客户端750b连接到数据库分片770a和/或数据库分片770b。数据库桥接器760b可以将数据库客户端750a连接到数据库分片770c。类似地,数据库桥接器760b可以将数据库客户端750b连接到数据库分片770c。虽然数据库客户端750a和750b可以各自连接到数据库桥接器760a和数据库桥接器760b,但是数据库客户端750a和750b可能没有从两个桥接器接收所有消息。例如,数据库客户端750a和750b可以接收消息,这些消息包括对由相应工作器订阅的查询的更新。

可以通过将部件从一个虚拟机移动到另一个来实现对每一层中虚拟机的数量和/或大小的改变。例如,可以通过合并或拆分分片(以及分片负责的数据)来改变数据库分片的数量和/或大小。数据库可以例如按实体ID来进行分片。数据库还可以支持对其状态的更新。这些更新可能在同一实体的多个部件上甚至在多个实体上都是原子更新,这取决于数据库分片策略。

可分布和可定制的负载平衡的示例

如前所述,模拟(例如,模拟世界)可以包括实体,并且这些实体可以具有一个或多个部件。部件可以包括可以改变的数据字段。本文描述的模拟平台可以允许在工作器中运行代码(例如,用户代码),以便例如修改部件数据字段。工作器可能对实体-部件具有权限,诸如具有对该实体-部件的写入权限。实体-部件可以分配给工作器,或者当工作器对实体-部件具有权限时可以由该工作器模拟。权限信息可以被存储为例如实体数据的一部分。另外地或替代地,权限可以是暂时的,并且可以将权限作为关于权限改变的消息发送给工作器。

图21示出了根据本文所述的一个或多个说明性方面的说明性模拟环境的架构的一部分。如前所述,桥接器和/或工作器可以订阅来自数据库2110(诸如实体数据库)的查询。桥接器可以处理工作器可以看到的内容。例如,桥接器2120a可以连接到工作器2130a,并且桥接器2120a可以充当数据库2110与工作器2130a之间的网关。类似地,桥接器2120b可以连接到工作器2130b,并且桥接器2120b可以充当数据库2110与工作器2130b之间的网关。如前所述,每个实体可以包括多个部件。部件之一可以包括权限部件。实体的权限部件可以指示哪个工作器对实体的其他部件具有权限。例如,实体1234可以包括以下数据:

实体1234

元数据:

名称:“树”

位置:

x:102

y:302

z:4

质量:12

权限:

位置->“工作器B”

质量->“工作器B”

元数据->…

权限部件可以对实体1234指示哪个工作器对实体1234的其他部件具有权限。例如,工作器B(例如,图21中所示的工作器2130b)可以对实体1234的位置部件具有权限。工作器2130b也可能对实体1234的质量部件具有权限。权限部件可以类似地指示对实体1234的其他部件的权限。

桥接器可以订阅来自数据库2110的查询,这些查询可以返回相应工作器具有权限的实体。例如,桥接器2120b可以订阅查询2150以返回工作器2130b具有权限的实体。示例查询可能是:

Subscription query(SELECT*FROM entities WHERE authority=‘Worker B’)

数据库2110可以返回例如指示工作器2130b对实体1234的位置部件、实体1234的质量部件以及工作器2130b具有权限的其他实体-部件具有权限的数据。

可以使用工作器负载平衡来确定由哪个工作器负责每个实体上的每个部件和/或平衡负载,使得有正确数量的工作器正确地模拟世界。特别地,工作器负载平衡可以包括一套工具和/或策略,其可以帮助以下中的一项或多项:(i)如何执行工作器的生命周期管理(例如,工作器的启动、停止、在崩溃时重启等),(ii)如何向工作器授予对实体-部件的权限以允许工作器对其进行模拟,(iii)如何确定哪些工作器要对哪些实体-部件具有权限,或者(iv)如何确定在给定的模拟平台部署中要运行的工作器的数量和类型。

图22示出了根据本文所述的一个或多个说明性方面的示例负载平衡策略系统。负载平衡策略2210可以包括产生策略意图2250的算法。策略意图2250可以由强制服务来实现。负载平衡策略2210可以从实体数据库2220查询模拟的状态。负载平衡策略2210还可从配置数据源2230查询配置数据。负载平衡策略2210还可以向外部服务2240查询诸如随时间变化的数据、天气数据等的杂项数据。负载平衡策略2210可以从各种数据策略接收数据并做出分区决策。作为使用部署中数据的示例,针对玩家位置的实体数据库数据可用于确定在哪里找到密集的玩家集群。可以基于例如Voronoi镶嵌来确定针对工作器之间的边界的适当区域。作为使用部署外数据的示例,分析可能会表明游戏在下雨天会更加活跃。因此,天气数据可用于预配附加工作器,以进行更积极的部署。负载平衡策略2210可以输出策略意图2250,该策略意图指示哪些实体将被分配给哪些工作器。例如,输出可以指示一组分区和/或虚拟工作器。

可以在每个模拟层(例如,物理和聊天)执行策略意图强制,并且可以将负载平衡策略分成不同的部分,其中每个部分管理不同的模拟层。例如,假定模拟具有三层:一层用于物理,一层用于模拟天气,并且一层用于聊天系统。这些层可以彼此独立地进行配置和负载平衡。例如,这些层可能不共享工作器。这可以允许为每个层选择不同的策略。例如,可以将物理和天气工作器设置为通过物理空间来划分世界,但是可以通过用户(例如,玩家)ID范围来划分聊天系统。由于策略意图可以表示如何对模拟世界进行负载平衡,因此开发人员可以在模拟运行时对其进行(动态)配置。这可以允许开发人员写入其自己的负载平衡策略。

图23示出了根据本文所述的一个或多个说明性方面的说明性负载平衡系统2300的高级架构。系统2300可以包括数据库2315,诸如实体数据库。如前所述,实体数据库可以存储模拟实体的状态,并且桥接器、工作器或其他元素可以订阅数据库。系统2300可以包括桥接服务或层2318,其可以包括多个桥接器。如前所述,桥接器可以充当将工作器连接到数据库2315的分布式网关。系统2300可以包括工作器运行器或层2320。如前所述,工作器可以包括受管理的工作器或不受管理的工作器,并且可以订阅由数据库2315提供的一个或多个查询。

系统2300可以包括用于在诸如大型虚拟世界模拟之类的模拟中实现负载平衡的一个或多个强制服务。强制服务可以采取战略意图并将其应用于其域内的实体。如前所述,域可以包括世界中的实体的子集,并且可以通过查询(例如,实体数据库查询)来定义。在一些示例中,每个强制服务可以作用于与其他强制服务所作用的域不同的唯一域。使用单个强制服务来作用于唯一域可以阻止强制服务彼此干扰。由于模拟世界可以动态地改变其大小和计算要求,因此可以动态地修改域。

策略意图可以将预期的工作器映射到其分区。策略意图可以包括具有例如两个(或更多个)字段的数据:实体数据库查询(例如,实体查询约束条件)和针对该查询的预期工作器(例如,虚拟工作器)(例如,要分配给满足查询的部件的工作器)。可以使用强制服务,使得将其域内与特定分区查询匹配的实体委派给相应的工作器。

可以将意图与将对实体-部件的权限分配给工作器的强制或行动分开。例如,系统的一部分可以负责意图(例如,确定用来模拟世界的工作器的数量和种类),而系统的另一部分可以负责强制(例如,启动和停止工作器)。该技术可用于管理工作器。例如,可以将不受管理的工作器和受管理的工作器都分配给虚拟工作器。下表示出了用于模拟实体并具有工作器的意图和行动的示例。

如前所述,可以通过负载平衡决策来实现意图。可以通过负载平衡强制来实现行动。工作器的预期存在可以称为虚拟工作器。工作器调度器服务可以负责启动、停止和/或重新启动工作器,以确保虚拟工作器正在运行相应的工作器。因为策略意图可以为每个分区指定预期的工作器,所以可以从策略意图中导出用于模拟的虚拟工作器列表。

参考图23,系统2300可以包括天眼装置2330,其可以用于运行负载平衡策略算法2332。天眼装置2330可以与其他服务位于同一地点以节省所使用的服务器的数量,或者可以不与其他服务位于同一地点。如前所述,负载平衡策略算法2332可以接收来自实体数据库2315的数据(例如,模拟的状态)、配置数据、外部服务(例如,针对杂项数据,诸如随时间变化的数据)等。负载平衡策略算法2332可以输出指示哪些实体要被分配给哪些工作器的策略意图。策略意图可以存储在实体数据库2315中和/或直接提供给分区强制器。例如,负载平衡策略算法2332可以将一组分区2333发送到分区强制器2310。负载平衡策略算法2332还可以将一组虚拟工作器2334发送到虚拟工作器管理器2325。

系统2300可以包括分区强制器2310或多个分区强制器,其可以散布在几个服务器上。这些分区强制器可以与其他服务共享服务器,以减少用于运行模拟的虚拟机的数量。替代地,分区强制器可以驻留在它们自己的服务器中,以便隔离计算能力。在模拟中的多个分区强制器中的每个分区强制器可以具有域,该域可以是空间、实体id范围或对分区强制进行分片的某种其他方式,使得分区强制器不会彼此干扰。分区强制器2310可以从负载平衡策略算法2332接收一组分区2333。每个分区可以指示指定模拟中实体-部件的子集的查询。

分区强制器2310中的分区权限逻辑可以用于实现负载平衡策略(例如,如由天眼装置2330确定的)。另一方面,如果部件期望特定的权限分配,则可以使用分区强制器2310中的特定权限逻辑。实体可以带有自定义的读/写许可,该权限描述了谁有资格获得对其部件的权限。这可以描述特定类型的模拟(例如,“我需要通过属于物理层的事物进行模拟”)或特定连接的工作器(例如,“我需要通过具有id 1234的工作器进行模拟”)。在后一种情况下,讨论中的部件可能不参与负载平衡系统,因为它需要特定权限分配(例如,具有id 1234的工作器)。因此,对该部件的分配可能会绕过分区强制器2310中的分区权限逻辑。

分区强制器2310可以基于负载平衡策略算法2332的输出,将权限更新(如果有的话)发送到数据库2315。每个分区强制器2310可以订阅与分区强制器负责的一个或多个分区相对应的查询或数据域。分区强制器2310可以从数据库2315接收与一个或多个域订阅相对应的数据。例如,查询可以是流查询,并且每当存在对满足流查询的实体的更新时,分区强制器2310就可以接收更新。替代地,分区强制器2310可以向数据库2315周期性地查询对其分区中的实体的更新。域可以定义分区强制器2310订阅的查询。实体数据库2315可以用实体更新数据来实现该订阅。实体数据库2315可以发送与分区强制器2310订阅的查询相对应的数据。订阅可以作为初始配置提供,或经由服务动态地配置。

分区强制器可能需要知道与其域相关的分区。分区强制器可以过滤掉与其域无关的分区,使得可以更容易地对模拟进行缩放。如果域查询不与分区查询重叠,则它可能会被过滤掉。例如,如果分区强制器的域是“实体id为奇数的实体”而分区是“实体id为偶数的实体”,则查询可能会被过滤掉。更复杂的过滤器可用于更复杂的域或分区(例如,不重叠的3D空间区域)。又例如,对于基于部件和/或位置的查询以及分区强制器负责空间区域的情况,强制器可以丢弃任何不适用于他们关心的部件或他们关心的空间区域的分区。分区强制器可能会尝试确定其域中的哪些实体具有与任何分区都不匹配的部件分配。对于那些具有无效分配的实体,分区强制器可以将预期的工作器部件设置为具有匹配的分区。可以使用不同的方法来实现这一点。例如,分区强制器可能会订阅实体数据库查询,该实体数据库查询返回位于分区强制器的域内且错误分配的实体的计数。当该计数不为零时,分区强制器可能会做出反应。又例如,分区强制器可以订阅其域内的所有实体,并在强制器内进行分区有效性检查。

系统2300可以包括虚拟进程管理器2325(例如,虚拟工作器管理器)。类似于天眼装置2330,虚拟工作器管理器2325可以与其他服务位于同一地点以节省所使用的服务器的数量,或者可以不与其他服务位于同一地点。虚拟工作器管理器2325可以从负载平衡策略算法2332接收一组虚拟进程(例如,工作器)2334。一组虚拟进程2334可以包括将要存在的虚拟进程的列表,并且虚拟进程管理器2325可以确定物理进程是否存在并且根据需要启动和停止进程。虚拟工作器管理器2325可以管理工作器之间的虚拟到物理的映射。例如,虚拟工作器管理器2325可以与工作器运行器或层2320通信以启动和停止工作器并根据需要创建新的工作器。虚拟工作器管理器2325可以启动和停止物理进程以运行虚拟工作器。虚拟工作器管理器2325还可以从桥接器服务器或层2318(或一个或多个其他服务)接收关于工作器的状态的信息,诸如它是否已连接、是否已崩溃、延迟是否低、是否有资源来运行等。例如,满足虚拟工作器的物理进程可能会在模拟期间崩溃,并且虚拟工作器管理器2325可能会启动另一个物理进程来替换崩溃的物理进程。虚拟工作器管理器2325还可以接收指示连接到桥接器层2318中的桥接器的工作器的数量和类型的信息。分区强制器2310和虚拟工作器管理器2325可以用于实现由负载平衡策略算法2332并且基于从负载平衡策略算法2332接收的数据确定的策略意图。

图24示出了根据本文所述的一个或多个说明性方面的分区和策略意图的示例。分区1可以包括在分配给工作器A的矩形2410(或其他形状)内的物理部件。分区2可以包括在分配给工作器B的矩形2420(或其他形状)内的物理部件。分区3 2430可以包括分配给工作器C的天气部件。针对图24所示的示例分区的策略意图2440可以包括例如:

图25示出了根据本文所述的一个或多个说明性方面的多个实体以及实体分配的示例。该示例的策略意图可以将位于分区R 2510内的实体(诸如实体2505a至2505c)映射到工作器A。其他实体(诸如实体2505d至2505f)可以映射到其他工作器。

通常,模拟世界可以具有多个分区,并且每个分区可以对应于实体可以满足的不同度量。例如,分区可以是有界区域,诸如球形、圆柱形、盒形、矩形或其他形状。以上所述的图24和图25示出了不同有界区域的示例,诸如矩形2410、矩形2420或圆形2510。实体可以满足分区的度量。在分区是有界区域的示例中,实体可以位于第一有界区域中,并且因此满足针对第一有界区域的度量。在模拟期间,实体可能会在模拟世界中移动,并且最终可能会出现在与第一有界区域不同的第二有界区域中。在这种情况下,实体可能不再满足针对第一有界区域的度量,但可能满足了针对第二有界区域的度量。可以使用针对分区的其他度量。例如,如以上针对图24所述,度量可以是不同类型的部件,诸如物理部件、天气部件或任何其他类型的部件。可以使用不同度量的组合。再次参考图24,分区1的度量可以是矩形2410内的物理部件,分区2的度量可以是矩形2420内的物理部件,并且分区3的度量可以是所有天气部件。模拟世界可以分为许多不同的分区。分区可以使用任何数量的不同类型的度量,并且在某个时间点满足这些度量的实体可以在该时间点分配给一个或多个相应分区。

返回图23,系统2300可以包括负载平衡器工作器2335。负载平衡器工作器可以在外部(例如,在用户空间中),并且可以允许用户开发或添加到负载平衡策略。例如,在一些情况下,负载平衡器工作器2335可以替换天眼装置2330。类似于天眼装置2330,负载平衡器工作器2335可以确定要由一个或多个分区强制器2310和/或虚拟工作器管理器2325使用的策略意图。负载平衡器工作器2335可以存在于任何其他种类的工作器可以运行的位置。在一些情况下,多个负载平衡器工作器可能有助于全局策略意图,并且负载平衡器工作器可能从几个不同的机器中完成这项工作。使用一个或多个负载平衡器工作器2335可能是有益的,因为用户可能对其专门用例有附加了解,这可能会导致更好的负载平衡算法决策。负载平衡器工作器2335可能够查询或订阅模拟,了解用户的模式和/或在模拟运行时内改变某些状态。负载平衡器工作器2335可以经由其桥接器(未示出)订阅来自数据库2315的一个或多个查询。负载平衡器工作器2335可以向负载平衡策略算法2332并且经由其桥接器发送负载平衡器实体更新。

图26示出了根据本文所述的一个或多个说明性方面的更换工作器的示例。开发人员的计算机2640可以运行外部工作器2642。如果开发人员期望用在开发人员的计算机2640上运行的外部工作器2642替换现有工作器,则开发人员的计算机2640可以向虚拟工作器管理器2325发送虚拟工作器覆盖命令。基于该命令,虚拟工作器管理器2325可以用外部工作器2642替换工作器2622。例如,虚拟工作器管理器2325可以向工作器层2320发送停止工作器2622或使工作器与桥接器2617断开连接的请求。然后,外部工作器2642可以连接到并且使用先前由工作器2622使用的桥接器2617。通过进行该工作器替换过程,现在可以由外部工作器2642处理分配给受管理的工作器2622的实体部件。替换工作器可以帮助用户更容易地尝试负载平衡配置并调试场景。例如,用户可能会在其模拟中观察到一个错误,该错误可能与世界的分配给特定受管理的工作器的特定部分相关联。用户可以将工作器连接到正在运行的部署,并让新工作器从部署中的现有工作器接管负载,从而替换现有工作器在负载平衡器策略中的角色。用户可以用被启用来跟踪先前的工作器所遇到的问题的附加配置文件或者用完全不同的逻辑来连接工作器。通过将受管理的工作器替换为在其自己控制下的工作器,用户可以修改工作器使用的逻辑,添加附加日志记录和调试,和/或以其他方式调查错误原因。

分区部件可以放置在不同种类的实体上。例如,假定模拟包括多个受管理的物理工作器、一个要成为全局的受管理的拍卖行工作器以及多个玩家。每个玩家实体(或每个玩家的客户端的虚拟工作器实体)可以具有分区部件,该分区部件可以被用来使玩家获得对他或她的控件的权限。玩家实体或玩家客户端的虚拟工作器实体上的示例分区部件如下:

在世界中放置的几个负载平衡实体上可能会有分区部件,以在空间上分布物理工作器。负载平衡实体上的示例分区部件如下:

在用于单例拍卖行工作器的虚拟工作器实体上可能有分区部件。拍卖行工作器的示例分区部件如下:

如前所述,可以将分区部件放置在不同种类的实体上,这取决于系统正在处理的特定负载平衡情况。对于不受管理的工作器(例如,玩家),分区的生命周期可以对应于玩家的生命周期。该示例可以假定玩家实体在玩家断开连接时消失。但是,如果在玩家断开连接时玩家实体没有消失,则可以将分区放置在与玩家客户端相关联的工作器实体上。对于空间上负载平衡的工作器(例如,物理),活动可能是就空间区域而言发生的,因此世界中的负载平衡实体可以描述局部分区。对于单例或全局工作器,分区可以放置在单例虚拟工作器实体本身上。

分区部件的使用可以实现工作器负载平衡。这也可以提供一种将粗粒度的负载平衡意图复制到快照中的方法,这可以允许模拟更从容地处理在负载平衡过渡过程中拍摄的快照。表达负载平衡的分区部件还可以允许在其周围构建工具(例如,在检查器中渲染分区)。负载平衡意图的分区部件还可以允许更容易地构建内部运行时功能。例如,工作器管理器可以容易地确定需要启动以便实现分区集的工作器。

受管理的工作器的订阅政策(例如,检出政策)可以基于它们意图具有权限的区域,而不是基于它们当前具有权限的实体。这可能意味着可以避免受管理的工作器不必要地检入和检出实体的情况。例如,如果受管理的工作器不仅知道其拥有所有权的要模拟的即时实体,而且可能知道描述其可能模拟的较大查询,则受管理的工作器可以预加载资产或预填充高速缓存,使得在查询的区域内(但不在现有实体附近)模拟实体可能会更容易。

在一些情况下,两个或更多个分区可能会重叠。可以使用强制服务来决定要分配哪个相应的预期工作器。可以使用的冲突解决方法可能是,在当前分配与任何有资格的预期工作器都不匹配时,改变工作器分配。这样,可以避免不同的预期工作器之间的振荡,这会产生滞后,并且出于性能原因可能是好的(例如,由于切换权限可能具有相关联的成本)。每个分区强制器可能知晓世界中的分区,诸如所有分区。

许多实体部件可能属于单个分区,但是一些实体部件可能属于多个分区,从而导致重叠的分区。可以定义重叠分区的期望行为。例如,可以确定实体部件在不同分区之间的过渡。

图27示出了根据本文所述的一个或多个说明性方面的分区重叠的示例。例如,当实体42位于位置2705处时,最初可以将实体42分配给工作器1。当实体42移动到重叠分区的区域(诸如位置2710)时,实体42可能不会重新分配给工作器2,因为分区A可能仍然有效。如果实体42继续从分区A出去而进入分区B有效(但分区A无效)的区域(诸如位置2715),则可以将实体42重新分配给工作器2。但是,如果在位置2710处时,实体42返回到分区A有效(但分区B无效)的区域(诸如位置2720),则系统可能不希望将权限改变为工作器2。

用户可以配置重叠的预期权限频带以防止权限抖动(例如,空间滞后),以便解决多个分区有效的情况。如果预期行为是仅有一个工作器对一个空间区域具有权限,则可以在没有重叠分区的情况下设置配置。

模拟中基于查询的兴趣的示例

如前所述,模拟世界可以包括多个实体,并且每个实体的一种或多种状态可以存储在那些实体上的部件中。工作器可以执行处理并且可以更新部件的状态。在一些情况下,可以为每个实体指定一个工作器,以对实体的状态具有权限。在例如具有复杂实体交互的系统中,每个工作器可能够观察模拟世界中实体的某个子集,以便决定如何更新其权限实体。要观察哪个工作器模拟其权限实体可能是该工作器的兴趣,并且工作器的兴趣描述的实体集可以包括工作器的世界视图。

在一些模拟系统中,可以使用每个工作器可以看到的内容的范例。例如,可以将工作器分配给模拟世界中的特定位置。可以基于该所分配的位置以及例如与该位置相关联的形状(例如,围绕工作器的位置的半径为30米的球形)来构建工作器的世界视图。图28示出了根据本文所述的一个或多个说明性方面的多个实体以及基于工作器的兴趣的示例。可以将工作器分配给模拟世界中的位置2805。工作器的兴趣2810可以包括例如围绕工作器位置2805的半径为r的球形内的实体。基于工作器的兴趣2810,工作器的视图可以包括在工作器的兴趣2810中的实体集,诸如实体2820和实体2822。工作器的视图可能不包括工作器的兴趣2810之外的其他实体。

在一些模拟系统中,可以使用每个实体可以看到的内容的范例。模拟可以表达对实体及其部件的兴趣(例如,而不是对工作器的兴趣)。可以定义针对每个实体的兴趣,并且工作器可以继承实体的兴趣,因为工作器可能正在模拟实体。兴趣可能是空间的,但也可能不是空间的。在一些示例中,实体可以包括多个部件,包括兴趣部件。例如,玩家实体可以包括兴趣部件和一个或多个其他部件,诸如物理部件、健康状况部件、聊天部件和/或其他部件。实体兴趣可以包括工作器模拟给定实体所需的事物。例如,玩家实体的实体兴趣可能是“距玩家实体20米以内的实体”。实体视图可以包括在某个时间点满足实体兴趣的实体集。在使用基于实体的兴趣的情况下,工作器视图可以包括工作器对其具有权限的实体的实体视图的并集。基于实体的兴趣可能会为具有复杂实体类型的系统提供更多的灵活性和可扩展性,因为不管需求如何,实体可能不会得到同等对待。

图29示出了根据本文所述的一个或多个说明性方面的多个实体以及基于实体的兴趣的示例。例如,工作器可能对实体2922有权限。实体2922可以在权限实体位置2905处。实体兴趣2915可以包括例如围绕实体位置2905的半径为r的球形。实体视图2910可以包括满足实体兴趣2915的实体集(例如,围绕实体位置2905的半径为r的球形内的实体)。例如,实体2922的实体视图2910可以包括实体2920。实体视图2910可能不包括实体兴趣2915之外的其他实体。

图30示出了根据本文所述的一个或多个说明性方面的多个实体以及基于实体的兴趣的另一个示例。例如,工作器可以对多个实体具有权限,诸如实体3020、实体3022和/或其他实体。实体3020和实体3022可以在不同的权限实体位置3005处。实体3020的实体兴趣可以包括例如围绕实体3020的位置的半径为r的球形。实体3022的实体兴趣可以包括例如围绕实体3022的位置的半径为r(或不同于r的另一个半径)的球形。工作器视图3015可以包括既满足实体3020的实体兴趣又满足实体3022的实体兴趣的实体集(例如,两个实体兴趣的并集)。

当视图与实体相关联时,模拟系统可能够理解更复杂的视图。先前描述了包括圆形和球形的兴趣区域的示例。然而,可以使用其他基本或复杂的形状(例如,圆柱形、矩形、立方形、自定义形状等)来定义兴趣区域。另外地或替代地,模拟系统可以使用查询语言来定义兴趣。可以使用包括简单形状查询的查询语言来表示简单形状查询,并且可以在实体的基础上应用这些查询,从而得到更加灵活的模拟系统。

作为定义形状查询的查询语言的简要示例,如果实体的兴趣是围绕实体的半径为20的球形,则兴趣可以表示为:

var playerConstraint=new QueryConstraint(){

relativeSphereConstraint=new RelativeSphereConstraint(20)}};

可以支持其他类型的查询,并且可以以各种独特的方式扩展查询语言。例如,查询语言及其查询可以任选地包括各种元素,诸如频率、部件值匹配和/或参考兴趣。

在一些示例中,表达兴趣的一种或多种查询语言可以支持一个或多个频率元素,这在一些情况下可以允许更复杂的视图。可以针对一个或多个兴趣区域来调整工作器接收更新的频率。代替表示模拟的实时状态的所有视图,如果例如工作器正在模拟的部件对时间不敏感,则该工作器可以选择不那么频繁地接收更新。通过指定工作器接收更新的频率,可以通过模拟的网络发送更少的信息,从而导致带宽和网络资源被释放以用于其他用途。

图31示出了根据本文所述的一个或多个说明性方面的多个实体以及基于实体的兴趣的示例。例如,工作器可能对实体3120有权限。实体3120可以在权限实体位置3105处。实体兴趣3115可以包括例如围绕实体位置3105的半径为r1的球形和/或围绕实体位置3105的半径为r2的球形。半径r2可以大于半径r1(或者反之亦然)。在一些示例中,实体兴趣3115可以包括针对球形r1和r2中的一者或两者的频率元素,并且该频率元素可以指示工作器接收针对在各个球形r1和r2中的每一者内的实体的更新的频率。r1和r2的频率元素可以相同或不同。作为示例,用于接收针对球形r1内的实体的更新的频率可以是60赫兹,并且用于接收针对球形r2内的实体的更新的频率可以是10赫兹。在该示例中,实体兴趣3115可以包括{半径为r2的球形为10hz,半径为r1的球形为60hz}的并集。实体视图可以包括满足实体兴趣3115的实体集。例如,实体视图可以包括以60赫兹的频率对实体3122的更新以及以10赫兹的频率对实体3124和3126的更新。对实体3120具有权限的工作器可以以60赫兹的频率接收对实体3122的更新(如果有的话),并且可以以10赫兹的频率接收对实体3124和3126的更新(如果有的话)。实体视图可能不包括实体兴趣3115之外的其他实体。通过以不同的频率接收针对实体的更新,可以减少模拟期间网络和通信资源的使用率,并且可以增加带宽并将其用于模拟的其他部分。此外,模拟可以更具可扩展性和灵活性。如前所述,通过指定工作器接收更新的频率,可以通过模拟的网络发送更少的信息,从而导致带宽和网络资源被释放以用于其他用途。

在一些示例中,表达兴趣的一种或多种查询语言可以支持部件值匹配。如前所述,兴趣可以基于位置。但是,通过将兴趣表达为查询,可以扩展查询语言以基于特定的部件值来另外地或替代地指定兴趣。例如,实体可以表达对“团队部件等于team_A的所有实体”的兴趣查询,并且权限工作器可以从具有团队部件“team_A”的实体接收更新。如前所述,部件值匹配可以与位置和/或频率元素组合。例如,在两个团队之间的模拟战斗环境中,可以组合不同的技术以提供一个非常丰富的世界。玩家实体可以支持例如以下三个查询:(1)实时更新的有关20米以内玩家的详细信息,这可以模拟局部可见环境;(2)每秒更新6次的100米以内任何玩家的位置、装备、高度和/或重量,这可以模拟远距离的人类视觉;以及(3)每秒1次的位于玩家实体团队中的任何玩家的位置,这可以模拟与团队成员的GPS位置同步。

在一些示例中,一种或多种查询语言可以支持参考兴趣(例如,基于其他实体的兴趣)。因为兴趣查询可以由存储模拟世界状态的系统评估,所以兴趣查询可以支持指示其他实体的兴趣。如前所述,实体可以表达对围绕自身的球形的半径(或围绕自身的另一种形状的另一尺寸)的兴趣。然而,实体也可以或替代地将其兴趣定义为包括围绕另一个实体的球形或其他形状。实体也可以或替代地使其兴趣基于另一实体的位置。如前所述,查询不需要是空间的,并且兴趣可能不是基于任何实体的位置的。对基于目标实体表达兴趣的实体具有权限的工作器可能对目标实体具有权限,或者可能对目标实体没有权限。在任何一种情况下,工作器都可以基于相对于目标实体表达的兴趣来接收更新。如前所述,参考兴趣可以与位置元素、频率元素和/或部件值匹配组合。在上述模拟战斗环境上进行扩展,玩家还可以控制无人机。玩家实体的兴趣查询可以补充有每秒更新3次的无人机实体10米以内任何玩家的位置、装备、高度和/或重量。例如,这可以模拟受控无人机的受限相机技术。此外,在参考兴趣的情况下,可能有多个玩家对同一无人机有兴趣。

可以在每个实体的部件上分别表达兴趣,这可以允许灵活地定义兴趣区域。在一些情况下,每个实体-部件可能仅对单个工作器具有权限。例如,工作器可以对实体的单个部件具有权限(例如,模拟可以在实体-部件粒度上进行)。如前所述,模拟运行时可以将实体分为部件,并且每个部件可以对单个工作器具有权限。但是,同一实体上的不同部件可以对不同的工作器具有权限。通过将兴趣查询附加到实体-部件(例如,而不是实体),可以将实体-部件权限模型应用于兴趣。

对实体-部件的兴趣查询可以允许模拟系统将功能与部件相关联。例如,假定游戏模拟支持映射。用于表示映射上的实体的数据可以放置在映射部件上。用于填充映射数据的兴趣查询可以专门查询该映射部件。然后,基于实体是否具有映射部件,可以从映射中添加或移除任何实体。现在,映射部件不仅仅是数据的集合。它可能是实体是否支持一种类型的功能的标记。下面将描述在实体-部件上表达的兴趣的示例,诸如在MapRepresentation部件中。

兴趣部件可以包括部件标识符到查询和/或频率的映射,并且兴趣部件可以作为部件被添加到一个或多个实体。可以用从工作器发送的部件更新来更新映射部件字段,并且开发人员可以具有在运行时更新兴趣查询的能力。这些查询可以用面向公众的查询语言的扩展编写,并且然后可以转换为实体数据库所使用的内部查询语言。在于2018年7月23日提交的标题为“ENTITY DATABASE”的美国申请第16/042,068号中描述了实体数据库的各种示例,其全部内容通过引用合并于此。

实体的示例部件字段可以编码该实体的{component_id->(query,frequency)}的映射。桥接器可以将该映射解释为好像桥接器对该实体上的“component_id”具有权限。该映射可能仅与对相应实体上的至少一个部件具有权限的工作器有关。对于其他工作器,该映射可能不会起作用,并且相应的桥接器可能不会基于该映射承担权限。如前所述,权限分配和强制可以由负载平衡系统执行。桥接器可以以指定的频率订阅来自满足查询的数据源(例如,实体数据库)的更新。例如,在特定工作器对一个兴趣具有权限的情况下,桥接器可以选择该兴趣。桥接器可以基于相应权限工作器的兴趣部件中的查询来更新其查询订阅。在这些示例中,查询可以包括诸如针对每个模拟实体-部件的查询-频率对。可以为不同的查询指定频率。此外,可以为不同的查询指定不同的频率。可以经由部件更新来更新兴趣部件中的查询。

可以指定默认查询。例如,可以在桥接器配置中为每个component_id指定默认查询。如果在兴趣部件中没有为实体-部件显式地设置默认查询,则运行时可以基于某个预配置的查询为实体-部件自动地设置兴趣查询。例如,用户可能够在桥接器配置中表达一种或多种部件类型(例如,PlayerControls或其他部件类型)的默认兴趣和频率:

同样或替代地,每个实体都可以包含兴趣部件,诸如:

component Interest{

mapcomponent_interest=1;

}

uint32可以保存部件ID(例如,以上的PlayerControls部件可以被分配部件ID,并且该部件ID可以被包括在uint32字段中)。InterestConfig可以包括一个或多个查询的列表。map可以包括称为component_interest的字段的类型。因此,component_interest可以包括将部件类型(例如,由它们的唯一ID指代)映射到相应查询(例如,在InterestConfig中列出的查询,其可以包括一个查询或多个查询)的映射。如果InterestConfig列出了多个查询,则系统可以取多个查询的一个或多个并集以创建单个查询或更少的查询。兴趣部件可以在实体创建时由用户添加,或者如果模拟系统支持,则可以稍后添加。例如,如果映射包含针对PlayerControls的条目,则相关联的查询频率对可以覆盖PlayerControls的默认设置(例如,在桥接器配置中指定)。如果随后移除了这种映射,则兴趣集可以恢复为默认兴趣。实体的兴趣部件也可以在运行时诸如由兴趣部件的权限工作器进行更新。如前所述,实体的部件可能对多个工作器具有权限,但是每个实体-部件可能对一个工作器具有权限。这些更新可以在运行时更新对相应实体-部件具有权限的一个或多个工作器的感兴趣的查询和/或频率。因为兴趣部件的权限工作器可以对兴趣部件进行改变,所以用户可以选择是否希望客户端侧或服务器侧的权限模型来控制对兴趣集的改变。

受管理的工作器可用于例如管理对单个实体部件的权限或管理对一个地方的兴趣。受管理的工作器可以显式地更新兴趣部件。兴趣部件的权限可以由单个受管理的工作器持有。受管理的工作器可以经由受管理的工作器观察到的命令或部件更新接收来自其他工作器的请求。受管理的工作器可以是对实体的部件具有权限的受管理的工作器之一,或者可以是仅管理兴趣改变的专用的受管理的工作器。工作器可能够基于工作器当前正在模拟的实体部件来修改其兴趣。基于受管理的工作器对客户端的观察和/或通过客户端发出改变其兴趣的请求(例如,经由命令),受管理的工作器可以更新客户端的兴趣。如前所述,客户端的兴趣可以存储在实体上的部件(诸如兴趣部件)中。工作器可以使用与工作器用于修改实体上其他部件的部件更新类似的部件更新来修改客户端的兴趣。因此,更新机制可以是统一的,从而导致改进的且更高效的可用性。当工作器对特定实体上的部件具有权限时,工作器的兴趣集可以自动更新(例如,扩展)以包括与该实体-部件相关联的查询。例如,假定工作器在游戏模拟中对PlayerControls部件具有权限。工作器的兴趣集可以以30赫兹的频率进行扩展以包括例如100米以内的实体的部件变换、库存和/或健康状况。

现在将讨论兴趣部件的各种示例。例如,假定玩家实体上具有以下部件:

在局部环境中,位置部件可以创建球形兴趣,诸如:

Interest={54->And(InSphere(20),HasComponent(2000))}

在该示例中,位置部件的component_id可以是54,并且兴趣可以导致返回20米以内的其他玩家实体(例如,对应于id 2000)。除了部件ID为54的条目之外,还可能有部件ID为2004、部件ID为2005和/或任何其他部件ID的条目。可以在玩家实体上的InterestComponent以及以上列出的玩家实体上的其他部件中指定兴趣。

在不同的环境中,以上的位置部件可以更新为:

Interest={54->Or(

And(InSphere(20),HasComponent(2000)),ReturnComponents(2000),

InSphere(50),ReturnComponents(2000,2001),frequency 10hz)}

ReturnComponents可用于接收部件状态或更新。例如,ReturnComponents(2000)可以用于发送PlayerInfo,其部件ID为2000。ReturnComponents(2000,2001)可用于发送PlayerInfo和Appearance。在第一个距离示例InSphere(20)中,如果玩家实体在20米外,则系统可能不会返回玩家实体的外观,因为在该距离处玩家可能看起来像不透明的人物。兴趣可能导致还以较低的频率(例如,10赫兹)显示更远距离(例如,50米)内的实体。类似地,对于距离较远的大型事物,可以使用大量部件和减少的频率更新。

游戏模拟中的狙击步枪可以包括兴趣,诸如:

Interest={2003->InCone(range,fov)}

该兴趣也可能在玩家的实体上。通常,玩家可能具有上述的54->查询映射。但是,如果玩家配备了狙击步枪,则玩家实体可能会更新为具有{54->Query,2003->Cone},并且系统可能会将两个结果都发送给客户端。客户端可以将兴趣设置为InCone(range,fov),诸如对于具有服务器作弊检测的客户端权限游戏。服务器作弊检测器工作器可以订阅Interest和SniperRifle两者上的更新,并且可以核实射程和视野对于配备的步枪是准确的。对于服务器权限游戏,客户端可以在PlayerControls中设置字段(或具有在服务器侧验证的客户端权限SniperRifle部件)。受管理的工作器可以用视野和射程来更新针对玩家实体的SniperRifle部件的Interest部件。对于例如双筒望远镜,可以类似地表达兴趣。

对迷你地图的兴趣可以表达为例如:

Interest={2004->And(InSphere(40),HasComponent(2004)),ReturnComponents(2004)}

除了上述部件中的一个或多个之外,还可以添加迷你地图兴趣。游戏屏幕的大部分可能是玩家周围区域的视图,侧重点是沿着狙击步枪的视锥的视图。例如,在屏幕的角落,游戏客户端可以绘制像雷达的小版地图,该地图仅以诸如迷你地图的形式示出其他玩家位于区域中的位置。因为这是一个迷你地图,所以可能不需要将例如任何玩家的外观流式传输到客户端。而是,玩家实体可能只需要MapRepresentation部件中包括的数据子集。可以通过几种方式表达对团队信息的兴趣。例如,可以添加像HasEqualComponent的方法,诸如:

Interest={{2002->HasEqualComponent(2002),ReturnComponent(2000)}}

如果一对实体都具有该命名的部件并且值相等,则HasEqualComponent对于该两个实体可能返回“真”。

又例如,受管理的工作器可以控制兴趣。受管理的工作器可以获得相关游戏玩法部件(例如,在该示例中为团队部件)的值,并且可以查询该部件等于团队值的实体。受管理的工作器可以用找到的实体的ID更新玩家实体上的兴趣部件:

Interest={{2002->HasEntityId(...),Return...}}

在大型多玩家在线(MMO)系统中,可能会使用团队或行会成员信息。例如,受管理的工作器可以设置GuildMemberInfo,它可以具有多个字段。另外地或替代地,可以将GuildMemberInfo分为两个(或更多个)部件。第一部件可以是比较器,并且如果比较器满足约束条件,则第二部件可以是要共享的信息。

对于潜行系统,可以表达对例如局部环境中处于非潜行模式的任何事物的兴趣。兴趣部件可能对受管理的工作器具有权限,以避免被攻击的客户端看到潜行的玩家。例如,兴趣可以表示为:

Interest={2000->AND(InSphere(20),ComponentEquals(2006,0))}

如果实体具有拥有所提供编号的component_id,并且如果该部件具有所提供的值,则ComponentEquals可能返回“真”。为了处理能够看到潜行的团队或双方,开发人员可以为HasEqualComponent(2002)添加另一个约束条件,或者受管理的工作器可以与团队信息用例类似地添加对特定entity_id的兴趣。是添加另一个约束条件还是受管理的工作器添加兴趣可能取决于潜行在游戏中是非常普遍还是相对罕见。

兴趣可能会考虑带宽约束。例如,开发人员可以执行对玩家客户端有权将其设置为较低的频率和/或较小的半径的任何实体的兴趣的单个部件更新。这可以以精细的粒度完成,因为如果客户端检测到它使用的带宽过多,则它可以经由部件更新和/或经由对受管理的工作器的命令(例如,对于服务器权限部件)(例如,逐渐地)降低所设置的频率或查询。替代地,玩家实体可以具有多个部件,其可以对应于客户端类型(例如,DesktopClientComponent、MobileClientComponent等)。可以针对其带宽限制来定制针对这些中的每一个的兴趣查询。这种方法的优点是可以为受管理的工作器使用类似的机制。例如,假定非玩家部件通常具有10米的视距。所设置的默认的兴趣可能是10米。但是,通过调谐,游戏开发人员可能知道,如果尝试考虑超过20个实体,则其非玩家部件AI可能会变得太慢。如果工作器发现自己知道太多实体(例如,另一阈值数量中的50个实体),则工作器可以动态地减小视距(例如,减少到9米、5米等)。

尽管经已关于虚拟硬件服务器描述了各实施方案和方面,但是所述方法和系统也可以与其他硬件或服务器(包括本地或物理服务器)一起使用。

尽管已经用特定于结构特征和/或方法动作的语言描述了主题,但是应当理解,所附权利要求书中定义的主题不必限于上述的特定特征或动作。而是,上述的特定特征和动作被描述为以下权利要求的示例实现方式。

技术分类

06120112852460