4

我正在用 Java 创建一个简单的网络游戏,玩家可以在其中使用键盘键移动块。游戏将在本地服务器上运行,并且有一个基本规则:

Each block will move automatically at 1 FPS rate, but the **user can send several move commands** in this 1 second interval, thus updating the block position.

代码几乎完成了,但是在服务器和客户端之间同步事情时遇到了麻烦。这是我需要更好地理解的一些代码/描述:

基础班

class Server{

    ServerSocket server = new ServerSocket(port);

    while (listening) {
        Socket client = server.accept();
        new Thread(new ClientHandler(client)).start();
    }
}

class Game implements Runnable {

    public void run() { 
        while (! gameOver)
            tick();
    }   
}

现在的问题

class ClientHandler implements Runnable
{
    Game game;
    public ClientHandler(Socket client)
    {   
        this.client = client;

        //start game which runs at 1 FPS
        long FPS = 1000L;
        Timer timer = new Timer();
        timer.schedule(new Game(FPS), 0L, FPS);
    }

    public void run()
    {
        /** Game is already running, needs to:
        *
        * 1 - Take any GameInput object from the user and update the game
        * 2 - Send a GameState object to the user 
        * 3 - Client will receive it and render on screen,
        *     (hopefully in a synch state with the server)
        */ 

        while ( ! game.gameOver)
        {
            //ObjectInputStream ois = ...;

            // Line A
            GameInput command = ois.readObject();

            // Line B
            //GameState state = game.update(command);

            //ObjectOutputStream oos = ...;

           // Line C
            oos.writeObject(state);
        }
    }
}

我需要更好地理解的是如何处理Line ALine BLine C。更准确地说:

1 - 以安全的方式更新游戏线程的好方法是什么?

2 - 我如何处理多个命令?可能是队列?

2 - 如何确保客户端和服务器同步?

我是网络编程的新手,所以感谢您的帮助!

4

2 回答 2

2

当您对任何类型的服务器进行编程时,队列绝对是您的朋友。如果我们假设一个基本的客户端-服务器模型,那么游戏服务器的每个循环都应该执行以下操作:

  1. 从命令队列中获取所有命令。
  2. 处理命令。
  3. 向所有连接的客户端发送更新,然后他们会将它们应用到他们自己的执行相同操作的队列中。

同样,客户端也应该有一个来自服务器的命令队列,允许它们更新自己的状态。在合理的延迟下,服务器和客户端应该保持合理的同步。一点点的去同步总是会这样,并且有不同的方法来处理它。(阅读:客户端插值)。

对于游戏的每个循环,游戏基本上应该清空命令队列并根据需要应用它们。

于 2013-08-27T17:48:11.940 回答
0

网络同步的一种可能解决方案:您可以首先使用 NTP 服务器将所有客户端和服务器同步到相同的日期/时间(好像延迟非常不同,或者如果有很多抖动,您无法自己从服务器实现它)。然后通过与必须执行的时间相关联的一秒帧发送数据,客户端等待帧中指示的时间并执行/更新命令。总会有一个延迟,(在局域网上可能<到几毫秒)。希望这可以帮助。

于 2013-08-27T18:37:48.927 回答