我正在C#中开发一个相对较小的射击游戏项目,它必须发送体素块中的地图数据以及玩家移动数据,战斗数据以及未来可能的其他内容。我已经决定在服务器和客户端之间使用protobuf-net来进行数据的序列化/反序列化,但是我不知道我应该如何自己发送数据包。 example given by protobuf-net使用TcpListener.BeginAcceptTcpClient,但警告说该示例绝不是最佳实践。我打算在单台服务器上支持至少30个用户,但当然我宁愿升到64,而不会因为射击游戏太慢而变得太慢,甚至是远程实用。我应该如何设置TCP连接并处理数据包?在基于.NET 4.5的游戏服务器上使用套接字的最佳做法?
回答
使用TCP进行实时高性能数据交换似乎有点奇怪(尽管在某些情况下并取决于您的网络技能,您可以为此制定一个案例)。由于可靠性不是核心要求,而是获取实时世界数据,因此使用UDP连接(例如使用Lidgren)尤其是当您处于LAN设置时更有意义。
最后,从游戏的角度来看,TCP和UDP之间的区别是interesting article。
我打算将移动和战斗数据移动到然而,UDP,体素数据必须在客户端完全正确地结束。它使封面或不封面有所不同。另外像游戏按钮按下消息也需要这种可靠性。我会看看Lidgreen发送移动数据,但除此之外,我仍然需要一个TCP连接体素和其他的东西,必须最终正确。 –
但是使用UDP,消息可以准确到达;您只需手动检查消息(例如,使用标题来描述包长度)。 Lidgren通过在UDP上提供有序,可靠的消息传递来支持这一手动过程。 主要问题是TCP有各种缓冲机制和其他机制来提供一般的可靠性,如果你有实时需求,这会使生活变得非常困难。 我强烈建议阅读[本文](http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/),它很好地解释了这种差异! – dsfgsho
嗯,足够公平,浏览lidgren-network基本教程,我正确地看到NetIncomingMessage和NetOutgoingMessage显示为流?如果我仍然可以使用protobuf-net来序列化数据,那么我可以很轻松地发送它。 –
- 1. 做网络游戏服务器升级的最佳做法?
- 2. 最佳做法/上网和互动式移动(Android)游戏的最佳服务
- 3. 基于在线多人游戏的游戏服务器技术?
- 4. REST基于WebAPI的游戏服务器
- 5. Android的MMO游戏的最佳做法?
- 6. Silverlight 2D游戏的最佳做法
- 7. 在线游戏最佳做法
- 8. .NET游戏服务器
- 9. 用于iPhone应用程序的多人游戏服务器,使用设备作为套接字服务器
- 10. Lua是游戏服务器的最佳/最快选择?
- 11. .NET 4.0服务器上的.NET 4.5
- 12. 什么是游戏服务器的最佳云计算平台?
- 13. Python游戏服务器中的TCP套接字
- 14. 为游戏创建一个PHP套接字服务器
- 15. 云上的简单基于套接字的服务器
- 16. 为FPS游戏编写XNA游戏服务器的最佳方式是什么?
- 17. 使用Nodejs和套接字IO的多人游戏游戏
- 18. Java套接字游戏服务器调整
- 19. 使用网络套接字的Javascript最佳做法
- 20. 我最好的方式来做多人游戏服务器?
- 21. 使用ExpressJS的游戏+ Web服务器
- 22. node.js或netty上的游戏服务器
- 23. 将图像存储在服务器上的最佳做法
- 24. 使用html5 socket.io和node.js服务器的游戏的最佳框架?
- 25. 在cocos2d游戏中实现关卡的最佳做法
- 26. 编写基于客户端 - 服务器的游戏的建议
- 27. iOS- Google Play游戏服务的可用性基于回合的多人游戏
- 28. 关于使用套接字API的基于TCP的简单回显服务器
- 29. 在Amazon Linux服务器上使用IPTABLES的最佳做法是什么?
- 30. 在ajax请求上接收服务器异常消息的最佳做法
@Kelvin ...我投了个票来解决这个问题,因为没有“正确的”答案。我认为对你的关卡最好的人是使用TcpListener的异步方法(例如async/await)来设置监听套接字。这似乎是一个很好的起点:http://bsmadhu.wordpress.com/2012/09/29/simplify-asynchronous-programming-with-c-5-asyncawait/ – spender