众所周知Mc的处理只是单线程的。
是因为我们的服务端都是单线程的吗?
官方的正版服务器是否也是单线程?
欢迎大家讨论
是因为我们的服务端都是单线程的吗?
官方的正版服务器是否也是单线程?
欢迎大家讨论
表示没人看得懂


主线程(Tick Loop)是单线程的,如实体的运算、方块的破坏、放置、作物的生长、红石事件、插件的各种Event。聊天和网络的通讯部分是异步多线程的,Spigot的区块加载是异步多线程的,Spigot的一些分支还实现了光照运算、流水运算、区块生成的异步多线程。
为何只能单线程,是因为存在同步性,也就是线程安全。例如你放置方块后破坏这个方块,这是有次序之分的,如果放置和破坏方块是异步多线程的,如果存在延迟。很可能在服务器看来破坏方块在前,放置方块在后。那么结果就是方块放置了,你却捡到了这个方块的掉落物,相当于刷了一个方块。
异步多线程也能保证线程安全,但是难度比单线程大不少,而且性能不一定就比单线程要高。目前Spigot这些服务端都是在官方服务端反编译的基础上打Patch来优化性能和增加功能、API。如果官方服务端没有实现全异步多线程,第三方要实现,是非常非常非常困难的,即便实现了,也很可能非常不稳定或者性能还不如单线程。
为何只能单线程,是因为存在同步性,也就是线程安全。例如你放置方块后破坏这个方块,这是有次序之分的,如果放置和破坏方块是异步多线程的,如果存在延迟。很可能在服务器看来破坏方块在前,放置方块在后。那么结果就是方块放置了,你却捡到了这个方块的掉落物,相当于刷了一个方块。
异步多线程也能保证线程安全,但是难度比单线程大不少,而且性能不一定就比单线程要高。目前Spigot这些服务端都是在官方服务端反编译的基础上打Patch来优化性能和增加功能、API。如果官方服务端没有实现全异步多线程,第三方要实现,是非常非常非常困难的,即便实现了,也很可能非常不稳定或者性能还不如单线程。