gpt4 book ai didi

multithreading - 对等通信线程

转载 作者:行者123 更新时间:2023-12-03 13:16:24 24 4
gpt4 key购买 nike

我正在尝试制作多人网络游戏。每个玩家在屏幕上均以矩形表示。我将OpenGL用于图形,并且用户输入(如MOVE-LEFT,MOVE-RIGHT等命令)也将由它处理(或GLUT或求和)。

我有以下游戏架构。

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

如果相应用户有任何输入,则要求玩家发送数据。 (例如,MOVE-LEFT命令等)。
每当播放器(例如p1)从任何其他播放器(例如p2)接收到任何数据(例如播放器p2在屏幕上的新位置)时,播放器p1的屏幕都应立即更新。

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

每当图形线程从用户那里获取“myposition”的输入时,它都会更新共享的全局变量“myposition”。等待该变量的网络发送线程被激活,并告知其他所有玩家其新位置。

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

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

最佳答案

网络游戏编程是一个主题的庞然大物,因此很难说“是的,这就是您设计网络体系结构的方式”。这完全取决于您的游戏要求。您打算发送哪种类型的数据包?每帧都会发送一个数据包,指示玩家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/

他有一些不错的文章,涉及网络游戏编程的一些基本知识。

关于multithreading - 对等通信线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3757902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com