代码之家  ›  专栏  ›  技术社区  ›  AnkurVj

用于对等通信的线程

  •  1
  • AnkurVj  · 技术社区  · 14 年前

    我有以下游戏架构。

    游戏中有4个玩家(节点)。每个播放器都使用UDP发送和接收数据。每个玩家都可以向其他玩家发送数据。

    如果有来自相应用户的任何输入,则播放器需要发送数据。(例如MOVE-LEFT命令等)。

    我在想以下几点: 创建一个处理图形的线程。 使用UDP再创建2个线程,每个线程1个用于接收和发送数据。

    每当图形线程从用户处获得“myposition”的输入时,它就会更新共享全局变量“myposition”。等待这个变量的networksend线程被激活,并告诉其他所有玩家它的新位置。

    类似地,每当从任何其他播放器“i”接收到“position”更新时,network receive线程都会更新全局变量player[i].position。图形线程现在将使用更新的位置重新绘制场景。

    这个设计正确吗。如果是,这个设计有多好?我该如何改进

    1 回复  |  直到 14 年前
        1
  •  5
  •   Alex Wood    14 年前

    网络游戏编程是一个怪物的话题,所以很难说“是的,这就是你如何设计一个网络架构”。它完全取决于您的游戏要求。你打算发送多少包?是否会在每一帧发送一个数据包,表明播放器a持有左键?这种通信是否仅限于局域网?

    对于像在4个客户机之间同步移动这样简单的事情,将发送、接收和呈现放在不同的线程中似乎有些过分了。也许作为一个起点,您应该从一个更简单的设计开始,当您觉得数据包的输出速度不够快时,就转向多线程。

    while (running):
        readUpdSocketForIncomingPackets();
        updateGameObjects();
        renderGameObjects();
        sendPacketsToPeers();
    

    在每一帧开始时,您可以读取udp套接字以获取传入的数据包和更新位置(以及发送给对等方的任何其他内容),然后绘制。当游戏输入被处理时,数据包被创建并累积在数据包队列中。通过这种方式,您可以执行优化,例如将多个消息塞进/合并到一个数据包中,删除重复的消息(例如,只发送最新的位置更新)等。因此,在每个游戏循环结束时,处理最终的数据包队列并将其发送给对等方。

    不过,这是一个大话题,我已经忽略了很多细节。

    看看gaffer的博客: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/