# re: 多线程还是单线程? 回复 更多评论
2010-07-06 08:50 by
多进程单线程。
一个游戏逻辑进程,一个SOCKET进程,一个DB进程,对于MMORPG,还有一个NPC进程处理怪物的AI。
# re: 多线程还是单线程? 回复 更多评论
2010-07-06 11:58 by
@tanxw
AI单独到一个进程里,这些逻辑模块之间又涉及到线程同步问题了。
@浩毛
对于只有游戏逻辑和网络IO的进程而言,你说的只开一个线程,似乎也在理。不过由于网络IO这块情况可能比理论上要复杂很多,例如实际使用的网络IO机制(IOCP)、网络层数据的拷贝、封包组建等,似乎保险的做法还是开多个线程来做。何况,逻辑线程可能还会涉及到限帧问题。拿去运营的服务器一般也是多核的。LINUX下线程实现的效率如果真的太那个啥,或者可以考虑多进程的结构(网络模块和逻辑模块位于不同进程)。
# re: 多线程还是单线程? 回复 更多评论
2010-07-06 18:28 by
1,socket
2,db
3,event(这里的event是对网络包的切割或是拼接形成的一个完整事件)
很和谐的三层,在linux一个独立的服务器(功能独立),基本照这个模式可以复制出N个服务器。至于是否拆成独立进程,我是这么考虑的,
1,该模块是否有很独立,单一的功能,如验证
2,该模块的功能对性能要求是否苛刻,比如AI
# re: 多线程还是单线程? 回复 更多评论
2010-07-07 17:14 by
我今天早上想了想 不一定对。
因为有小task 和 大task的区别。
# re: 多线程还是单线程? 回复 更多评论
2010-07-07 17:50 by
一个DB服务器
一个logingate服务器
一个逻辑服务器
其实个人觉得有一个NPC服务器来处理各种模拟事件来维护一个真实的world挺好
# re: 多线程还是单线程? 回复 更多评论
2010-07-08 18:07 by
@Kevin Lynx
游戏服务器要提高负载,都是集群的方式,一般都有N个网关的,不管你用IOCP,EPOLL还是KQUEUE,甚至是SELECT都可以的,而网关的功能很简单的,就是外网和内网之间的信息转发。因此一个线程就够了。
对于游戏服务器组件之间的通讯(IPC)来说,就那么几个连接,SOCKET的上下文切换的消耗是很小的。
另外,IOCP,EPOLL,KQUEUE这种机制,只有在服务器接受了N个客户端,但是服务器只和其中的很少一部分客户端在交互的情况下(很少的客户端在并发接收和发送)才能体现出它们的优点。
而对于游戏服务器来说,你有1000个客户端在线,这些客户端基本都在同时发包,可读可写事件每个FD都差不多同时产生,这种情况下,EPOLL还是SELECT,效率上来看差别不大。因此,对于需要处理大量高并发的长连接请求的服务器来说,多进程的方式要轻松的多。
# re: 多线程还是单线程? 回复 更多评论
2010-07-10 16:32 by
虽然可能需要的计算量是固定的,但是在单核上的多线程和单线程也是不一样的。采用多线程和单线程主要影响你的任务被系统调度的情况。