打开服务端config/mmo.properties文档
将
代码: 全选
MaxSendPerPass = 12
代码: 全选
MaxSendPerPass = 24
如果仍然出现明显卡顿,可以继续尝试增长这里的数值。
如果你想知道其中原理,可以继续往下阅读...
L2J 服务端底层使用NIO,用一个主线程轮询队列中所有的客户端,根据客户端的状况来进行读写网络数据的操作
每当询问完全部客户端,主线程会休眠(Sleep)20毫秒(也就是mmo.properties中SleepTime设定的值),增加休眠时间会让出更多的cpu资源,但是会增加网络延迟,反之服务端延迟会变低,但是会占用更多的CPU和网络资源。
除此之外,所有接受/发送的包,都是先暂存在客户端自身的一个队列中。
当你在代码中使用sendPacket这类的方法时,并不是直接把包发送给客户端,而是把包放到准备发送的队列中,当主线程轮询到这个客户端时才会发送,为了保证所有客户有一定的"公平性",避免其中一个过分活跃的客户端一占用过多的资源,每个客户端默认每次只会得到最多12个包的发送,12个发送结束,不管队列中是否依然有剩余包,系统都不会处理,而是要等待到下一次轮询,当PvP时由于客户端的包队列在短时间内远远超过12个,就会导致玩家卡在那不动了。
解决的最简单的办法就是修改上面说到的数值了,让客户端可以在一次轮询中得到更多的数据发送。
当然这不是一个根本解决办法,更好的办法是想办法优化发送包的策略,比如将一些低优先级的包放到队列尾端,或者干脆想办法压缩包。
具体怎么实现,就要考验你自己的水平了。