【问题标题】:Game server turn timer游戏服务器轮到计时器
【发布时间】:2013-05-17 11:07:03
【问题描述】:

我正在制作一个 Java 多人回合制游戏,我想限制每个玩家移动的时间,游戏由游戏会话或房间组成,每个房间有 4 名玩家。 游戏有大约 40 个游戏环节,每个环节至少有 160 个回合。

首先我查看了java.util.Timer,然后我发现ScheduledExecutorService 看起来好多了,我可以为每个游戏会话创建一个SingleThreadScheduledExecutor,每回合创建一个新的可运行对象,如果玩家是在 runnable 执行之前移动我可以调用 ScheduledFuture.cancel() 方法。

理论上看起来不错,但我有些担心,所以我想知道:

  • 这是正确的方法吗?还是有更好的选择?

  • 我可以只为所有游戏会话设置一个ScheduledThreadPool 每个游戏会话一个SingleThreadScheduledExecutor

  • 我注意到取消 ScheduledFuture 会将其保留在 记忆直到他的执行时间,这可能是一个问题 内存使用情况?

  • 最后,是否可以重用相同的可运行文件(每个游戏 1 个 会话)而不是每回合创建一个新会话。

【问题讨论】:

    标签: java sockets timer multiplayer


    【解决方案1】:

    ScheduledExecutorService 是一个很好的起点。请记住正确同步您对游戏状态的访问。

    回收可运行文件通常是合法的,但这可能不是最好的选择。

    除非回合数很大,否则取消任务的开销是不值得的。相反,在您的可运行信息中包含关于正在计时的游戏的哪个回合。当任务执行时,检查游戏状态是否仍然是当前回合,如果回合计数已经开始,则什么也不做。

    这避免了cancel() 完成和任务执行之间的竞争条件,就像在接近截止日期时提交移动时发生的那样。

    【讨论】:

    • 转数约为每小时 30.000。让任务执行并且只检查游戏状态接缝是更简单的解决方案,但是考虑到轮数,您认为取消 ScheduledFuture 会更好吗?
    • 每个对象小于 20 字节。因此,如果截止日期是一小时,那么对于核心功能来说,这只是大约 600k,这不算什么。如果截止日期是一天,那仍然低于 15 兆,这还不足以让人担心。如果截止日期更长,您可能希望将截止日期保存到磁盘,并定期扫描它们并仅安排那些近期的。
    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2022-01-08
    • 2012-12-13
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多