2015年4月—2024年4月,论坛已建立9周年,欢迎加入QQ群讨论:419848937

服务端网络配置

主要是游戏中一些经典任务、游戏资料的科普.
回复
头像
天堂之手
Mr.GL
Mr.GL
帖子: 263
注册时间: 2018-02-24 21:37

服务端网络配置

帖子 天堂之手 » 2018-03-14 15:55

如果你的服务器带宽很足,平时不卡,PvP就卡,或者只有局部地区卡,那么多半是由于网络参数的配置不当。
打开服务端config/mmo.properties文档

代码: 全选

MaxSendPerPass = 12
调整为

代码: 全选

MaxSendPerPass = 24
重启服务端即可大幅改善PvP的卡顿状况。
如果仍然出现明显卡顿,可以继续尝试增长这里的数值。
如果你想知道其中原理,可以继续往下阅读...

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

回复