请教网游服务器的效率问题

hxzb7215191 2006-05-17 10:07:41
我是第一次做服务器,效率老是很慢.反正就一个字'差';特来请求
大家,看有没有好的办法.
做了二个层次。学着csdn里的一篇文章做的,使用了一个RunGate,
一个GameServer.还有一个分配连接地址的服务器。来了客户端先去
连接分配地址的找到一个RunGate。RunGate与GameServer连接,RunGate
会将接收到的客户端的数据包加上一个标志,与数据包头之后发到
GameServer。

我测试的时候连接上1000个用户到RunGate,每个socket都是Sleep(300)之后
发送数据包。这时可以看到RunGate接收的数据已经完成。但是GameServer还
是在处理数据。要等到一段时间之后才能处理完.

框架是这样做的完成端口,在GameServer那里,先投递一个数据包头,得到一个
数据包头之后,就可以得到数据包体的长度,然后又去投递一个数据包体.完成
了读数据包体之后,把这个数据复制出来,放到我的一个队列中.然后用一个线
程池开始处理.之后又开始投递读数据包头.周而复始的做.

可以看得出来这个完成端口读数据的老是一个线程在做.感觉这样是不是对的.
我试过把处理数据包的函数也写在完成一个数据体完成之后调用的函数里.可能
还是太慢了.

可能是我对完成端口没有理解,不知道大家对于完成端口是如何来做的,如果提高
效率的.
...全文
264 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxzb7215191 2006-05-18
  • 打赏
  • 举报
回复
请这位大虾,能说得细一点吗?
Eddie005 2006-05-18
  • 打赏
  • 举报
回复
顶~
hxzb7215191 2006-05-18
  • 打赏
  • 举报
回复
我现在是使用的ACE的Proactor做的框架.
因为怕这个io_count,异步io操作数在多线程的时候会有问题.
为所有的投递与完成事件中对io_count加锁,当完成事件调用
的如果我当前完成了,把io数减一,然后我去投递接收.让io数
加1,这时完成事件马上会被第二个线程调用.第二个线程完成
之后将io_count减一,第一个线程这时才去检查io_count是否
为0,这个时候肯定是为0的,因为第二个线程还没有做下一次的
投递的.这样就退出了.
后来我就是这样加的锁,把完成读的全部都加上一把锁,就让这
个接收是一个单线程在做.我测试了一下速度还是比较的快.

问题也来了,那个投递写的,写完成的这两个函数我没有把它与
io_count关联.也没有加上锁.由他去发送,以及完成.

接收完成之后,使用了ACE_Task的线程池类来做的.就是说new一个
消息出来putq到这个任务对象中,他就会自动的选择线程池中的
一个空闲的线程,去到任务的消息队列中得到一个结点.来处理.

当我连接了2500个用户,以300毫秒的间隔时间发数据上去.当我不做下
发处理的时候,接收还是很快.就是说,我如果开一段时间发数据的程序.
然后关闭,服务器可以在几秒内完成对所有的数据包的接收工作.

如果这个数据包要广播给所有的人.这样做的话.发送的数据包的量就是
n*(n-1)个出去.这时,当我关闭虚拟的client之后,需要很长的时间才能
处理完成.

也就是说,使用ACE_Task这个东西有一些问题.不知道有没有谁使用过这个ACE
来做过网络游戏的服务器.或是说,有一些什么好的办法可以教我一下.
DentistryDoctor 2006-05-18
  • 打赏
  • 举报
回复
可以从以下几方面来考虑优先IOCP的性能:
1.发送缓冲区
2.使用AcceptEx来代替Accept
3.不应该使用ReadFile/WriteFile来操作IOCP,应该使用WSASend/WSARecv

其它的嘛,得看你是具体怎么实现的了。
拿节 2006-05-18
  • 打赏
  • 举报
回复
关注!
DentistryDoctor 2006-05-17
  • 打赏
  • 举报
回复
得视具体问题而定。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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