首先,我将解释我的网络模型:
我的游戏中的网络包括远程服务器和客户端上的对象配对。举一个简短的描述,假设服务器世界中有多个需要与客户端同步的字符(我只考虑一个简化事项)
每次创建服务器端的字符时,服务器都将实例化ServerRpgCharacter - 此类包装RpgCharacter并注册观察者等以监视角色并向角色广播相关的突变。然后,服务器为ServerRpgCharacter请求一个对象对象(也就是说,它请求客户端为该对象实例化一对将与之通信的对。)该对可以是任何类,但远程端的ServerRpgCharacter调度的任何消息都将是在客户端收到各自的一对。
它可以让多个客户端更多地参与其中,但最终会很好地解决这个问题。
无论如何,我一直在考虑多种方法来优化这个模型。它现在的工作方式是当一个对象将一条消息发送到它的一对时,它会排队到一个'快照'。只要任何配对实体调度消息,它就会被抛入同一个快照中。然后压缩快照并以200ms的间隔发送。
问题是我使用TCP / IP协议来传输这些快照。我不确定TCP协议是如何工作的,但我认为如果删除快照的数据包,则必须重新发送整个快照。
因此我想知道如果我放弃TCP而不是实现UDP的自定义层覆盖,而不是为所有对发送的所有消息分派一个完整的快照,那么它会更加优化,我有它以便这些单独的对保持他们自己的数据包排序和缓冲。这样,如果对A的数据包被丢弃,则对B可以忽略如果数据包丢弃则对A有一个的事实。
然后我需要考虑压缩这些数据的效率较低,因为传输的数据较少。
答案 0 :(得分:1)
使用TCP压缩效率更高,因为您可以使用整个流的上下文进行压缩。你不能用UDP做到这一点,因为你必须单独压缩每个数据包。
UDP的好处是您可以丢弃数据包而不重新发送它们,因为您假设稍后的数据包将足够快地更新信息。
间隔需要更短,因为用户可以注意到200毫秒。 50毫秒可能是更好的选择。
而不是普通的侦听器模式,您可以使用空间查找。当事件发生时,对于同一级别的事物和X个方格的距离是显而易见的。这将节省你必须保持很多列表,因为玩家和怪物四处移动。