发明内容
针对上述现有技术不足,本发明要解决的技术问题是提供一种满足游戏服务器时间需求,保证游戏服务器时间是单调递增的,避免游戏逻辑错误。
为解决上述技术问题,本发明采用的技术方案为,游戏服务端虚拟时间实现方法,包括如下步骤:
S1:服务器启动时,获取当前现实时间进行缓存,作为虚拟时间的时间值起点;
S2:在程序运行过程中,服务器定期刷新缓存内的时间值,作为当前虚拟时间;
S3:在程序运行过程中,服务器需要获得时间条件执行逻辑的,均通过缓存内的虚拟时间作为时间条件。
这样的方案使服务器的时间不以操作系统为依据,而由游戏服务器本身的缓存时间进行获取,提高性能,并保证时间是单调递增的。
进一步的技术方案为,所述步骤S2中,服务器每间隔一个游戏最小时间单位,刷新一次缓存内的时间值。
这样的方案保证游戏的每一个时间都会作为时间条件而被执行逻辑,不会因为服务器卡而跳过某些时间,导致某些逻辑无法执行,而令运行出现逻辑错误。
再进一步的技术方案为,所述步骤S2中,刷新缓存内时间值的具体步骤为:通过服务器的CPU时钟周期及服务器标准帧率,计算一个游戏最小时间单位内执行逻辑数量的理论标准值;当累计执行的逻辑数量达到理论标准值时,对缓存内的时间值增加一个游戏最小时间单位,并重新累计一次执行的逻辑数量。
这样的方案使虚拟时间不依赖外接时间而增加。
再进一步的技术方案为,所述步骤S2中,还包括把每次累计中执行一个理论标准值数量的逻辑的实际时间与游戏最小时间单位进行对比的步骤,当执行一个理论标准值数量的逻辑的实际时间大于游戏最小时间单位时,增大服务器的实际帧率,直到当执行一个理论标准值数量的逻辑的实际时间等于游戏最小时间单位时,把服务器的实际帧率重新调整为服务器标准帧率。
这样的方案使服务器具有追赶时间的能力,但又不跳过每一个时间。
进一步的技术方案为,还包括步骤S4:当收到关闭服务器命令时,服务器在关闭过程中,保存一次时间记录文件;
所述步骤S1中,还包括在服务器启动时,读取时间记录文件,判断时间合法性的步骤;若合法,则执行步骤S1,正常启动后续步骤;若不合法,则停止执行后续步骤,退出进程。
这样的方案使得服务器在关闭后重启时仍能保证时间的单调递增,避免因服务器启动时就存在时间错误而引发逻辑错误。
再进一步的技术方案为,所述步骤S4中,保存时间记录文件,具体为在时间记录文件中,标记服务器状态为关闭,并记录关闭时的虚拟时间;
所述步骤S1中,判断时间合法性的步骤具体为:当时间记录文件中的服务器状态为关闭时,若当前现实时间或虚拟时间大于关闭时的虚拟时间,则判断为时间合法;否则,判断为时间不合法。
更进一步的技术方案为,还包括步骤S5:在程序运行过程中,每相隔一个指定时间,更新一次时间记录文件,把时间记录文件中的服务器状态标记为运行,并记录当时的虚拟时间;
所述步骤S1,判断时间合法性的步骤还包括:当时间记录文件中的服务器状态为运行时,若当前现实时间或虚拟时间减去记录时的虚拟时间的差值大于指定时间,则判断为时间合法;否则,判断为时间不合法。
这样的方案保证服务器在不正常关闭的情况下,启动时仍能保证时间的单调递增。
优选的技术方案为,所述指定时间为3-6分钟。
本发明的游戏服务端虚拟时间实现方法,对比于传统的时间处理方案,能更有效地保证时间的单调递增性,性能更高效;并能保证在服务器关闭维护后依然能保证时间的单调递增性;且能很容易的加速或者减速服务器的时间运行,方便特殊逻辑的调试,完善服务器对意外情况的处理能力。
具体实施方式
下面通过具体实施例对本发明作进一步的详细描述。
本发明的游戏服务端虚拟时间实现方法,包括如下步骤:
S1:服务器启动时,获取当前现实时间进行缓存,作为虚拟时间的时间值起点;并通过读取时间记录文件以判断时间合法性,当判断为时间合法时,运行进程,当判断为时间不合法时退出进程。
S2:在程序运行过程中,服务器定期刷新缓存内的时间值,作为当前虚拟时间;具体地,服务器每间隔一个游戏最小时间单位,刷新一次缓存内的时间值。游戏最小时间单位由游戏本身的设计而定,例如某游戏以秒为单位作为判断游戏事件的触发条件之一,则该游戏的最小时间单位为1秒,若某游戏的游戏动作以0.1秒为单位作为动作画面的播放条件之一,则该游戏的最小时间单位为0.1秒;游戏的最小时间单位不是由本发明所决定,更不是由本发明的实施者人为规定,而是由采用本发明的技术方案所应用的游戏本身而定;当然,刷新的周期可以是比游戏最小时间单位要小,这样可使时间计算更精确,但对于游戏而言这样提高时间精度反而浪费了服务器的硬件性能。另一方面,刷新的周期不能比游戏最小时间单位要大,如果刷新周期比游戏最小时间单位大,则有可能导致虚拟时间跳过了某些时间点,导致逻辑无法正确触发。
具体地,本实施例中,步骤S2的刷新缓存内时间值的具体步骤为:通过服务器的CPU时钟周期及服务器标准帧率,计算一个游戏最小时间单位内执行逻辑数量的理论标准值;以游戏最小时间单位为1秒为例,若根据服务器的CPU时钟周期和服务器标准帧率可以计算出理论上1秒能执行5个逻辑,即所述理论标准值为5;当累计执行的逻辑数量达到5个时,对缓存内的时间值增加1秒,并重新累计一次执行的逻辑数量。若执行的刷新周期不是游戏最小时间单位,则计算执行逻辑数量的理论标准值以刷新周期为依据,例如上文的例子,若刷新周期为0.1秒,则执行逻辑数量的理论标准值应为1个。根据CPU的时钟周期和服务器的帧率计算理论上1秒内执行多少个逻辑数量,是本领域技术人员的公知常识,在此不再赘述。CPU的时钟周期是由CPU的硬件决定的,服务器的帧率可以设置,所述标准帧率是指正常运行服务器时的预定帧率,而不是实际上服务器运行时的帧率。虚拟时间的增加不依赖于外界时间,这样的方式可以避免因服务器卡而跳过某些时间点,导致逻辑错误。
然而,当服务器卡时,执行5个逻辑所需的实际时间会大于1秒(仍以上文中的例子为例),此时虚拟时间仍然增加1秒,虽然逻辑能正确触发不会被跳过,但会导致虚拟时间一直落后于实际时间。为解决此问题,步骤S2中还包括把每次累计中执行一个理论标准值(5个)数量的逻辑的实际时间与游戏最小时间单位(1秒)进行对比的步骤,当执行5个逻辑的实际时间大于1秒时,以3秒为例,缓存内的虚拟时间的时间值仍然只增加1秒,但增大服务器的实际帧率,使执行5个逻辑的标准时间缩短,例如0.7秒,即后几秒的时间内,每0.7秒实际时间虚拟时间就增加1秒,这样逐步使虚拟时间追赶实际时间,直到当执行一个理论标准值数量的逻辑的实际时间等于游戏最小时间单位时,即虚拟时间追上实际时间时,把服务器的实际帧率重新调整为服务器标准帧率,重新正常运行。如果不是处于追赶状态时,执行5个逻辑的实际少于1秒时,虚拟时间不马上增加,而是等到够1秒时才增加。
S3:在程序运行过程中,服务器需要获得时间条件执行逻辑的,均通过缓存内的虚拟时间作为时间条件。服务器调用时间为条件判断时,不读取外部时间、不读取游戏终端机的操作系统时间,而时读取自身缓存的虚拟时间,既提高性能效率,又保证时间的正确性。
S5:在程序运行过程中,每相隔一个指定时间(本实施例为5分钟,优选地为3-6分钟),更新一次时间记录文件。
S4:当收到关闭服务器命令时,服务器在关闭过程中,保存一次时间记录文件。
具体地,保存时间记录文件包括记录服务器的状态及当时的虚拟时间,其中,在步骤S4中,把服务器状态标记为关闭并记录关闭时的虚拟时间;而在步骤S5中,把服务器状态标记为运行,并记录保存操作当时的虚拟时间。而在步骤S1中,判断服务器启动时时间合法性的步骤为,先判断时间记录文件中的服务器状态,若服务器状态为关闭,则表示上次服务器为正常关闭状态,比较服务器的当前时间与时间记录文件中所记录的时间,若服务器当前时间大于关闭时间,即可保证服务器开启时的时间是递增的,可判断为时间合法;当服务器状态为运行时,表明上一次服务器关闭时为非正常关闭,此时比较服务器的当前时间与时间记录文件中所记录的时间,若当前时间减去所记录的时间的差值大于指定时间,则判断为合法,否则判断为不合法。当差值大于指定时间时,表明服务器关闭的过程中跳过了一次保存操作,可保证服务器时间已是单调增的情况,指定时间优选为3-6分钟,这个时间可以保证服务器重新进入正常运行状态。服务器启动时的当前时间可以是服务器从外界(例如时间服务器、互联网等)获取的现实时间也可以是已经缓存了的虚拟时间,由于服务器的硬件处理速度很快,执行缓存虚拟时间起点及比较时间两项操作的耗时远小于一般游戏的游戏最小时间单位,对于本发明的技术方案而言,此两个操作可以理解为同时进行,而实际实施本发明时,其先后顺序不影响处理效果。保存时间记录文件的操作,是为了保证在服务器关闭维护后,仍能保持时间的单调递增性,而运行过程中保存时间记录文件则更进一步保证即使服务器不正常关闭,仍能保持时间的单调递增性。可取消保存时间记录文件的步骤,对应取消步骤S1中的时间合法性判断步骤,或者采用其他形式保障服务器关闭后重新启动的时间合法性。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。