游戏服务器开发疑问,请赐教

gaoxianfeng 2004-05-14 11:17:13
我想做个游戏服务器
由于每个在线用户间要进行大量的数据交互,所以不适合一个用户一个线程。
如果所有的用户连接都在一个进程里处理,考虑到每个用户数据分析时间可能过长,会影响其他用户,而且用户是在一定条件下可分组的,所以考虑每组用户用一个线程。

只开一个端口接受所有用户连接、数据,然后依据条件把fd分发给每个线程
但出现一个问题 就是如何将accept的新fd传给线程
如果用全局变量,涉及到加锁,依然是主任务阻塞,等子线程处理完自己所有的用户fd后,施放fd区的锁
如果用队列,是不是就意味着每个子线程都要开个队列?

考虑用线程不用进程,一是交互数据时方便,二是,添加其他游戏时方便

请大家帮分析一下,指点一下
我没接触过游戏的设计,考虑的可能很不周到、实际,汗颜


...全文
167 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoxianfeng 2004-06-18
  • 打赏
  • 举报
回复
??????????
散分 都没人UP吗?
:(
gaoxianfeng 2004-06-08
  • 打赏
  • 举报
回复
散分
datuhao 2004-06-08
  • 打赏
  • 举报
回复
既然分组的话,可不可以考虑每个组分配一个队列,每个队列用n条线程去读取,线程池负责所有线程的创建和销毁。。。大概想法
datuhao 2004-06-08
  • 打赏
  • 举报
回复
大型服务器应该考虑线程池了,一定在linux下吗?windows下可以考虑用iocp吧。
tianxiangyuan 2004-05-14
  • 打赏
  • 举报
回复
fd的打开数量方面的限制,Linux启动时会根据系统的资源状况设定,一劳永逸的方法是使用更加高档的电脑!其实,在服务程序运行时,调用ulimit进行调整,可一定程度的缓解这种限制。
gaoxianfeng 2004-05-14
  • 打赏
  • 举报
回复
而且在linux下fd的打开数量也有限制
我试图通过
ulimit改变 但实际上只改变此次登陆环境
下次又变了 还没搞明白怎么让他一直如此
这个东西好像管点用
/proc/sys/fs/file-max但它是系统的最大可打开数

郁闷
gaoxianfeng 2004-05-14
  • 打赏
  • 举报
回复
是啊。 :(
这是个问题

不过我限制了一个fd集只有500用户
tianxiangyuan 2004-05-14
  • 打赏
  • 举报
回复
sorry,应该是1024
tianxiangyuan 2004-05-14
  • 打赏
  • 举报
回复
如果我记得没错,select最多只能处理32个fd,这样的限制,你的游戏服务器能忍受吗?
gaoxianfeng 2004-05-14
  • 打赏
  • 举报
回复
谢谢楼上的指点

我的理解如下
在游戏策略未定时,是游戏重要
但在游戏策略已定 开始实现游戏的时候 还是各基础模块的实现占主导


我知道是个普通的网络编程,但问题就出在这里,所以想请教各位先行者。
ace是个好东西 但要在短时期熟练使用 估计在我还有一定难度 :(因为我没有用c++开发过大项目)另外整个框架都搭好了 就是在新接入连接时候怎么将fd传给线程出现了分歧
线程是创建好的,没有连接的时候就阻塞,有连接了就接收、处理、响应因为想用select,
这时就牵扯到fd集的问题,比如现在线程A有n个fd 记为a_fds,线程每操作一次set fd一次,然后select。
如果主任务监听到新的连接,以什么方式把新的fd加入到a_fds中?
我上面原帖中的方法我认为都不够方便
希望高手能给个建议
tianxiangyuan 2004-05-14
  • 打赏
  • 举报
回复
游戏服务器开发的头等大事不是服务器,而是游戏。

其实,这就是一个普通的多客户端网络编程问题。既然使用线程,则fd应该可以很方便的共享,作为线程函数的参数传递也可。在其他板块讨论过这类的问题,如果不想自己设计复杂的线程模型,也可以使用第三方提供的函数库,如ACE等。搜索一下以前的帖子吧。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧