Android游戏UDP/TCP?

Joe*_*dev 9 android

我看到之前已经问过这个问题,但问题的背景通常是模糊的.我正在寻求构建一个Android多人实时游戏,其中存在需要在所有客户之间共享的全局状态.因此,我倾向于认为UDP可能不够.TCP提供可靠性但具有固有的开销.但是,由于这是我第一次解决这个问题,我正在寻找其他人的经验反馈.

因此,(通常)在Android智能手机上的多人实时游戏的上下文中,与TCP相关的开销是否足够可接受,使得用户体验不受这种不利程度的影响?还值得一提的是TCP连接必须是持久连接.此外,UDP与一些可靠的定制开发机制相结合是一种更好的方法吗?任何输入都会对我有所帮助,我将不胜感激.

非常感谢

T.E*_*.D. 10

最好的答案可能是"试一试".

我认为TCP开销对大多数应用来说并不是那么重要.标头大小大约10个字节,并且必须为每个消息来回发送ack消息.

实时游戏的真正杀手就是延迟.UDP是永远不会发生的.这意味着每条消息都滞后于两个节点之间的传输时间.由于TCP需要ack,因此消息不会被视为"已发送",直到从另一方听到消息为止.

通常,它们之间的问题归结为错误检测.如果某个消息在某种程度上在互联网中丢失了,您会如何处理?如果每条消息都非常重要,那么如果你使用UDP,你最终必须在它上面实现自己的类似TCP的协议.您也可以使用TCP并让网络硬件帮助您.但是,如果旧的消息在几次重试之后(每次都在网络延迟时间)都会出现垃圾,无论如何都会有新的更新,那么TCP对你来说是浪费带宽.

  • TCP ack延迟可以真正杀死你的一个地方就是你有一个短暂的相互依赖的消息来回飞行的"对话".即使在本地子网上,由于nagle算法内置了200ms的ack延迟,因此希望通过单个ack确认多个数据包,因此往往限制为每秒5次交换.除非您可以在两端禁用它,否则不要计划使用TCP超过5次往返/秒. (5认同)

ldx*_*ldx 7

这不是一个真正的Android问题,尽管您选择的协议和其他机制会对设备产生影响(例如电池寿命).

选择什么协议主要取决于您的要求(平均数据包大小,平均每秒数据包,丢失数据包是一个问题,您将一次发送多少数据,抖动是一个问题,等等).我可以给点几点指示.

这是一篇关于Quake3网络实现的非常好的文章:

http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/Quake3Networking

简单但有效,我真的很喜欢它,只能推荐这个.

这里也是关于这个话题的好主题:

http://www.gamedev.net/topic/319003-mmorpg-and-the-ol-udp-vs-tcp/

一些游戏使用UDP(特别是FPS和RTS类型),一些TCP,其中一些是它们的某种组合(例如,UDP用于发送游戏数据,TCP用于聊天和其他东西).任何一个都可以工作.您还应该记住,用户可能希望在2G,3G或WiFi网络上工作,甚至WiFi网络也可能是滞后和容量过大.我建议实现一个快速原型并在各种网络环境中进行测试.

  • 还有一件事:TCP并不是真正意义上的无线网络.对于大多数TCP实现,当数据包丢失时(这在无线网络中非常常见),堆栈通常认为是因为网络路径拥塞,因此将拒绝发送数据包.UDP和另一只手没有这个问题,但没有给你任何数据包传递的保证.权衡:-) (3认同)