【发布时间】:2010-09-13 15:45:08
【问题描述】:
我正在编写一个在线游戏有两个原因,一个是让自己熟悉实时环境中的服务器/客户端请求(而不是像典型的网络浏览器,它不是实时的),以及真正让我的手湿透在那个区域,所以我可以着手实际设计一个。
任何人,我都是用 C++ 做的,我一直在使用 winsock 来处理我的基本网络测试。我显然想使用帧限制器并在某个时候进行 3D 和所有这些,我的主要问题是当我执行 send() 或 receive() 时,程序会在那里闲置并等待响应。即使是最好的互联网连接,这也可能导致 8 fps。
所以对我来说显而易见的解决方案是将网络代码从主进程中取出并在自己的线程中启动它。理想情况下,我会在我的主进程中调用“发送”,它将向网络线程传递一个指向消息的指针,然后定期(每帧)检查网络线程是否已收到回复,或超时,或什么你。在一个完美的世界中,我实际上会同时运行 2 个或更多网络线程,这样我就可以说运行一个聊天窗口并在后台下载一件盔甲,同时仍然允许玩家一次到处跑。
我的大部分问题是这对我来说是新事物。我了解线程的概念,但我可以看到一些严重的问题,例如如果两个线程尝试同时读取/写入相同的内存地址会发生什么,等等。我知道已经有处理此类事情的方法,因此我正在寻找有关实现此类事情的最佳方法的建议。基本上,我需要线程 A 能够通过发送数据块启动线程 B 中的进程,轮询线程 B 的状态,然后接收回复,也作为数据块,理想情况下不会发生任何重大崩溃。 ^_^ 稍后我会担心这些数据实际包含什么以及如何处理丢弃的数据包等,我只需要先完成这些。
感谢任何帮助/建议。
PS:刚刚想到这一点,可能会使问题更简单。有没有办法使用 Windows 事件处理系统对我有利?比如,是否有可能让线程 A 在某处初始化数据,然后在线程 B 中触发一个事件以让它获取数据,反之亦然,让线程 B 告诉线程 A 它已经完成?这可能会解决我的很多问题,因为我真的不需要两个线程都能够同时处理数据,更多的是接力棒。我只是不知道这是否可能在两个不同的线程之间。 (我知道一个线程可以为事件处理程序创建自己的消息。)
【问题讨论】:
标签: c++ multithreading networking