很早以前我就注意到了这个bug,最开始是几个月前出现的一个情况,工作室的服务器只有一个玩家在线但是实体数量多达900,而用/say @e发现这些实体的各类的占比全部都是正常的,而我又没在已加载的区块发现任何这个玩家养的我没发现的实体
然后执行指令/execute @e ~ ~ ~ tp Amouseeeeeeeeee @s(那个版本还没有新版execute),结果我被传送到了其他玩家的基地附近,而这个基地离刚才我所在的基地非常远
可以看出来,有些位于模拟距离之外的实体也被加载了。
当时因为不知道这个问题怎么分析,也就不了了之了。但是后来我们换主机,服务器内存由16g减少至10g,加上服务器人数增多,我们发现了另一个问题:当时服务器经常发生似乎是内存泄漏的现象:无论服务器中有多少人,服务端占用内存在正常的增加之外,还有一个非常平稳且持续的增加趋势:内存每秒增加1-2M,且没有任何办法阻止,即使服务器里没有任何一个人。当服务端占满整机内存时,服务器就会卡,最后因为LLSE内存不足导致崩服。当时服务器可以通过频繁地定时重启解决。
偶然地一次我在手动重启服务器的时候,我发现之前位于应加载的区块外实体被加载的现象再次出现了,当时服务器里只有两个人,但是实体数量达到了1400,即使我已经指令清除所有掉落物了。之后经过了一段时间的观察,我发现这两个现象经常同时发生,但是由于我不能复现那个应加载的区块外实体被加载的bug,这件事当时就进行不下去了。
最近忙完了服务器的其他问题,关于这个问题我应用了一个可能的解决方案:我写了一个插件,通过执行一个指令,插件可以判断所有实体到服务器里所有玩家的水平距离,如果所有距离均大于模拟距离+误差,那么证明实体没有应加载的区块内,但仍然被加载了。插件做成之后,果然我发现了异常:在玩家进入服务器之后,他在进服瞬间加载的那些实体都不会随着他离开那片区域而被正常卸载。而如果这个玩家退出服务器,这些区块又会在那一瞬间被正常卸载。
而一旦有玩家在服务器里,服务器就会发生那个内存增长的情况,如果所有玩家都退出了服务器,这个增长会立刻停止。而且所有LLSE生成的假人都不会参与这个现象。
目前得出的结论是,玩家加入服务器的一瞬间,因为他进服而加载的实体就不再会卸载,直到他离开服务器。
然后执行指令/execute @e ~ ~ ~ tp Amouseeeeeeeeee @s(那个版本还没有新版execute),结果我被传送到了其他玩家的基地附近,而这个基地离刚才我所在的基地非常远
可以看出来,有些位于模拟距离之外的实体也被加载了。
当时因为不知道这个问题怎么分析,也就不了了之了。但是后来我们换主机,服务器内存由16g减少至10g,加上服务器人数增多,我们发现了另一个问题:当时服务器经常发生似乎是内存泄漏的现象:无论服务器中有多少人,服务端占用内存在正常的增加之外,还有一个非常平稳且持续的增加趋势:内存每秒增加1-2M,且没有任何办法阻止,即使服务器里没有任何一个人。当服务端占满整机内存时,服务器就会卡,最后因为LLSE内存不足导致崩服。当时服务器可以通过频繁地定时重启解决。
偶然地一次我在手动重启服务器的时候,我发现之前位于应加载的区块外实体被加载的现象再次出现了,当时服务器里只有两个人,但是实体数量达到了1400,即使我已经指令清除所有掉落物了。之后经过了一段时间的观察,我发现这两个现象经常同时发生,但是由于我不能复现那个应加载的区块外实体被加载的bug,这件事当时就进行不下去了。
最近忙完了服务器的其他问题,关于这个问题我应用了一个可能的解决方案:我写了一个插件,通过执行一个指令,插件可以判断所有实体到服务器里所有玩家的水平距离,如果所有距离均大于模拟距离+误差,那么证明实体没有应加载的区块内,但仍然被加载了。插件做成之后,果然我发现了异常:在玩家进入服务器之后,他在进服瞬间加载的那些实体都不会随着他离开那片区域而被正常卸载。而如果这个玩家退出服务器,这些区块又会在那一瞬间被正常卸载。
而一旦有玩家在服务器里,服务器就会发生那个内存增长的情况,如果所有玩家都退出了服务器,这个增长会立刻停止。而且所有LLSE生成的假人都不会参与这个现象。
目前得出的结论是,玩家加入服务器的一瞬间,因为他进服而加载的实体就不再会卸载,直到他离开服务器。