Infinideastudio / NEWorld

NEWorld is a free game with similar game rules to Minecraft.
116 stars 29 forks source link

线程是不是太多了? #95

Closed Miigon closed 6 years ago

Miigon commented 8 years ago

现在在Mac Os X上运行客户端,线程数居然飙到了11? 而且内部有锁,造成的锁竞争较严重 这样在单核设备上是个噩梦

Miigon commented 8 years ago

线程相关的bug可一点都不好调。。。

harrynull commented 8 years ago

client+server内部线程一共就4个啊,还能怎么减 客户端渲染线程(主线程,launcher线程) 客户端网络线程 服务端网络线程(服务端的主线程) 服务端命令线程

bridgekat commented 8 years ago

11线程里应该有一些是我们管辖范畴之外的,比如Windows上移动窗口就会创建2个线程 但是个人觉得确实应该简化逻辑

DWVoid commented 8 years ago

确实。。。多的时候有二十几个线程。其实确定触发的线程目前不止四个。有主线程(GUI),客户端网络处理,客户端网络监听,服务端网络处理,服务端网络监听,服务端命令处理。以及因为使用了多线程运行库而在常规情况下多出的2-3个线程。按照逻辑来看目前应该至少能够切掉3个

harrynull commented 8 years ago

客户端服务端处理和监听是一个线程,谢谢。其它线程都不是我们能控制的了。这四个也是最小了,没法减少了。

DWVoid commented 8 years ago

@abc612008 就是本地模式客户端直接访问服务端的储存,然后不启动commandmanager,就这样砍掉3个

harrynull commented 8 years ago

这样简单不了,因为多人模式还是那么多线程

Miigon commented 8 years ago

所以归类起来就是: 1.服务端命令线程只在单独运行服务端时启动 2.服务端网络线程在单人模式下不运行 3.客户端网络线程在单人模式下不运行 @abc612008 多人模式还是那么多,的确,但是多人模式一般不会启动在同一台机器上,即使会,不在同一进程内问题不大。

Miigon commented 8 years ago

其实关于io部分的线程和锁问题,有一个解决方案,就是不用raknet,改用libuv+其他可靠udp库(或者对raknet进行libuv改造) libuv对io有统一的调度,这就意味着服务端的命令输入(stdin),logger输出(stdout)网络(udp)三者可以使用同一个loop线程,节约了logger上的锁,并且把网络和命令输入两个线程合并成一个,还可以防止logger输出耗时对其他线程的影响(因为“输出”仅仅是把数据移动到了缓冲区,并没有立即调用io)

Miigon commented 8 years ago

提示:SDLTimer有时会创建线程