2013-05-28 11 views
2

我正在C#中开发一个相对较小的射击游戏项目,它必须发送体素块中的地图数据以及玩家移动数据,战斗数据以及未来可能的其他内容。我已经决定在服务器和客户端之间使用protobuf-net来进行数据的序列化/反序列化,但是我不知道我应该如何自己发送数据包。 example given by protobuf-net使用TcpListener.BeginAcceptTcpClient,但警告说该示例绝不是最佳实践。我打算在单台服务器上支持至少30个用户,但当然我宁愿升到64,而不会因为射击游戏太慢而变得太慢,甚至是远程实用。我应该如何设置TCP连接并处理数据包?在基于.NET 4.5的游戏服务器上使用套接字的最佳做法?

+0

@Kelvin ...我投了个票来解决这个问题,因为没有“正确的”答案。我认为对你的关卡最好的人是使用TcpListener的异步方法(例如async/await)来设置监听套接字。这似乎是一个很好的起点:http://bsmadhu.wordpress.com/2012/09/29/simplify-asynchronous-programming-with-c-5-asyncawait/ – spender

回答

3

使用TCP进行实时高性能数据交换似乎有点奇怪(尽管在某些情况下并取决于您的网络技能,您可以为此制定一个案例)。由于可靠性不是核心要求,而是获取实时世界数据,因此使用UDP连接(例如使用Lidgren)尤其是当您处于LAN设置时更有意义。

最后,从游戏的角度来看,TCP和UDP之间的区别是interesting article

+0

我打算将移动和战斗数据移动到然而,UDP,体素数据必须在客户端完全正确地结束。它使封面或不封面有所不同。另外像游戏按钮按下消息也需要这种可靠性。我会看看Lidgreen发送移动数据,但除此之外,我仍然需要一个TCP连接体素和其他的东西,必须最终正确。 –

+0

但是使用UDP,消息可以准确到达;您只需手动检查消息(例如,使用标题来描述包长度)。 Lidgren通过在UDP上提供有序,可靠的消息传递来支持这一手动过程。 主要问题是TCP有各种缓冲机制和其他机制来提供一般的可靠性,如果你有实时需求,这会使生活变得非常困难。 我强烈建议阅读[本文](http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/),它很好地解释了这种差异! – dsfgsho

+0

嗯,足够公平,浏览lidgren-network基本教程,我正确地看到NetIncomingMessage和NetOutgoingMessage显示为流?如果我仍然可以使用protobuf-net来序列化数据,那么我可以很轻松地发送它。 –

相关问题