隔离游戏逻辑的方法、装置、电子设备和存储介质与流程

    专利2022-07-08  126


    本申请涉及游戏开发
    技术领域
    ,特别是涉及隔离游戏逻辑的方法、装置、电子设备和存储介质。
    背景技术
    :游戏开发过程中,会考虑到玩家和玩家之间的交互玩法,同时也会考虑到玩家自己的单机逻辑玩法。因此,在游戏的过程中,不同的玩家会有不同的玩法。然而,按照目前的游戏逻辑的实现方法,若在游戏的过程中触发bug,很可能会影响到其他玩家。例如,对于单机逻辑玩法,如果在游戏的过程中触发bug引起其他玩家的数据异常或者进程崩溃就会导致很大的麻烦。目前针对相关技术中如何避免因触发bug引起其他玩家的数据异常或者进程崩溃,尚未提出有效的解决方案。技术实现要素:本申请实施例提供了一种隔离游戏逻辑的方法、装置、电子设备和存储介质,以至少解决相关技术中如何避免因触发bug引起其他玩家的数据异常或者进程崩溃的问题。第一方面,本申请实施例提供了一种隔离游戏逻辑的方法,应用于服务器,所述方法包括:预创建对象池,所述对象池包含预设数目的空闲的对象,每个所述空闲的对象包含玩家唯一标识和模板类数组,所述模板类数组支持预设数目的游戏逻辑;预创建预设数目的线程,所述预设数目的线程带有编号;当玩家上线时,从所述空闲的对象中选用对象,用该玩家的玩家id对选用的对象的所述玩家唯一标识进行赋值,并将所述玩家id映射到相应编号的线程;当接收到进入游戏逻辑的请求时,通过与所述玩家id对应的线程从所述对象池中获取与所述玩家id对应的对象,并从该对象的所述模板类数组中查找与所述请求对应的游戏逻辑;执行查找的游戏逻辑。在其中一些实施例中,所述对象的数目根据所述服务器承载的最大值进行配置。在其中一些实施例中,所述预设数目的空闲的对象位于一个数组中。在其中一些实施例中,每个所述游戏逻辑中设有出错捕获机制,用于决定是否强制踢玩家下线。在其中一些实施例中,所述出错捕获机制通过c语言的try、python语言的try-catch或lua语言的xpcall来实现。在其中一些实施例中,所述出错捕获机制包括:若出现以下逻辑不合法的情况:在进行内存的读写时读或写到了错误的内存,或者数组下标越界,或者除数为0,则强制踢玩家下线。在其中一些实施例中,所述隔离游戏逻辑的方法还包括:当玩家下线后,释放选用的对象,使该对象恢复空闲状态。第二方面,本申请实施例提供了一种隔离游戏逻辑的装置,包括对象池创建模块、线程创建模块、映射模块、查找模块和执行模块,其中,对象池创建模块用于预创建对象池,所述对象池包含预设数目的空闲的对象,每个所述空闲的对象包含玩家唯一标识和模板类数组,所述模板类数组支持预设数目的游戏逻辑;线程创建模块用于预创建预设数目的线程,所述预设数目的线程带有编号;映射模块用于当玩家上线时,从所述空闲的对象中选用对象,用该玩家的玩家id对选用的对象的所述玩家唯一标识进行赋值,并将所述玩家id映射到相应编号的线程;查找模块用于当接收到进入游戏逻辑的请求时,通过与所述玩家id对应的线程从所述对象池中获取与所述玩家id对应的对象,并从该对象的所述模板类数组中查找与所述请求对应的游戏逻辑;执行模块用于执行查找的游戏逻辑。第三方面,本申请实施例提供了一种电子设备,包括处理器和存储有计算机程序的存储介质,所述计算机程序被所述处理器执行时实现如上述任一项所述的隔离游戏逻辑的方法。第四方面,本申请实施例提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如上述任一项所述的隔离游戏逻辑的方法。根据上述内容,本申请实施例的隔离游戏逻辑的方法包括:预创建对象池,该对象池包含预设数目的空闲的对象,每个空闲的对象包含玩家唯一标识和模板类数组,该模板类数组支持预设数目的游戏逻辑;预创建预设数目的线程,该预设数目的线程带有编号;当玩家上线时,从空闲的对象中选用对象,用该玩家的玩家id对选用的对象的玩家唯一标识进行赋值,并将玩家id映射到相应编号的线程;当接收到进入游戏逻辑的请求时,通过与玩家id对应的线程从对象池中获取与玩家id对应的对象,并从该对象的模板类数组中查找与请求对应的游戏逻辑;执行查找的游戏逻辑。根据本申请实施例,实现了玩家间隔离、玩法(即游戏逻辑)间隔离和线程间隔离,有效解决了如何避免因触发bug引起其他玩家的数据异常或者进程崩溃的问题。附图说明此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:图1是根据本申请实施例的隔离游戏逻辑的方法的流程图;图2是根据本申请实施例的玩家上线时服务器执行的流程示意图;图3是根据本申请实施例的隔离游戏逻辑的装置的结构框图;图4是根据本申请实施例的电子设备的结构框图。具体实施方式为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。基于本申请提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。显而易见地,下面描述中的附图仅仅是本申请的一些示例或实施例,对于本领域的普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图将本申请应用于其他类似情景。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本申请公开的内容相关的本领域的普通技术人员而言,在本申请揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本申请公开的内容不充分。在本申请中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域普通技术人员显式地和隐式地理解的是,本申请所描述的实施例在不冲突的情况下,可以与其它实施例相结合。除非另作定义,本申请所涉及的技术术语或者科学术语应当为本申请所属
    技术领域
    内具有一般技能的人士所理解的通常意义。本申请所涉及的“一”、“一个”、“一种”、“该”等类似词语并不表示数量限制,可表示单数或复数。本申请所涉及的术语“包括”、“包含”、“具有”以及它们任何变形,意图在于覆盖不排他的包含;例如包含了一系列步骤或模块(单元)的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可以还包括没有列出的步骤或单元,或可以还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本申请所涉及的“连接”、“相连”、“耦接”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电气的连接,不管是直接的还是间接的。本申请所涉及的“多个”是指两个或两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“a和/或b”可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。本申请所涉及的术语“第一”、“第二”、“第三”等仅仅是区别类似的对象,不代表针对对象的特定排序。为了解决因触发bug引起其他玩家的数据异常或者进程崩溃的问题,本申请实施例提供了一种隔离游戏逻辑的方法,图1是根据本申请实施例的隔离游戏逻辑的方法的流程图,如图1所示,该方法包括:s100:预创建对象池,该对象池包含预设数目的空闲的对象,每个空闲的对象包含玩家唯一标识和模板类数组,该模板类数组支持预设数目的游戏逻辑;s200:预创建预设数目的线程,该预设数目的线程带有编号;s300:当玩家上线时,从空闲的对象中选用对象,用该玩家的玩家id对选用的对象的玩家唯一标识进行赋值,并将玩家id映射到相应编号的线程;s400:当接收到进入游戏逻辑的请求时,通过与玩家id对应的线程从对象池中获取与玩家id对应的对象,并从该对象的模板类数组中查找与请求对应的游戏逻辑;s500:执行查找的游戏逻辑。需要说明的是,步骤s100和s200可以有先后顺序,也可以是同时的。根据上述内容,实现了玩家间隔离,即不同玩家不会相互影响;玩法间隔离,即不同玩法不会相互影响;以及线程间隔离,即不同线程不会相互影响,从而能够有效的解决因触发bug引起其他玩家的数据异常或者进程崩溃的问题。为了对本申请实施例的隔离游戏逻辑的方法进行详细的说明,以下举出具体的示例。每个玩家用一个类来表示,大致结构如下:classplayerdata{intm_iplayerid;t**m_pklogic;};其中,m_iplayerid代表玩家唯一标识,m_pklogic代表这个玩家实际的逻辑驱动类对象。优选的,m_pklogic是一个模板类数组,可以支持不同的游戏逻辑(游戏逻辑的数目可以预先设置),这样就能实现不同玩法(即游戏逻辑)之间的隔离,从而一个玩法的进程崩溃不会影响其他玩法。上述模板类数组可以认为是多个游戏逻辑的集合,不同的游戏逻辑实现主要体现在接口上,相同的接口通过不同的游戏逻辑实现来完成不同的逻辑功能,例如战斗的逻辑用战斗类来实现,迷宫的逻辑用迷宫类来实现,剧情的逻辑用剧情类来实现。在服务器启动的时候预创建对象池,该对象池包含x个空闲的对象(即上述playerdata),每个空闲的对象包含上述玩家唯一标识和模板类数组。作为一个示例,x的值取8,如表1所示:表1为对象池中的8个对象的初始状态对象12345678状态freefreefreefreefreefreefreefree。上述x的值可以是预先设置的,可以根据服务器承载的最大值进行配置,例如,在服务器启动的时候默认x值是1000,若服务器承载不了,支持把x值调整为900或600等更小的值来适应服务器的承载。优选的,上述x个对象放在一个数组中。当玩家上线时,从对象池内空闲的对象中选用对象。比如当一个玩家上线时,从对象池中选用一个对象,对象池中的对象如表2所示:表2为对象池中的8个对象的状态对象12345678状态usedfreefreefreefreefreefreefree。此时,用该玩家的玩家id对选用的对象中的m_iplayerid进行赋值,同时可以将一些运行逻辑用到的变量默认置为初始值。此后,该玩家的游戏逻辑就一直用这个对象来实现,当该玩家下线后会释放该对象,使该对象恢复空闲状态。上述过程中,还预创建y条线程,每条线程都具有编号,从而可以将该玩家的玩家id映射到相应编号的线程。作为一个示例,比如有4条线程,分别编号为1、2、3、4,一个玩家的玩家id是1009,那么根据预先设置的映射规则(该映射规则可以根据实际需求来设置或更改),将其映射到1009mod4=1号线程上,由于对象和线程是两个维度互不影响,每个线程都是从对象池查找对象,实现了线程间玩家不会相互影响。优选的,不同的玩家id映射到不同编号的线程。当玩家上行的协议信息通过客户端发送到服务器,其中协议信息指的是客户端传给服务器的数据,包含玩家进入游戏逻辑的请求,可以通过网络消息里面获取到,此时,服务器通过与玩家id对应的线程从对象池中获取与该玩家id对应的对象,并从该对象的模板类数组中查找与上述请求对应的游戏逻辑,执行查找到的游戏逻辑。比如客户端告诉服务器我要进入战斗,服务器会判断该请求是否合法,若合法,则进入战斗逻辑的计算。为了进一步隔离,每个游戏逻辑中设有出错捕获机制,用于决定是否强制踢玩家下线,这个可以通过语言本身的一些特性来实现,比如c语言的try,python语言的try-catch、lua语言的xpcall。具体的,出错捕获机制会通过运行的环境进行检测,若出现运行逻辑不合法的情况,则强制踢玩家下线。例如,当发生以下情况:在进行内存的读写时读或写到了错误的内存,或者数组下标越界,或者除数为0等等,则强制踢玩家下线以避免更大的损失,能够在玩家出错后做到及时止损。基于上述内容,图2是根据本申请实施例的玩家上线时服务器执行的流程示意图,如图2所示,当玩家通过客户端向服务器发送进入游戏逻辑的请求时,启动进程,服务器找到与该玩家对应的线程,再找到与该玩家对应的m_pklogic(即逻辑类),然后找到与上述请求对应的游戏逻辑(即逻辑功能),其中,逻辑功能的实现提供出错捕获机制,可以在玩家出错后做到及时止损。本申请实施例还提供一种隔离游戏逻辑的装置,图3是根据本申请实施例的隔离游戏逻辑的装置的结构框图,如图3所示,该装置包括包括对象池创建模块1、线程创建模块2、映射模块3、查找模块4和执行模块5,其中,对象池创建模块1用于预创建对象池,该对象池包含预设数目的空闲的对象,每个空闲的对象包含玩家唯一标识和模板类数组,该模板类数组支持预设数目的游戏逻辑;线程创建模块2用于预创建预设数目的线程,该预设数目的线程带有编号;映射模块3用于当玩家上线时,从空闲的对象中选用对象,用该玩家的玩家id对选用的对象的玩家唯一标识进行赋值,并将玩家id映射到相应编号的线程;查找模块4用于当接收到进入游戏逻辑的请求时,通过与玩家id对应的线程从对象池中获取与玩家id对应的对象,并从该对象的模板类数组中查找与请求对应的游戏逻辑;执行模块5用于执行查找的游戏逻辑。综上,本申请实施例的隔离游戏逻辑的方法具有以下优点:(1)从对象池找到与不同玩家对应的playerdata(对象),然后进行逻辑功能的计算,实现了玩家间隔离,从而不同玩家不会相互影响;(2)m_pklogic为模板类数组,可以支持不同的游戏逻辑,实现了玩法间隔离,从而不同玩法不会相互影响;(3)通过将不同玩家的玩家id映射到不同编号的线程,实现了线程间隔离,从而不同线程不会相互影响;(4)根据出错捕获机制,当运行逻辑不合法时,强制踢玩家下线以避免更大的损失,能够在玩家出错后做到及时止损。另外,本申请实施例的隔离游戏逻辑的方法可以由电子设备来实现。图4是根据本申请实施例的电子设备的结构框图,如图4所示,该电子设备可以包括处理器81以及存储有计算机程序指令的存储器82。具体地,上述处理器81可以包括中央处理器(cpu),或者特定集成电路(applicationspecificintegratedcircuit,简称为asic),或者可以被配置成实施本申请实施例的一个或多个集成电路。其中,存储器82可以包括用于数据或指令的大容量存储器。举例来说而非限制,存储器82可包括硬盘驱动器(harddiskdrive,简称为hdd)、软盘驱动器、固态驱动器(solidstatedrive,简称为ssd)、闪存、光盘、磁光盘、磁带或通用串行总线(universalserialbus,简称为usb)驱动器或者两个或更多个以上这些的组合。在合适的情况下,存储器82可包括可移除或不可移除(或固定)的介质。在合适的情况下,存储器82可在数据处理装置的内部或外部。在特定实施例中,存储器82是非易失性(non-volatile)存储器。在特定实施例中,存储器82包括只读存储器(read-onlymemory,简称为rom)和随机存取存储器(randomaccessmemory,简称为ram)。在合适的情况下,该rom可以是掩模编程的rom、可编程rom(programmableread-onlymemory,简称为prom)、可擦除prom(erasableprogrammableread-onlymemory,简称为eprom)、电可擦除prom(electricallyerasableprogrammableread-onlymemory,简称为eeprom)、电可改写rom(electricallyalterableread-onlymemory,简称为earom)或闪存(flash)或者两个或更多个以上这些的组合。在合适的情况下,该ram可以是静态随机存取存储器(staticrandom-accessmemory,简称为sram)或动态随机存取存储器(dynamicrandomaccessmemory,简称为dram),其中,dram可以是快速页模式动态随机存取存储器(fastpagemodedynamicrandomaccessmemory,简称为fpmdram)、扩展数据输出动态随机存取存储器(extendeddateoutdynamicrandomaccessmemory,简称为edodram)、同步动态随机存取内存(synchronousdynamicrandom-accessmemory,简称sdram)等。存储器82可以用来存储或者缓存需要处理和/或通信使用的各种数据文件,以及处理器81所执行的可能的计算机程序指令。处理器81通过读取并执行存储器82中存储的计算机程序指令,以实现上述实施例中的任意一种隔离游戏逻辑的方法。在其中一些实施例中,电子设备还可包括通信接口83和总线80。其中,如图4所示,处理器81、存储器82、通信接口83通过总线80连接并完成相互间的通信。通信接口83用于实现本申请实施例中各模块、装置、单元和/或设备之间的通信。通信端口83还可以实现与其他部件例如:外接设备、图像/数据采集设备、数据库、外部存储以及图像/数据处理工作站等之间进行数据通信。总线80包括硬件、软件或两者,将电子设备的部件彼此耦接在一起。总线80包括但不限于以下至少之一:数据总线(databus)、地址总线(addressbus)、控制总线(controlbus)、扩展总线(expansionbus)、局部总线(localbus)。举例来说而非限制,总线80可包括图形加速接口(acceleratedgraphicsport,简称为agp)或其他图形总线、增强工业标准架构(extendedindustrystandardarchitecture,简称为eisa)总线、前端总线(frontsidebus,简称为fsb)、超传输(hypertransport,简称为ht)互连、工业标准架构(industrystandardarchitecture,简称为isa)总线、无线带宽(infiniband)互连、低引脚数(lowpincount,简称为lpc)总线、存储器总线、微信道架构(microchannelarchitecture,简称为mca)总线、外围组件互连(peripheralcomponentinterconnect,简称为pci)总线、pci-express(pci-x)总线、串行高级技术附件(serialadvancedtechnologyattachment,简称为sata)总线、视频电子标准协会局部(videoelectronicsstandardsassociationlocalbus,简称为vlb)总线或其他合适的总线或者两个或更多个以上这些的组合。在合适的情况下,总线80可包括一个或多个总线。尽管本申请实施例描述和示出了特定的总线,但本申请考虑任何合适的总线或互连。另外,结合上述实施例中的隔离游戏逻辑的方法,本申请实施例可提供一种计算机可读存储介质来实现。该计算机可读存储介质上存储有计算机程序指令;该计算机程序指令被处理器执行时实现上述实施例中的任意一种隔离游戏逻辑的方法。以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。当前第1页1 2 3 
    技术特征:

    1.一种隔离游戏逻辑的方法,应用于服务器,其特征在于,所述方法包括:

    预创建对象池,所述对象池包含预设数目的空闲的对象,每个所述空闲的对象包含玩家唯一标识和模板类数组,所述模板类数组支持预设数目的游戏逻辑;

    预创建预设数目的线程,所述预设数目的线程带有编号;

    当玩家上线时,从所述空闲的对象中选用对象,用该玩家的玩家id对选用的对象的所述玩家唯一标识进行赋值,并将所述玩家id映射到相应编号的线程;

    当接收到进入游戏逻辑的请求时,通过与所述玩家id对应的线程从所述对象池中获取与所述玩家id对应的对象,并从该对象的所述模板类数组中查找与所述请求对应的游戏逻辑;

    执行查找的游戏逻辑。

    2.根据权利要求1所述的隔离游戏逻辑的方法,其特征在于,所述对象的数目根据所述服务器承载的最大值进行配置。

    3.根据权利要求1所述的隔离游戏逻辑的方法,其特征在于,所述预设数目的空闲的对象位于一个数组中。

    4.根据权利要求1所述的隔离游戏逻辑的方法,其特征在于,每个所述游戏逻辑中设有出错捕获机制,用于决定是否强制踢玩家下线。

    5.根据权利要求4所述的隔离游戏逻辑的方法,其特征在于,所述出错捕获机制通过c语言的try、python语言的try-catch或lua语言的xpcall来实现。

    6.根据权利要求4所述的隔离游戏逻辑的方法,其特征在于,所述出错捕获机制包括:

    若出现以下逻辑不合法的情况:在进行内存的读写时读或写到了错误的内存,或者数组下标越界,或者除数为0,则强制踢玩家下线。

    7.根据权利要求1所述的隔离游戏逻辑的方法,其特征在于,所述方法还包括:

    当玩家下线后,释放选用的对象,使该对象恢复空闲状态。

    8.一种隔离游戏逻辑的装置,其特征在于,包括:

    对象池创建模块,用于预创建对象池,所述对象池包含预设数目的空闲的对象,每个所述空闲的对象包含玩家唯一标识和模板类数组,所述模板类数组支持预设数目的游戏逻辑;

    线程创建模块,用于预创建预设数目的线程,所述预设数目的线程带有编号;

    映射模块,用于当玩家上线时,从所述空闲的对象中选用对象,用该玩家的玩家id对选用的对象的所述玩家唯一标识进行赋值,并将所述玩家id映射到相应编号的线程;

    查找模块,用于当接收到进入游戏逻辑的请求时,通过与所述玩家id对应的线程从所述对象池中获取与所述玩家id对应的对象,并从该对象的所述模板类数组中查找与所述请求对应的游戏逻辑;

    执行模块,用于执行查找的游戏逻辑。

    9.一种电子设备,包括处理器和存储有计算机程序的存储介质,其特征在于,所述计算机程序被所述处理器执行时实现如权利要求1至7中任一项所述的隔离游戏逻辑的方法。

    10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7中任一项所述的隔离游戏逻辑的方法。

    技术总结
    本申请涉及隔离游戏逻辑的方法、装置、电子设备和存储介质,属于游戏开发领域,该方法包括:预创建对象池,该对象池包含预设数目的空闲的对象,每个空闲的对象包含玩家唯一标识和模板类数组;预创建预设数目的线程,线程带有编号;当玩家上线时,从空闲的对象中选用对象,用该玩家的玩家ID对选用的对象的玩家唯一标识进行赋值,并将玩家ID映射到相应编号的线程;当接收到进入游戏逻辑的请求时,通过与玩家ID对应的线程获取与玩家ID对应的对象,并从该对象的模板类数组中查找与请求对应的游戏逻辑;执行查找的游戏逻辑。实现了玩家间隔离、玩法间隔离和线程间隔离,有效解决了如何避免因触发BUG引起其他玩家的数据异常或者崩溃的问题。

    技术研发人员:周天涯
    受保护的技术使用者:杭州电魂网络科技股份有限公司
    技术研发日:2020.11.24
    技术公布日:2021.03.12

    转载请注明原文地址:https://wp.8miu.com/read-15417.html

    最新回复(0)