游戏开发论坛

 找回密码
 立即注册
搜索
查看: 18374|回复: 46

游戏服务端编程--场景服务器探讨

[复制链接]

1

主题

5

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2013-8-12 21:31:02 | 显示全部楼层 |阅读模式
一般来说游戏服务端都有 场景服务器吧,不谈网页服务器
以WOW为例子
在同一个场景服务器中,假设有100个人在一起打架。
WOW属于即时战斗的动作类游戏,那么1个人做的任何动作都会通知到 其他99人
那100个人打架的时候,就有大量的战斗逻辑,角色需要移动 释放技能 刷新属性等广播和其他事件
相信这个计算量应该是很大的
我猜测整个过程应该是单线程处理的吧,不然逻辑会好复杂
如果是单线程的话,那么对于一个单路四核机架式服务器来说 很容易就会吃满一个CPU,其他3核没使用,那么显然是不科学的
100人吃不满,200也应该顶爆了

实际在玩的时候 一张地图上打群架或者有游戏事件的时候 显然人不止200人,但是也没感觉服务器卡
那么我猜测的 单线程处理应该是错误的 ,不知道有没高人指点迷津

1

主题

23

帖子

111

积分

注册会员

Rank: 2

积分
111
发表于 2014-11-4 21:47:37 | 显示全部楼层
这要贴代码你看的完么
楼上这意思不够详细么?汗。。。
帮你细化下。
比如我们的moba项目,5v5即时对战。
1.客户端坦克发送个开火命令
2.服务端通过来源客户id和对应战斗频道,丢入世界主循环队列。(世界渲染线程)
3。世界循环队列每贞运行,将对应的数据包分配到渲染对象玩家拥有的坦克。
4。当渲染树执行到坦克队并指定到该坦克,执行该条开火命令。(我们这里是创建一颗子弹,并加入场景子弹渲染列表)
5。对象侦测修改器,检测到场景增加了一颗子弹,把当前数据格式化,丢入广播用户发送数据队列。
6。网络io线程发现列表中有待发送数据,发送给对应的客户端。
7。客户端收到信息,创建一颗子弹。

点评

另外你今年多大年纪?开始做服务器端程序几年时间?  发表于 2014-11-4 23:27
2到底是发生在客户端还是服务器端?  发表于 2014-11-4 23:24

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20505
发表于 2013-8-12 23:20:38 | 显示全部楼层
可能,这2-300人同屏的战斗,它的CPU运算量可能并不高。

1

主题

5

帖子

30

积分

注册会员

Rank: 2

积分
30
 楼主| 发表于 2013-8-13 09:50:21 | 显示全部楼层
sea_bug 发表于 2013-8-12 23:20
可能,这2-300人同屏的战斗,它的CPU运算量可能并不高。

大哥的意见也是用单线程处理的?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20505
发表于 2013-8-13 10:46:43 | 显示全部楼层
sleeptiger 发表于 2013-8-13 09:50
大哥的意见也是用单线程处理的?

单线程,没必要增加这个复杂度。

优化好逻辑算法,几百个人的逻辑处理,也就是秒秒钟的事。

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2013-8-13 10:48:27 | 显示全部楼层
网络广播的压力和计算的压力不一定会在一个服务器上。
再说了,就算在一个服务器上,战斗和网络io可以分处不同线程上的。

4

主题

19

帖子

73

积分

注册会员

Rank: 2

积分
73
QQ
发表于 2013-8-13 11:17:53 | 显示全部楼层
逻辑部分一般没什么压力,这个情况下压力主要集中在网络层,一般网络层的收和发都是多线程的,主要是IO的压力。如果你的服务器设计了分担压力的GATE SERVER, 在进行一些算法优化,消息优先级的处理,基本是没什么问题的。

1

主题

5

帖子

30

积分

注册会员

Rank: 2

积分
30
 楼主| 发表于 2013-8-13 13:03:12 | 显示全部楼层
sea_bug 发表于 2013-8-13 10:46
单线程,没必要增加这个复杂度。

优化好逻辑算法,几百个人的逻辑处理,也就是秒秒钟的事。 ...

秒秒钟的事情 对于服务端来说应该是很慢了,如果200人的逻辑能控制在100毫秒内 应该算比较理想把

1

主题

5

帖子

30

积分

注册会员

Rank: 2

积分
30
 楼主| 发表于 2013-8-13 13:07:52 | 显示全部楼层
yahle 发表于 2013-8-13 10:48
网络广播的压力和计算的压力不一定会在一个服务器上。
再说了,就算在一个服务器上,战斗和网络io可以分处 ...

意思是可以对功能分类开线程

1.聊天服务器
2.拍卖行服务器
3.战斗服务器
4.网络IO
等等 来分散压力

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2013-8-13 13:19:00 | 显示全部楼层
是的,不过你要注意好这些线程对数据访问的一致性问题。

2

主题

8

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2013-9-18 18:02:16 | 显示全部楼层
本帖最后由 dahu 于 2013-9-18 18:06 编辑

对于场景服务器,肯定是先将场景分割成大小合适的逻辑块,玩家的行为只会广播当前块与周围8个块中的玩家,而且视线范围内的玩家数量肯定是有限制的,何况200个玩家也叫鸭梨?
场景服务器并不直接将消息发送给玩家,而是将消息发送一条给网关服务器,让网关服务器转发给200个玩家。一次技能的释放与处理50毫秒已经需要考虑代码是否写的有问题了。在PK时觉得卡,更多的应该是客户端接收到太多的玩家行为,需要不停重画界面导致的。
至于单线程与多线程的问题,场景服务肯定是运行在线程池中,每个请求过来,都会启动一个线程去处理此请求。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-15 02:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表