当前位置:  开发笔记 > 程序员 > 正文

用于对等通信的线程

如何解决《用于对等通信的线程》经验,为你挑选了1个好方法。

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

我有以下游戏架构.

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

如果来自相应用户的任何输入,则需要由玩家发送数据.(例如MOVE-LEFT命令等).每当玩家(比如说p1)接收到来自任何其他玩家的任何数据(比如p2)(比如屏幕上玩家p2的新位置),玩家p1的屏幕应立即更新.

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

每当图形线程从用户获得"myposition"的输入时,它就会更新共享的全局变量'myposition'.正在等待此变量的网络发送线程被激活,并告诉其他所有玩家新的位置.

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

这个设计是否正确.如果是,这个设计有多好,我怎样才能改进它



1> 小智..:

网络游戏编程是一个主题的怪物,因此很难说"是的,这就是你设计网络架构的方式".它完全取决于您的游戏要求.您计划发送什么样的数据包?每帧会发送一个数据包,表明玩家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/

他有一些很棒的文章可以解决一些网络游戏编程的基础知识.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有