1

我正在使用每客户端线程模型开发游戏。游戏的运行方式是每半秒所有玩家都需要更新。更新都必须在半秒的时间间隔内发生,因此它们都需要同时执行。我的想法是有一个类来跟踪“全局更新”何时需要发生,然后当时间到来时,遍历所有玩家并告诉它更新:

 for(Player p : currentPlayers) {
     p.update();
 }

问题是,由于每个玩家都有自己的线程,我希望玩家能够利用这一事实,因为它已经存在。如果我从不同的类进行更新,那么会有一个线程执行几百个线程可以单独执行的操作。我该如何设计它,以便如果一个线程在 Player 类中调用方法“update()”,一个与调用它的线程不同的线程执行它,或者可能是一种可以实现相同目标的不同方法?

如果您需要任何澄清,请询问!非常感谢!

更新:你们怎么看这个(我不知道如何在帖子中格式化大量代码!):

更新2:刚刚意识到我需要知道所有玩家何时完成更新以重置最后一次......

公共类 PseudoExample 实现 Runnable
{
    // 假设“玩家”中充满了活跃玩家。
    私人玩家 [] 玩家 = 新玩家 [100];
    私有的 long lastUpdate = System.currentTimeMillis();

    公共无效运行()
    {
        而(真)
        {
            if (System.currentTimeMillis() - lastUpdate >= 500)
            {
                对于(玩家 p:玩家)
                {
                    p.update = true;
                }
            }

            尝试
            {
                线程.sleep(10);
            } 捕捉(InterruptedException e)
            {

            }
        }
    }

    私有类 Player 实现 Runnable
    {
        私人布尔更新=假;

        公共无效运行()
        {
            而(真)
            {
                如果(更新)
                {
                    // 在这里更新...
                }

                尝试
                {
                    线程.sleep(10);
                } 捕捉(InterruptedException e)
                {

                }
            }
        }
    }
}
4

1 回答 1

2

我认为处理这个问题的最好方法不是调用 p.update(),而是可以向 p 发送异步消息。这将使用Handler功能。这可能是最干净的方式,尽管我相信消息传递会产生一些(可能是微不足道的)开销。

因此,在您的滴答线程(即调用全局更新的线程)中,您将拥有对每个客户端线程的 Handler 对象的引用。然后,你看起来会像

for (Player p : currentPlayers) {
    p.handler().sendMessage(); // this isn't exactly the syntax
}

在您的 Player 中,您将拥有一个 PlayerHandler 对象,该对象扩展了 Handler 并覆盖了 handleMessage(Message)。

编辑:关于这个问题的评论是好的——不要使用比你需要的更多的线程。它们似乎是“正确”的抽象,但它们引入了大量潜在的棘手问题。如果您的所有计算都需要在滴答之间完成,那么它是否按顺序完成可能并不重要。

于 2012-04-13T00:37:56.220 回答