Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是优化我的网络模型的更有效的方法吗?_Java_Sockets_Networking_Tcp_Udp - Fatal编程技术网

Java 这是优化我的网络模型的更有效的方法吗?

Java 这是优化我的网络模型的更有效的方法吗?,java,sockets,networking,tcp,udp,Java,Sockets,Networking,Tcp,Udp,首先,我将解释我的网络模型: 我的游戏中的网络由远程服务器和客户端上的对象配对组成。为了简短描述,假设服务器世界中有多个字符需要与客户机同步(我只考虑一个以简化事情) 每次在服务器端创建一个角色时,服务器都会实例化一个ServerRpgCharacter-此类包装RpgCharacter并注册观察者等,以监视角色并向角色广播相关的突变。然后,服务器为ServerRpgCharacter请求一个pair对象(即,它请求客户端为此对象实例化一个将与其通信的pair)。该pair可以是任何类,但由Se

首先,我将解释我的网络模型:

我的游戏中的网络由远程服务器和客户端上的对象配对组成。为了简短描述,假设服务器世界中有多个字符需要与客户机同步(我只考虑一个以简化事情)

每次在服务器端创建一个角色时,服务器都会实例化一个ServerRpgCharacter-此类包装RpgCharacter并注册观察者等,以监视角色并向角色广播相关的突变。然后,服务器为ServerRpgCharacter请求一个pair对象(即,它请求客户端为此对象实例化一个将与其通信的pair)。该pair可以是任何类,但由ServerRpgCharacter在远程端发送的任何消息都将由其在客户端的相应pair接收

它更多地涉及到多个客户机,但最终效果很好

无论如何,我一直在想多种方法来优化这个模型。它现在的工作方式是,当一个对象向它的对分派消息时,它会排队进入“快照”中。每当任何配对的实体分派消息时,它都会被抛出到同一个快照中。然后以200ms的间隔压缩和调度快照

问题是我正在使用TCP/IP协议来传输这些快照。我不确定TCP协议到底是如何工作的,但我假设如果快照的数据包被丢弃,整个快照将不得不重新发送

因此,我想知道如果我放弃TCP,而是实现UDP的自定义层覆盖,是否会更为理想。在这种情况下,我没有为所有对发送的所有消息分配一个完整的快照,而是让这些对保持自己的数据包顺序和缓冲。这样,如果对a的数据包被丢弃,对B可以忽略这样一个事实,即如果对a的数据包被丢弃,则对a有一个数据包


我需要考虑的是,压缩这些数据的效率较低,因为传输更少。使用TCP压缩TCP是更有效的,因为您可以使用整个流的上下文压缩。使用UDP无法做到这一点,因为必须单独压缩每个数据包

UDP的好处是您可以丢弃数据包而不重新发送它们,因为您假设稍后的数据包将足够快地更新信息

间隔时间需要缩短,因为用户会注意到200毫秒。50毫秒可能是更好的选择

您可以使用空间查找,而不是普通的侦听器模式。当一个事件发生时,在同一水平面上,在X平方的距离内,可以注意到事物。这将节省你在玩家和怪物移动时维护大量列表的时间