分享: 陈杰谈网游服务器的后端技术

102 views
Skip to first unread message

benegg

unread,
Apr 22, 2009, 10:51:43 PM4/22/09
to 高性能网络编程邮件列表
西山居的陈杰的幻灯片, 讲了网游服务端寻路, 当然也包括网游服务器的架构. 有不少有用的概念.

http://docs.google.com/Present?docid=dds5zgx6_429v8d9crgc

另一个人总结了一些有用的东西:

1. 将独立的模块封装成单独的进程。
2. 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另
外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。

http://timyang.net/architecture/game-backend/

强烈推荐想要开发网游的朋友都好好看这两篇文章!
------
转自: http://www.benegg.com/?p=23

Kouga

unread,
Apr 22, 2009, 11:06:43 PM4/22/09
to dev4s...@googlegroups.com
好東東~收下了~其實這些事情我們也會考慮,但是不是那麼完整就是了……

2009/4/23 benegg <ide...@163.com>



--
签名是什么东西??

Kouga

unread,
Apr 22, 2009, 11:07:05 PM4/22/09
to dev4s...@googlegroups.com
另外一個就是,將尋路算法分佈到用戶端,讓客戶幫忙計算。

2009/4/23 Kouga <ncw...@gmail.com>



--
签名是什么东西??

benegg

unread,
Apr 22, 2009, 11:16:12 PM4/22/09
to 高性能网络编程邮件列表
这种方法几乎不会被使用, 因为客户端是不可靠的, 很容易作弊.

On Apr 23, 11:07 am, Kouga <ncwh...@gmail.com> wrote:
> 另外一個就是,將尋路算法分佈到用戶端,讓客戶幫忙計算。
>

> 2009/4/23 Kouga <ncwh...@gmail.com>

Kouga

unread,
Apr 22, 2009, 11:26:07 PM4/22/09
to dev4s...@googlegroups.com
哈~就算是不可靠的计算节点,在节点数众多的时候,就可以通过一部分节点来“验算”消除误差——也就是,你想要作弊的话,你得找到一大群和你一起作弊的计算机才行——当然这中间不包括已有的服务器。

还有就是,计算任务肯定不是让客户计算自己的数值,多半情况是交叉演算。这样就算想作弊,也得至少将整个GRID破坏10%以上才可能修改到一个节点的数据……

2009/4/23 benegg <ide...@163.com>

这种方法几乎不会被使用, 因为客户端是不可靠的, 很容易作弊.

On Apr 23, 11:07 am, Kouga <ncwh...@gmail.com> wrote:
> 另外一個就是,將尋路算法分佈到用戶端,讓客戶幫忙計算。
>

--
签名是什么东西??

Allen Jiang

unread,
Apr 22, 2009, 11:29:21 PM4/22/09
to dev4s...@googlegroups.com
但听说魔兽世界一些逻辑运算和验证时在客户端实现的,加密做的很好!

qiaojie

unread,
Apr 22, 2009, 11:37:03 PM4/22/09
to dev4s...@googlegroups.com
这个寻路系统的设计方案真是巨傻啊
只能支持单台寻路服务器,没什么伸缩性,用什么多进程共享内存方式,这个跟多线程没任何本质差别,还需要用调度程序来同步共享内存的访问,好愚昧啊。
其实在他的方案基础上稍做修改就能支持分布式的寻路系统了,我不知道是他故意不拿出来误导听众,还是脑子进水了才设计出一个这么傻的方案。




2009/4/23 benegg <ide...@163.com>

ShiningRay

unread,
Apr 22, 2009, 11:41:23 PM4/22/09
to dev4s...@googlegroups.com
好像是cn erlounge iii上的演讲(反正那次肯定有个分布式寻路的演讲,也是西山居的)
用的是erlang

2009/4/23 qiaojie <qia...@gmail.com>



--
[]\ [] ShiningRay
[]\\[]
[] \[] http://shiningray.cn

ShiningRay

unread,
Apr 22, 2009, 11:41:57 PM4/22/09
to dev4s...@googlegroups.com
http://ecug.org/lecturer/

2009/4/23 ShiningRay <shiningra...@gmail.com>



--
[]\ [] ShiningRay
[]\\[]
[] \[] http://shiningray.cn

sunway

unread,
Apr 23, 2009, 12:35:57 AM4/23/09
to 高性能网络编程邮件列表
作者想用erlang实现,向分布式集群上靠。

> > 转自:http://www.benegg.com/?p=23- 隐藏被引用文字 -
>
> - 显示引用的文字 -

jacky zhao

unread,
Apr 23, 2009, 12:45:08 AM4/23/09
to dev4s...@googlegroups.com
巨傻啊、好愚昧啊、脑子进水了啊。

讨论问题,最好不要带这种 “人身攻击” 型的话。

2009/4/23 qiaojie <qia...@gmail.com>

qiaojie

unread,
Apr 23, 2009, 1:02:23 AM4/23/09
to dev4s...@googlegroups.com
好吧,其实我只是想说这个设计不好,对事不对人。
你一定要往人上面理解,那可以自动忽略我说的话。



2009/4/23 jacky zhao <jacky...@gmail.com>

Kouga

unread,
Apr 23, 2009, 1:12:55 AM4/23/09
to dev4s...@googlegroups.com
果然,在傻瓜眼中什么都是傻的。(我也没有点名啊~自己对号入座概不负责。)

这组PPT讲述的就是一个系统设计的演变过程,主要讲述的思路的演进,如果非要硬搬过来用的——呃,这种“使用”方式合法性先不说,创造性就真的可以说是一点都没有,结果与楼主共享的意图直接大相径庭了。

我们欢迎提出更好的方案,哪怕只是设想而已,对这种动辄冷嘲热讽的态度不敢苟同,也请各位发言前三思。

2009/4/23 qiaojie <qia...@gmail.com>



--
签名是什么东西??

Allen Jiang

unread,
Apr 23, 2009, 1:15:24 AM4/23/09
to dev4s...@googlegroups.com
不瞒你说,凡是地球人都会朝这方向理解,可能这是你平时的说话习惯,言者无心,听着有意,但这种说话方式实在“设计”的不好。

qiaojie

unread,
Apr 23, 2009, 1:26:15 AM4/23/09
to dev4s...@googlegroups.com
冷嘲热讽又如何?就算微软这样的大公司,拿出vista这样的烂产品,照样也被大家骂的狗血淋头。就算是大师犯错误,也照样得接受大家的批评。
你只不过没理解这个设计的坏处,等你哪天理解了,一样会对它不屑一顾。


2009/4/23 Kouga <ncw...@gmail.com>

wing

unread,
Apr 23, 2009, 1:26:21 AM4/23/09
to dev4s...@googlegroups.com
确实如此,程序员很多都有这个毛病,我也经常这么乱说话,得罪很多人,我觉得这就是糟糕的"UI",也许本来你的建议非常有建设性,但是因为你说的太直接,对方产生了反感,再好的建议也很难被顺利接受了。

不过大家都是程序员,都包容理解一些,比如我觉得自己就是个sb,所以别人要说我非常sb时候,就没那么生气,不回应直接忽略过去,大家继续讨论这个服务器设计的如何,我很感兴趣,但是对寻路这些东西不太懂,更兴趣的是整个架构可以借鉴的部分。

qiaojie能不能具体说说这个方案可以优化或者你设为设计不良的部分,很有兴趣听听。

2009/4/23 Allen Jiang <jianggui...@gmail.com>:

--
wing
wing9...@gmail.com
Hope is a good thing, maybe the best of things.

ShiningRay

unread,
Apr 23, 2009, 1:33:01 AM4/23/09
to dev4s...@googlegroups.com
他这招叫“嘲讽”,使围观群众有N%几率强制回帖

2009/4/23 wing <wing9...@gmail.com>



--
[]\ [] ShiningRay
[]\\[]
[] \[] http://shiningray.cn

wing

unread,
Apr 23, 2009, 1:40:14 AM4/23/09
to dev4s...@googlegroups.com
不要再纠缠这个了,我不觉得qiaojie同学是这样的人,如果再纠缠下去,这个贴就可以直接送回收站了,其实一个巴掌拍不响的,"UI"问题归"UI"。

我不玩游戏,所以对寻路不懂,不敢多说,但是这个多进程共享内存,调度进程的设计,确实没看懂,不知道是不是因为游戏业务的需要?

能不能多解释一下,确实不太理解这种设计的好处。

2009/4/23 ShiningRay <shiningra...@gmail.com>:

qiaojie

unread,
Apr 23, 2009, 1:42:52 AM4/23/09
to dev4s...@googlegroups.com
改进很简单,用单个PathFindingManager进程来接受逻辑服务器的寻路请求再转发给各个PathFindingWorker进程来处理,而PathFindingManager可以缓存PathFindingWorker发回的结果。改进以后,各个PathFindingWorker进程就是独立的工作进程,不再需要任何同步操作,另外也不需要用共享内存,要多核处理的话可以开多个线程,这样就可以把PathFindingWorker部署到多个物理服务器上了。寻路结果的缓存放到PathFindingManager上完成,PathFindingManager本身计算负载很小,所以用单进程单线程就可以完成,不存在同步和锁的问题。PathFindingManager本身还可以承担PathFindingWorker的管理和负载均衡。






2009/4/23 wing <wing9...@gmail.com>

Kouga

unread,
Apr 23, 2009, 1:47:12 AM4/23/09
to dev4s...@googlegroups.com
……结果……绕了一大圈,将人家设计中的分发逻辑部分起了个“PathFindingManager”的名字,就认为是自己的“超级大改进”了……

2009/4/23 qiaojie <qia...@gmail.com>



--
签名是什么东西??

qiaojie

unread,
Apr 23, 2009, 2:00:48 AM4/23/09
to dev4s...@googlegroups.com
有人把水管打了个结,导致出水不畅,我做的只是把这个结解开而已。
把结解开当然是很简单了,但是有些人却根本还没意识不到水管打结的问题。




2009/4/23 Kouga <ncw...@gmail.com>

lijie

unread,
Apr 23, 2009, 2:05:00 AM4/23/09
to dev4s...@googlegroups.com
其实qiaojie前面已经说过了。共享内存方式的确是造成这些麻烦的根源,使用共享内存往往一个进程逻辑错误会导致数据被修改(几率很高),体现不出多进程的好处,不过目前业内服务器开发方面使用共享内存很多。这个PathFindingManager进程的作用是路由、负载均衡等,还有一个重点是无状态,有状态的服务器相互联接在更新配置方面麻烦很多,每个服务器都实现干净的动态更新配置其实很麻烦,独立出去也是有很多好处的。

没必要纠结于别人怎么说,习惯不一样,关键是有没有料。个人觉得qiaojie指出了最大的问题,我看到这个地方也有这个疑问。

2009/4/23 Kouga <ncw...@gmail.com>

Kouga

unread,
Apr 23, 2009, 2:28:37 AM4/23/09
to dev4s...@googlegroups.com
其实慢慢来,这组幻灯片还是做得挺不错的。首先我们有一个需求“游戏中AI寻径”,然后根据需求,逐步改进设计,讲述了“缓存”、“独立进程”以及“调度”之间的配合问题。通过逐步求解,将整个方案优化成最后的结果。通过这些思想,不止是寻径服务器,我们的其它应用也可以通过灵活搭配的方式受益,比如IM服务器、道具服务器等等。

2009/4/23 wing <wing9...@gmail.com>



--
签名是什么东西??

Kouga

unread,
Apr 23, 2009, 2:49:53 AM4/23/09
to dev4s...@googlegroups.com
哦~偶真是难以理解原来PPT中这段话是写的什么,或者请各位给个解释?
  • 调度进程会周期性的控制寻路进程向共享Cache中更新数据
其实说明白点,就是让调度进程控制了缓存的锁——换言之,调度进程掌握了最大的缓存,各个子进程用自己的缓存——与qiaojie的设计真不知道有什么不一样的地方,至少我没看出来。


2009/4/23 qiaojie <qia...@gmail.com>



--
签名是什么东西??

peterfl

unread,
Apr 23, 2009, 2:51:18 AM4/23/09
to 高性能网络编程邮件列表
山岭巨人威武!

On Apr 23, 1:33 pm, ShiningRay <shiningray.nirv...@gmail.com> wrote:
> 他这招叫"嘲讽",使围观群众有N%几率强制回帖
>

> 2009/4/23 wing <wing922w...@gmail.com>
>
>
>
>
>
>
>
> > 确实如此,程序员很多都有这个毛病,我也经常这么乱说话,得罪很多人,我觉得这就是糟糕的"UI",也许本来你的建议非常有建设性,但是因为你说的太直接,对方-产生了反感,再好的建议也很难被顺利接受了。
>
> > 不过大家都是程序员,都包容理解一些,比如我觉得自己就是个sb,所以别人要说我非常sb时候,就没那么生气,不回应直接忽略过去,大家继续讨论这个服务器设计-的如何,我很感兴趣,但是对寻路这些东西不太懂,更兴趣的是整个架构可以借鉴的部分。
>
> > qiaojie能不能具体说说这个方案可以优化或者你设为设计不良的部分,很有兴趣听听。
>
> > 2009/4/23 Allen Jiang <jiangguilong2...@gmail.com>:


> > > 不瞒你说,凡是地球人都会朝这方向理解,可能这是你平时的说话习惯,言者无心,听着有意,但这种说话方式实在"设计"的不好。
>
> > > ----- Original Message -----
> > > From: qiaojie
> > > To: dev4s...@googlegroups.com
> > > Sent: Thursday, April 23, 2009 1:02 PM
> > > Subject: Re: 分享: 陈杰谈网游服务器的后端技术
> > > 好吧,其实我只是想说这个设计不好,对事不对人。
> > > 你一定要往人上面理解,那可以自动忽略我说的话。
>

> > > 2009/4/23 jacky zhao <jackyz.z...@gmail.com>


>
> > >> 巨傻啊、好愚昧啊、脑子进水了啊。
>
> > >> 讨论问题,最好不要带这种 "人身攻击" 型的话。
>

> > >> 2009/4/23 qiaojie <qiao...@gmail.com>


>
> > >>> 这个寻路系统的设计方案真是巨傻啊
> > >>> 只能支持单台寻路服务器,没什么伸缩性,用什么多进程共享内存方式,这个跟多线程没任何本质差别,还需要用调度程序来同步共享内存的访问,好愚昧啊。
> > >>> 其实在他的方案基础上稍做修改就能支持分布式的寻路系统了,我不知道是他故意不拿出来误导听众,还是脑子进水了才设计出一个这么傻的方案。
>
> > >>> 2009/4/23 benegg <ide...@163.com>
>
> > >>>> 西山居的陈杰的幻灯片, 讲了网游服务端寻路, 当然也包括网游服务器的架构. 有不少有用的概念.
>
> > >>>>http://docs.google.com/Present?docid=dds5zgx6_429v8d9crgc
>
> > >>>> 另一个人总结了一些有用的东西:
>
> > >>>> 1. 将独立的模块封装成单独的进程。
> > >>>> 2. 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另
> > >>>> 外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。
>
> > >>>>http://timyang.net/architecture/game-backend/
>
> > >>>> 强烈推荐想要开发网游的朋友都好好看这两篇文章!
> > >>>> ------
> > >>>> 转自:http://www.benegg.com/?p=23
>
> > --
> > wing

> > wing922w...@gmail.com


> > Hope is a good thing, maybe the best of things.
>
> --
> []\ [] ShiningRay
> []\\[]

> [] \[]http://shiningray.cn- Hide quoted text -
>
> - Show quoted text -

Kouga

unread,
Apr 23, 2009, 2:57:33 AM4/23/09
to dev4s...@googlegroups.com
有疑问不假,因为该PPT的图例有误导人的趋势。其实仔细想来,根据该设计,第22页的图例中,共享内存(share memory)中的path cache应该在调度进程下边,而不是在上面。至于Nav Mesh,在地图绘制后就是固定数据,只存在读取不存在写入,所以不会有并发冲突。

2009/4/23 lijie <cpu...@gmail.com>



--
签名是什么东西??

bitjoe

unread,
Apr 23, 2009, 4:49:33 AM4/23/09
to dev4s...@googlegroups.com
有没有人觉得vista很好用的啊?

实话说,我觉得,vista,不错。让我对windows 2007又有了期待。

linux桌面太不强劲了,啥时候再以界面为中心设计一个操作系统,可能有希望打败微软。

2009/4/23 qiaojie <qia...@gmail.com>:

Kouga

unread,
Apr 23, 2009, 5:25:07 AM4/23/09
to dev4s...@googlegroups.com
跑題太遠了……(但是偶決定跟著跑一跑~)<-突然發現Gmail有好玩的表情~

Vista很難用很難用,非常難用——這是我的看法。用過Windows2007過後就直接拋棄了Vista~

Linux非常非常絢麗~~真的~而且一些高清播放還不需要特別設置就可以直接播放……

2009/4/23 bitjoe <darve...@gmail.com>



--
签名是什么东西??

Linker

unread,
Apr 23, 2009, 6:15:05 AM4/23/09
to dev4s...@googlegroups.com
非常同意qiaojie 的看法。
这个寻路我是做过的,用的是NavMesh.
多线程领导跟随模式。
很简单就实现了。
上文资料中的方案实在是只学到Erlang的皮(多进程,其实是多协程),没学到骨(消息传递无共享模型)。
实在是南辕北辙,差劲的很!!!

2009/4/23 qiaojie <qia...@gmail.com>



--
Regards,
Linker Lin
linker...@gmail.com

Nil

unread,
Apr 23, 2009, 8:31:25 AM4/23/09
to 高性能网络编程邮件列表
我觉得可能是他们利用cache来加速寻路的办法导致每个寻路服务器本身必须要读写cache,结果导致那个奇怪的结构。寻路的结果往往是一串数据,从
这一块到第二块,第二块再到第三块,在有cache的情况下往往只需要在其中几块上做寻路,其他的直接用cache做结果。这就造成每个寻路服务器要取
一部分cache出来,再算几个块,所以每个服务器自己要cache。
qiaojie的算法是一个比较标准的分布计算,统一cache的想法,存数据表格这样的东西很好用,但是如果一个Manager在持有一大堆
cache数据的情况下还是不能直接得出结果,而必须要一套寻路逻辑来补完的话,像ppt里那种样子的做法还是有点道理的。

PS:看到这个做法我倒是想到,在NavMesh固定的情况下,从一个mesh穿过另外一个到第三个的路径其实是固定的。当服务器运行足够长时间,那些
缓冲数据可以覆盖所有地图,这时候只要用个文件存起来,以后服务器运行只要算一头一尾,其他的全部从cache出,可能效果不错哦


On 4月23日, 下午6时15分, Linker <linker.m....@gmail.com> wrote:
> 非常同意qiaojie 的看法。这个寻路我是做过的,用的是NavMesh.
> 多线程领导跟随模式。
> 很简单就实现了。
> 上文资料中的方案实在是只学到Erlang的皮(多进程,其实是多协程),没学到骨(消息传递无共享模型)。
> 实在是南辕北辙,差劲的很!!!
>

> 2009/4/23 qiaojie <qiao...@gmail.com>


>
>
>
> > 这个寻路系统的设计方案真是巨傻啊
> > 只能支持单台寻路服务器,没什么伸缩性,用什么多进程共享内存方式,这个跟多线程没任何本质差别,还需要用调度程序来同步共享内存的访问,好愚昧啊。
> > 其实在他的方案基础上稍做修改就能支持分布式的寻路系统了,我不知道是他故意不拿出来误导听众,还是脑子进水了才设计出一个这么傻的方案。
>
> > 2009/4/23 benegg <ide...@163.com>
>
> >> 西山居的陈杰的幻灯片, 讲了网游服务端寻路, 当然也包括网游服务器的架构. 有不少有用的概念.
>
> >>http://docs.google.com/Present?docid=dds5zgx6_429v8d9crgc
>
> >> 另一个人总结了一些有用的东西:
>
> >> 1. 将独立的模块封装成单独的进程。
> >> 2. 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另
> >> 外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。
>
> >>http://timyang.net/architecture/game-backend/
>
> >> 强烈推荐想要开发网游的朋友都好好看这两篇文章!
> >> ------
> >> 转自:http://www.benegg.com/?p=23
>
> --
> Regards,
> Linker Lin

> linker.m....@gmail.com

Nil

unread,
Apr 23, 2009, 8:40:12 AM4/23/09
to 高性能网络编程邮件列表
看到他强调把独立模块封装成单独的进程,我有个疑问。如果一个模块完全独立,我把它扔到一个线程里自己跑,反正它也不用和其他线程互锁,那性能有多大区
别?我猜想是不是两个不相干的锁在Lock的时候检查互斥也会造成资源消耗,而在不同的进程里没这个问题?关于锁的具体机制我没什么研究,请教一下各位

qiaojie

unread,
Apr 23, 2009, 9:27:44 AM4/23/09
to dev4s...@googlegroups.com
如果想用缓存数据加快寻路的话,PathFindingWorker内部也可以缓存,不过一般不太会这么做,没见过有什么寻路算法是利用缓存的路径来寻路的。至于缓存全部路径,这个基本上是不现实的,除非地图很小,否则很快会把内存耗尽。
 


 
2009/4/23 Nil <nil....@gmail.com>

Nil

unread,
Apr 23, 2009, 9:36:34 AM4/23/09
to 高性能网络编程邮件列表
寻路算法是不缓存的,但是我可以把地图分块,比方说我要从地图1到地图3,那么从地图1走到地图2的路要搜(起点),地图2到地图3的路其实是固定的,
这个就可以缓存,然后再算一个地图3到终点的路径。有点像路由算法

On 4月23日, 下午9时27分, qiaojie <qiao...@gmail.com> wrote:
> 如果想用缓存数据加快寻路的话,PathFindingWorker内部也可以缓存,不过一般不太会这么做,没见过有什么寻路算法是利用缓存的路径来寻路的。至于缓存全部路径,这个基本上是不现实的,除非地图很小,否则很快会把内存耗尽。
>

> 2009/4/23 Nil <nil.t...@gmail.com>

qiaojie

unread,
Apr 23, 2009, 9:39:34 AM4/23/09
to dev4s...@googlegroups.com
这个你应该首先去读一下NavMesh的相关算法,不然我们没有讨论的基础。


 
2009/4/23 Nil <nil....@gmail.com>

Nil

unread,
Apr 23, 2009, 11:29:35 AM4/23/09
to 高性能网络编程邮件列表
看来前面几位老兄说的"UI"问题确实存在,呵呵。虽然我上一次写游戏里用的NavMesh是03年左右了,我相信有些东西我还没忘记

On 4月23日, 下午9时39分, qiaojie <qiao...@gmail.com> wrote:
> 这个你应该首先去读一下NavMesh的相关算法,不然我们没有讨论的基础。
>
> 2009/4/23 Nil <nil.t...@gmail.com>

Linker

unread,
Apr 23, 2009, 1:46:40 PM4/23/09
to dev4s...@googlegroups.com
缓存对静态障碍有用。如果需求涉及动态阻挡的话就不行了。

--
Sent from my mobile device

Regards,
Linker Lin
linker...@gmail.com

Kouga

unread,
Apr 23, 2009, 8:46:07 PM4/23/09
to dev4s...@googlegroups.com
我覺得,針對本帖主題,沒必要和一些跳樑的帖子爭論。另外前面有兄台說的關於“全地圖覆蓋預演算“的想法其實非常不錯,不過那樣做數據量的確太大,建議是——建立區塊間的關鍵路徑連接,那麼算法要做的就是“到達最近一個關鍵點”和“從最後一個關鍵點到目的地”就行了,而整個尋路算法幾乎可以簡單的抽象到“直線走過去吧”這種~就如我們一般交通,首先走路到最近的公交站,然後遵循固定的線路去到目的地,然後下車再走走~

2009/4/23 Nil <nil....@gmail.com>



--
签名是什么东西??

Kouga

unread,
Apr 23, 2009, 8:47:09 PM4/23/09
to dev4s...@googlegroups.com
啊啊~就是這個~抱歉米注意看到~

2009/4/23 Nil <nil....@gmail.com>



--
签名是什么东西??

Sparkle

unread,
Apr 23, 2009, 9:19:22 PM4/23/09
to dev4s...@googlegroups.com
其实多少还是可行的,客户端负责生成路径,服务器只用验证路径就行了
验证比生产的成本要低很多

2009/4/23 benegg <ide...@163.com>:
> 这种方法几乎不会被使用, 因为客户端是不可靠的, 很容易作弊.
>
> On Apr 23, 11:07 am, Kouga <ncwh...@gmail.com> wrote:
>> 另外一個就是,將尋路算法分佈到用戶端,讓客戶幫忙計算。
>>
>> 2009/4/23 Kouga <ncwh...@gmail.com>
>>
>>
>>
>> > 好東東~收下了~其實這些事情我們也會考慮,但是不是那麼完整就是了......


>>
>> > 2009/4/23 benegg <ide...@163.com>
>>
>> > 西山居的陈杰的幻灯片, 讲了网游服务端寻路, 当然也包括网游服务器的架构. 有不少有用的概念.
>>
>> >>http://docs.google.com/Present?docid=dds5zgx6_429v8d9crgc
>>
>> >> 另一个人总结了一些有用的东西:
>>
>> >> 1. 将独立的模块封装成单独的进程。
>> >> 2. 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另
>> >> 外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。
>>
>> >>http://timyang.net/architecture/game-backend/
>>
>> >> 强烈推荐想要开发网游的朋友都好好看这两篇文章!
>> >> ------
>> >> 转自:http://www.benegg.com/?p=23
>>
>> > --

>> > 签名是什么东西??
>>
>> --
>> 签名是什么东西??
> >
>

CoreWar

unread,
Apr 23, 2009, 9:53:09 PM4/23/09
to 高性能网络编程邮件列表
是啊,客户端生成路径就好了,如果寻路这种工作服务器都做好的话岂不是方便了脱机外挂?

况且就算服务器生成路径,客户端发过来的走路信息还是要逐一验证的吧

On 4月24日, 上午9时19分, Sparkle <pope...@gmail.com> wrote:
> 其实多少还是可行的,客户端负责生成路径,服务器只用验证路径就行了
> 验证比生产的成本要低很多

老范

unread,
Apr 23, 2009, 9:57:14 PM4/23/09
to dev4s...@googlegroups.com
我觉得既然地图是静态的。 公交车站也是静态的了。 这样其实可以事先搞一张公交线路的静态表。 不需要运行时动态计算后进行cache 了。  每次寻路就安安心心的先就近找到站台,然后按照既定线路找到目的点站台,然后从那里在寻路去目标点。


Regards

FanYun


2009/4/24 Kouga <ncw...@gmail.com>

yuliuxuanke

unread,
Apr 23, 2009, 10:20:14 PM4/23/09
to dev4s...@googlegroups.com
静态表?我现在的做全国的公交站点,搞静态表得多大?
某些城市倒是可以考虑的,热点城市

2009/4/24 老范 <fanyu...@gmail.com>

Kouga

unread,
Apr 23, 2009, 11:31:37 PM4/23/09
to dev4s...@googlegroups.com
全国这种是可以分层的嘛~比如你要从成都去上海,有高速公路、铁路、飞机等等固定航道的。你只需要到 高速入口点、火车站、飞机场就可以了。

2009/4/24 yuliuxuanke <yuliu...@gmail.com>



--
签名是什么东西??

Kouga

unread,
Apr 23, 2009, 11:48:33 PM4/23/09
to dev4s...@googlegroups.com
以下说一些跑题的话,与技术无关,与沟通有关,而且大多数是废话,不感兴趣可以直接略过。

现在我终于明白,像这种层次上的差距是得下苦功才能补足的了,通过沟通可以解决一些问题,但是对于只有单向管道的同志来说就很抱歉了。自大到无以复加,是很难在一个团队中保持有效沟通和协作的。而这里,是一个论坛,本来就是用来沟通而不是炫耀或者泄愤的地方,所以请大家发言之前三思而后行,并记住“己所不欲,勿施于人”的道理。

2009/4/24 Kouga <ncw...@gmail.com>



--
签名是什么东西??

sunway

unread,
Apr 24, 2009, 1:34:44 AM4/24/09
to 高性能网络编程邮件列表
现在大部分3D游戏都可以穿人,所以这个问题影响不大。

On 4月24日, 上午1时46分, Linker <linker.m....@gmail.com> wrote:
> 缓存对静态障碍有用。如果需求涉及动态阻挡的话就不行了。
>

> On 4/23/09, Nil <nil.t...@gmail.com> wrote:
>
>
>
>
>
> > 寻路算法是不缓存的,但是我可以把地图分块,比方说我要从地图1到地图3,那么从地图1走到地图2的路要搜(起点),地图2到地图3的路其实是固定的,
> > 这个就可以缓存,然后再算一个地图3到终点的路径。有点像路由算法
>
> > On 4月23日, 下午9时27分, qiaojie <qiao...@gmail.com> wrote:

> >> 如果想用缓存数据加快寻路的话,PathFindingWorker内部也可以缓存,不过一般不太会这么做,没见过有什么寻路算法是利用缓存的路径来寻路的。至-于缓存全部路径,这个基本上是不现实的,除非地图很小,否则很快会把内存耗尽。

> linker.m....@gmail.com- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Linker

unread,
Apr 24, 2009, 1:49:28 AM4/24/09
to dev4s...@googlegroups.com
可以把静态表存到硬盘上,再mmap嘛。

--

Sent from my mobile device

Regards,
Linker Lin
linker...@gmail.com

Nil

unread,
Apr 24, 2009, 3:03:41 AM4/24/09
to 高性能网络编程邮件列表
你们不要无视我这个问题嘛,谁说说?

“看到他强调把独立模块封装成单独的进程,我有个疑问。如果一个模块完全独立,我把它扔到一个线程里自己跑,反正它也不用和其他线程互锁,那性能有多大



别?我猜想是不是两个不相干的锁在Lock的时候检查互斥也会造成资源消耗,而在不同的进程里没这个问题?关于锁的具体机制我没什么研究,请教一下各

位”

Kouga

unread,
Apr 24, 2009, 3:22:59 AM4/24/09
to dev4s...@googlegroups.com
這個問題其實可以這麼想:其實單個進程就是一個帶有資源的線程,它特殊在可以再開闢線程使用它的資源為它賣命。
在這種環境下,派生線程則要可憐的多,它本身不允許攜帶大量資源,只能使用進程提供的環境和一個小小的堆疊,所以只能為任務而生,為任務而滅,還不得不在使用進程的資源前拿到鑰匙上鎖而且時間不能太長……

此處有一個漏洞,其實線程自己也可以通過new堆空間來分配數據,不過那個東西相當不好管理,不小心洩露的問題極度容易發生(shared_ptr幫不了你,thread_special_ptr或許可以幫你解決這個問題)。

另外,再說進程所在的外部環境,即操作系統來說,它給每個進程能夠使用的資源也是限定了的,比如只能有4G內存空間,只能打開多少個句柄等等。在密集運算發生的時候,資源往往就是一個不小心就不夠用的局面。

最後,如PPT所述,一旦需要熱升級,或者需要後備運作系統,那麼開啟一個新的進程要容易的多(特別Windows這種系統還不允許你在程序運行的同時對它升級的情況下),開啟線程……那個……似乎將簡單問題反而複雜化了不是么?

所以,用進程來分割是一個比較好的選擇,而且操作系統也對進程調度更加容易一點(你嘗試使用任務管理器去調度一個線程試試看?)

2009/4/24 Nil <nil....@gmail.com>



--
签名是什么东西??

monkey ben_shan_

unread,
Apr 24, 2009, 5:54:00 AM4/24/09
to dev4s...@googlegroups.com
呵呵,其实我觉得,正如老范,kouga所说的,游戏里面的路径搜索和现在都在用的地理信息系统,google的map都可以提供很精确,多方位的路径方案哦,个人觉得交通站的设立还是可行滴。对地图数据进行预处理之后cache只要一次初始化,可以按照层次初始化,让寻路模块中留下的计算量最小,比如要从A 到 B, 中间需要经过1,2,3,4 几个交通站,交通站之间的路径是在cache中的,寻路模块只计算A->1,  4->B, 还有1,2,3,4之间的油画就可以了。然后在寻路模块中设立log,定期根据log更新交通站的位置和数量。 小弟愚见,欢迎拍砖。。

2009/4/24, Kouga <ncw...@gmail.com>:

monkey ben_shan_

unread,
Apr 24, 2009, 5:57:57 AM4/24/09
to dev4s...@googlegroups.com
其实还是感觉服务器的寻路,在游戏中意义不是很大,要是做在客户端就可以了。

2009/4/24, monkey ben_shan_ <benshan...@gmail.com>:
2009/4/24, Kouga <ncw...@gmail.com>:
--
祝工作顺利,身体健康。
高                                敬上

sunway

unread,
Apr 24, 2009, 7:42:41 AM4/24/09
to 高性能网络编程邮件列表
同感~

On 4月24日, 下午5时57分, monkey ben_shan_ <benshan.mon...@gmail.com> wrote:
> 其实还是感觉服务器的寻路,在游戏中意义不是很大,要是做在客户端就可以了。
>

> 2009/4/24, monkey ben_shan_ <benshan.mon...@gmail.com>:
>
>
>
>
>
>
>
> > 呵呵,其实我觉得,正如老范,kouga所说的,游戏里面的路径搜索和现在都在用的地理信息系统,google的map都可以提供很精确,多方位的路径方案哦,-个人觉得交通站的设立还是可行滴。对地图数据进行预处理之后cache只要一次初始化,可以按照层次初始化,让寻路模块中留下的计算量最小,比如要从A


> > 到 B, 中间需要经过1,2,3,4 几个交通站,交通站之间的路径是在cache中的,寻路模块只计算A->1, 4->B,
> > 还有1,2,3,4之间的油画就可以了。然后在寻路模块中设立log,定期根据log更新交通站的位置和数量。 小弟愚见,欢迎拍砖。。
>

> > 2009/4/24, Kouga <ncwh...@gmail.com>:
>
> >> 這個問題其實可以這麼想:其實單個進程就是一個帶有資源的線程,它特殊在可以再開闢線程使用它的資源為它賣命。
>
> >> 在這種環境下,派生線程則要可憐的多,它本身不允許攜帶大量資源,只能使用進程提供的環境和一個小小的堆疊,所以只能為任務而生,為任務而滅,還不得不在使用進-程的資源前拿到鑰匙上鎖而且時間不能太長......
>
> >> 此處有一個漏洞,其實線程自己也可以通過new堆空間來分配數據,不過那個東西相當不好管理,不小心洩露的問題極度容易發生(shared_ptr幫不了你,t-hread_special_ptr或許可以幫你解決這個問題)。
>
> >> 另外,再說進程所在的外部環境,即操作系統來說,它給每個進程能夠使用的資源也是限定了的,比如只能有4G內存空間,只能打開多少個句柄等等。在密集運算發生的-時候,資源往往就是一個不小心就不夠用的局面。
>
> >> 最後,如PPT所述,一旦需要熱升級,或者需要後備運作系統,那麼開啟一個新的進程要容易的多(特別Windows這種系統還不允許你在程序運行的同時對它升級-的情況下),開啟線程......那個......似乎將簡單問題反而複雜化了不是么?
>
> >> 所以,用進程來分割是一個比較好的選擇,而且操作系統也對進程調度更加容易一點(你嘗試使用任務管理器去調度一個線程試試看?)
>
> >> 2009/4/24 Nil <nil.t...@gmail.com>


>
> >>> 你们不要无视我这个问题嘛,谁说说?
>
> >>> "看到他强调把独立模块封装成单独的进程,我有个疑问。如果一个模块完全独立,我把它扔到一个线程里自己跑,反正它也不用和其他线程互锁,那性能有多大
> >>> 区
> >>> 别?我猜想是不是两个不相干的锁在Lock的时候检查互斥也会造成资源消耗,而在不同的进程里没这个问题?关于锁的具体机制我没什么研究,请教一下各
>
> >>> 位"
>
> >>> On 4月23日, 下午8时40分, Nil <nil.t...@gmail.com> wrote:
> >>> > 看到他强调把独立模块封装成单独的进程,我有个疑问。如果一个模块完全独立,我把它扔到一个线程里自己跑,反正它也不用和其他线程互锁,那性能有多大区
> >>> > 别?我猜想是不是两个不相干的锁在Lock的时候检查互斥也会造成资源消耗,而在不同的进程里没这个问题?关于锁的具体机制我没什么研究,请教一下各位
>
> >> --
> >> 签名是什么东西??
>
> > --
> > 祝工作顺利,身体健康。
> > 高 敬上
>

> --
> 祝工作顺利,身体健康。
> 高 敬上- 隐藏被引用文字 -
>
> - 显示引用的文字 -

benegg

unread,
Apr 24, 2009, 11:16:14 PM4/24/09
to 高性能网络编程邮件列表
还是有用的, NPC的寻路和其它AI可以作为一个独立的进程运行, 向主逻辑服务器发送和正常的客户端一样的操作指令.

---------------
http://www.benegg.com

Linker

unread,
Apr 25, 2009, 3:56:07 AM4/25/09
to dev4s...@googlegroups.com
作为独立进程的副作用是很多数据要保存多份。

--

Kouga

unread,
Apr 26, 2009, 8:46:46 PM4/26/09
to dev4s...@googlegroups.com
当然~相关数据的必要备份是肯定需要的~就算是一次函数调用,如果只是传值,也会在栈上生成一份备份不是么?这种东西没法避免的就不用避免了,对吧?

2009/4/25 Linker <linker...@gmail.com>
作为独立进程的副作用是很多数据要保存多份。

--
签名是什么东西??

monkey ben_shan_

unread,
Apr 26, 2009, 11:19:11 PM4/26/09
to dev4s...@googlegroups.com
嗯,确实可以这样做。 我没做过npc,玩家的逻辑,借此想讨论一下。npc数据和AI的计算可以影响到玩家的状态才是有意义的,比如一张地图中的很多grid和cell,只有player在其中一个cell中时计算这个cell的npc才是有意义的,其他cell的npc是不需要计算的。 但是在计算这个cell的npc的数据时需要很多与玩家的数据进行操作, 而独立的进程和计算得住线程都要有一份npc的数据,所以二者要保持同步。这样就有了几个问题:1,有多少npc的逻辑可以由独立出来的进程来处理,当然所有客户端的行为都可以放在这个进程来做,但是作为内部可以信任的“客户端“,还有没有更多的逻辑可以用来计算分担主服务器的负担。2,作为“客户端“的进程,要计算寻路和AI逻辑最好还是要含有玩家数据,也就是说“客户端“要看到周围的玩家。因此玩家的数据也要和主服务器同步,这样会增加很多设计的复杂度。
有什么好的设计方式或者方法。多线程或者多进程加锁共享数据不是很明智的。 现在一般单服务器设计玩家容量大概都是4-5千吧。

 
在09-4-25,benegg <ide...@163.com> 写道:

Kouga

unread,
Apr 27, 2009, 1:09:59 AM4/27/09
to dev4s...@googlegroups.com
哈~既然都说了是内部“客户端”,那么你与客户端怎么同步,就怎么与AI进程保持同步就是了……

另外,主服务器的负担请设计在“服务”的进程内,表把所有问题都混合起来考虑,那样你永远无法设计一个完整的系统。

2009/4/27 monkey ben_shan_ <benshan...@gmail.com>



--
签名是什么东西??

monkey ben_shan_

unread,
Apr 27, 2009, 1:26:42 AM4/27/09
to dev4s...@googlegroups.com
呵呵,楼上的是正解,负载的问题就放在模块外面去搞吧。

在09-4-27,Kouga <ncw...@gmail.com> 写道:

BB.Case

unread,
Apr 27, 2009, 5:35:44 AM4/27/09
to 高性能网络编程邮件列表
看了幻灯片,感觉“官腔”了。
NPC逻辑相对好独立一点,扯上分布式游戏服务器就有扯淡的嫌疑了,好分的模块早都分了。
erlong的进程式安全用在NPC服务器上,感觉也有点牵强。
还有扯淡的“分派模块简单,消耗小”一说,既然是TCP,你工作都交给硬件了。
动态缓存寻路结果也不靠谱,都分布了,这么复杂的功能,加个机器就解决了。

sunway

unread,
Apr 27, 2009, 8:23:55 AM4/27/09
to 高性能网络编程邮件列表
天堂2有独立的怪物服务器,他是基于脚本的,所以他的怪物的智力比国内的明显强大很多,
不知道最新的《永恒之塔》是不是吸收了这个优点。

Linker

unread,
Apr 27, 2009, 9:36:07 AM4/27/09
to dev4s...@googlegroups.com
独立的怪物服务器?感觉主要的问题在怪物也要关心主服务器的数据,同步开销大了点。感觉这里的分布策略应该是分zone。怪物要知道玩家位置等。

--

Kouga

unread,
Apr 27, 2009, 9:19:23 PM4/27/09
to dev4s...@googlegroups.com
游戏里很多东西都可以“闹独立"的~末尾不是开了张清单么?IM、AI等等都“独立”出去了。

说“官腔”还真不知道是基于哪点看出来的……请指教。

说实在的,TCP和硬件的关系,偶都有点朦胧~依稀记得TCP下面还有2层才是硬件吧?

缓存不靠谱……说实话,偶也觉得不是很靠谱,但是缓存只要命中就可以即时生效丫~

加个机器就解决了……如果要开多个服务器组,是不是都要多加一个机器?成本如何考虑?

另外说一个让人不快的说法,看完此回帖,感觉“临时打工仔腔”多一点。

2009/4/27 BB.Case <Top...@gmail.com>



--
签名是什么东西??

Kouga

unread,
Apr 27, 2009, 9:22:14 PM4/27/09
to dev4s...@googlegroups.com
囧~就我所知道的,很多怪物、NPC都是基于脚本运作的,哪怕是单机都是如此。

所以,如果要说“脚本”能让怪物强大很多……这个不假。但是智力这个问题——只与脚本编写人员的智力挂钩吧?呵呵。

另外,重复一次发言:怪物既然都“闹独立”了,它就是一个“特权玩家”而已~让它存活在服务器上就OK~同步的话,你如何与玩家同步,就如何与它同步。

2009/4/27 sunway <sunh...@gmail.com>



--
签名是什么东西??

sunway

unread,
Apr 27, 2009, 10:02:15 PM4/27/09
to 高性能网络编程邮件列表
单机游戏用脚本很正常,网络游戏里面 任务、NPC等等这些用脚本很正常,
而普通的怪物一般只有简单的AI,攻击离它一定范围内的玩家。
如果要让怪物具有更高等级的AI,把这部分逻辑独立出去是必然的,高等级
的AI可以增加游戏的乐趣。


On 4月28日, 上午9时22分, Kouga <ncwh...@gmail.com> wrote:
> 囧~就我所知道的,很多怪物、NPC都是基于脚本运作的,哪怕是单机都是如此。
>
> 所以,如果要说“脚本”能让怪物强大很多……这个不假。但是智力这个问题——只与脚本编写人员的智力挂钩吧?呵呵。
>
> 另外,重复一次发言:怪物既然都“闹独立”了,它就是一个“特权玩家”而已~让它存活在服务器上就OK~同步的话,你如何与玩家同步,就如何与它同步。
>

> 2009/4/27 sunway <sunhui...@gmail.com>

sunway

unread,
Apr 27, 2009, 10:06:21 PM4/27/09
to 高性能网络编程邮件列表
个人建议多讨论技术问题少讨论一些人的问题。
对事不要对人~

Kouga

unread,
Apr 27, 2009, 10:48:35 PM4/27/09
to dev4s...@googlegroups.com
增加游戏乐趣的同时增加服务器负担~这是鱼与熊掌的关系~偶仍旧倾向于——让玩家的计算资源帮忙拓展服务器可用资源吧~(P2P计算网格- -?)

另外,关于对人的评价,其实偶只基于一个准则“以彼之道,还彼之身”。

2009/4/28 sunway <sunh...@gmail.com>

单机游戏用脚本很正常,网络游戏里面 任务、NPC等等这些用脚本很正常,
而普通的怪物一般只有简单的AI,攻击离它一定范围内的玩家。
如果要让怪物具有更高等级的AI,把这部分逻辑独立出去是必然的,高等级
的AI可以增加游戏的乐趣。

--
签名是什么东西??

sunway

unread,
Apr 28, 2009, 12:56:29 AM4/28/09
to 高性能网络编程邮件列表
怪物的AI让玩家计算恐怕不是很合适吧。

本论坛的最高宗旨~和谐~

On 4月28日, 上午10时48分, Kouga <ncwh...@gmail.com> wrote:
> 增加游戏乐趣的同时增加服务器负担~这是鱼与熊掌的关系~偶仍旧倾向于——让玩家的计算资源帮忙拓展服务器可用资源吧~(P2P计算网格- -?)
>
> 另外,关于对人的评价,其实偶只基于一个准则“以彼之道,还彼之身”。
>

> 2009/4/28 sunway <sunhui...@gmail.com>

BB.Case

unread,
Apr 28, 2009, 1:41:55 AM4/28/09
to 高性能网络编程邮件列表
我就是个临时打工仔罢了,我只是想表达,这个资料给我带来的收获太少,大多是抛概念。文章里面写的东西离应用,有相当的距离吧?

那个清单,搞过服务器开发的有几个开不出来?个人觉得,真正能为逻辑减负的思路,还是应该在低耦合的代码组织上,就像上次巨人那位提到的,他们的国战服
务器,去掉了相当多的逻辑功能。只是觉得吧这种功能上的分化建立在进程这个级别,实在是太理想。
分派模块交给硬件这句话没说对,我只是觉得,既然都是进程间TCP通信了,还扯什么任务同步,难道他的TCP在应用层还是轮询等待的???
寻路的缓存算法,重用怎么评估?复杂度多高,又不是CPU的寻址命中这么简单的事情?易维护?可复用性有多少?这些不考虑么?这么大的成本,难道不是加
机器更划算?

总的来说,看完没收获!!!感觉像看报告,也许偶层次太低了-_-

On 4月28日, 上午9时19分, Kouga <ncwh...@gmail.com> wrote:

BB.Case

unread,
Apr 28, 2009, 1:57:21 AM4/28/09
to 高性能网络编程邮件列表
你没练过九阳神功-_-
慕容家下场也不咋滴呢
开个玩笑哈,嘿嘿……

On 4月28日, 上午10时48分, Kouga <ncwh...@gmail.com> wrote:

> 增加游戏乐趣的同时增加服务器负担~这是鱼与熊掌的关系~偶仍旧倾向于——让玩家的计算资源帮忙拓展服务器可用资源吧~(P2P计算网格- -?)
>
> 另外,关于对人的评价,其实偶只基于一个准则“以彼之道,还彼之身”。
>

> 2009/4/28 sunway <sunhui...@gmail.com>

monkey ben_shan_

unread,
Apr 28, 2009, 2:13:56 AM4/28/09
to dev4s...@googlegroups.com
....看完不知所云了。 说说你低耦合的代码组织吧。 比如npc,地图,物品,技能,buffer云云。。。。

在09-4-28,BB.Case <Top...@gmail.com> 写道:

unread,
Apr 28, 2009, 5:53:45 AM4/28/09
to dev4s...@googlegroups.com
我想,大家做的游戏都是基于地图的吧.一个地图服务器处理某一区域的玩家.
当要求进入这一区域的玩家超过单台服务器承载能力的时候怎么办.可以把
这些玩家迁移到另一台空闲的服务器吗.两台服务器上的玩家,可以互相看到
对方,并且实施某种行为.但操作的数据却并不在同一台服器上.这跟独立的
NPC服务器处理情况很相似.




Linker

unread,
Apr 28, 2009, 7:29:43 AM4/28/09
to dev4s...@googlegroups.com
同步数据太费。

--

Linker

unread,
Apr 28, 2009, 7:35:51 AM4/28/09
to dev4s...@googlegroups.com
怪物是不是需要很多核心资源?跨进程会不会太费?

--

kennywong

unread,
Apr 28, 2009, 7:59:56 AM4/28/09
to 高性能网络编程邮件列表

On 4月28日, 下午7时29分, Linker <linker.m....@gmail.com> wrote:
> 同步数据太费。


>
> On 4/28/09, 蔚 <huangweil...@21cn.com> wrote:
>
> > 我想,大家做的游戏都是基于地图的吧.一个地图服务器处理某一区域的玩家.
> > 当要求进入这一区域的玩家超过单台服务器承载能力的时候怎么办.可以把
> > 这些玩家迁移到另一台空闲的服务器吗.两台服务器上的玩家,可以互相看到
> > 对方,并且实施某种行为.但操作的数据却并不在同一台服器上.这跟独立的
> > NPC服务器处理情况很相似.
>
> --
> Sent from my mobile device
>
> Regards,
> Linker Lin

> linker.m....@gmail.com


那就要看一个对象到底有多少数据是需要其它对象关心,和怎么去同步了.当然目前
我还没想到很好的方法.但很显然,如果我们要突破单区域的人数承载限制,只有这样
做.

Kouga

unread,
Apr 29, 2009, 9:44:14 PM4/29/09
to dev4s...@googlegroups.com
没什么不合适的~当然~肯定不能让玩家有“篡改”的可能~也并不是因为玩家在该场景中,它分配到的计算任务就一定是他周围的妖怪~计算和实际游戏部分可以分割开的~这个概念一定要确立起来,否则此类“计算”任务就是天方夜谭了。其次,需要计算的一定是一些“大运算量”的任务,如果只是简单如3+2-5的计算交给玩家节点,无论怎么想都划不来。再次,我们可以建立有效的“验算服务”,如果发现连续“计算错误”则视为作弊~如此。

在“和谐”如寺庙的地方,还有护法金刚存在。可见,一味河蟹只会横着爬,不会转弯的。

2009/4/28 snway <sunh...@gmail.com>
怪物的AI让玩家计算恐怕不是很合适吧。

本论坛的最高宗旨~和谐~

On 4月28日, 上午10时48分, Kouga <ncwh...@gmail.com> wrote:
> 增加游戏乐趣的同时增加服务器负担~这是鱼与熊掌的关系~偶仍旧倾向于----让玩家的计算资源帮忙拓展服务器可用资源吧~(P2P计算网格- -?)

>
> 另外,关于对人的评价,其实偶只基于一个准则"以彼之道,还彼之身"。
>
> 2009/4/28 sunway <sunhui...@gmail.com>
>
> > 单机游戏用脚本很正常,网络游戏里面 任务、NPC等等这些用脚本很正常,
> > 而普通的怪物一般只有简单的AI,攻击离它一定范围内的玩家。
> > 如果要让怪物具有更高等级的AI,把这部分逻辑独立出去是必然的,高等级
> > 的AI可以增加游戏的乐趣。
>
> --
> 签名是什么东西??




--
签名是什么东西??

sunway

unread,
Apr 29, 2009, 10:09:07 PM4/29/09
to 高性能网络编程邮件列表
如果这个玩家周围有其他玩家,那么怪物AI的计算量如何分配了?

On 4月30日, 上午9时44分, Kouga <ncwh...@gmail.com> wrote:
> 没什么不合适的~当然~肯定不能让玩家有"篡改"的可能~也并不是因为玩家在该场景中,它分配到的计算任务就一定是他周围的妖怪~计算和实际游戏部分可以分割开-的~这个概念一定要确立起来,否则此类"计算"任务就是天方夜谭了。其次,需要计算的一定是一些"大运算量"的任务,如果只是简单如3+2-5的计算交给玩家节-点,无论怎么想都划不来。再次,我们可以建立有效的"验算服务",如果发现连续"计算错误"则视为作弊~如此。


>
> 在"和谐"如寺庙的地方,还有护法金刚存在。可见,一味河蟹只会横着爬,不会转弯的。
>

> 2009/4/28 snway <sunhui...@gmail.com>


>
>
>
>
>
> > 怪物的AI让玩家计算恐怕不是很合适吧。
>
> > 本论坛的最高宗旨~和谐~
>
> > On 4月28日, 上午10时48分, Kouga <ncwh...@gmail.com> wrote:
> > > 增加游戏乐趣的同时增加服务器负担~这是鱼与熊掌的关系~偶仍旧倾向于----让玩家的计算资源帮忙拓展服务器可用资源吧~(P2P计算网格- -?)
>
> > > 另外,关于对人的评价,其实偶只基于一个准则"以彼之道,还彼之身"。
>
> > > 2009/4/28 sunway <sunhui...@gmail.com>
>
> > > > 单机游戏用脚本很正常,网络游戏里面 任务、NPC等等这些用脚本很正常,
> > > > 而普通的怪物一般只有简单的AI,攻击离它一定范围内的玩家。
> > > > 如果要让怪物具有更高等级的AI,把这部分逻辑独立出去是必然的,高等级
> > > > 的AI可以增加游戏的乐趣。
>
> > > --
> > > 签名是什么东西??
>
> --

> 签名是什么东西??- 隐藏被引用文字 -
>
> - 显示引用的文字 -

CoreWar

unread,
Apr 29, 2009, 10:54:37 PM4/29/09
to 高性能网络编程邮件列表
冒险岛,挑战的怪物AI就是客户端计算的,一个玩家看到怪之后,这个怪就一直归他控制了,直到怪死亡或者玩家离开这个区域

具体怎么分配就不是特别清楚了。这样做的后果就是外挂满天飞,吸怪,无敌等等。

unread,
Apr 29, 2009, 10:55:18 PM4/29/09
to dev4s...@googlegroups.com

象游戏这种项目,将计算任务分给客户端计算,是否能保证响应的及时.

将计算分配到一台客户端,服务将其需要的资源传送给它,启动计算,再将

结果传递给需要通知的其它客户端.在公网上,这个时间到底要多少,是

否能接受.

 

 




unread,
Apr 29, 2009, 10:57:38 PM4/29/09
to dev4s...@googlegroups.com

而且上面所说的过程还没有包括验证,是交给服务器验证呢,

还是由其它的客户端一起验证,这又是一笔时间开销.




sunway

unread,
Apr 29, 2009, 11:03:59 PM4/29/09
to 高性能网络编程邮件列表
恩,这么做需要游戏类型配合。
对于当今强调团队合作的游戏,经常出现N个人组队打BOSS的场景,这种客户端计算怪物AI的策略几乎没有用武之地。
当然也不排除客户端计算AI,这个就是传统的单机版本游戏。做单机版本游戏和服务器端就没多大关系了。

Zoom.Quiet

unread,
Apr 29, 2009, 11:14:16 PM4/29/09
to dev4s...@googlegroups.com
这是 CN Erlounge III - ECUG.ORG - Erlang China User Group
http://ecug.org/agenda/
上的一个展示,并不是西山居真实的运营模式,是陈杰个人的思考结精,
非常有参考价值的...

2009/4/23 jacky zhao <jacky...@gmail.com>:
> 巨傻啊、好愚昧啊、脑子进水了啊。
>
> 讨论问题,最好不要带这种 “人身攻击” 型的话。
>
> 2009/4/23 qiaojie <qia...@gmail.com>
>>
>> 这个寻路系统的设计方案真是巨傻啊
>> 只能支持单台寻路服务器,没什么伸缩性,用什么多进程共享内存方式,这个跟多线程没任何本质差别,还需要用调度程序来同步共享内存的访问,好愚昧啊。
>> 其实在他的方案基础上稍做修改就能支持分布式的寻路系统了,我不知道是他故意不拿出来误导听众,还是脑子进水了才设计出一个这么傻的方案。
>>
>>
>>
>>
>> 2009/4/23 benegg <ide...@163.com>
>>>
>>> 西山居的陈杰的幻灯片, 讲了网游服务端寻路, 当然也包括网游服务器的架构. 有不少有用的概念.
>>>
>>> http://docs.google.com/Present?docid=dds5zgx6_429v8d9crgc
>>>
>>> 另一个人总结了一些有用的东西:
>>>
>>>   1. 将独立的模块封装成单独的进程。
>>>   2. 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另
>>> 外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。
>>>
>>> http://timyang.net/architecture/game-backend/
>>>
>>> 强烈推荐想要开发网游的朋友都好好看这两篇文章!
>>> ------
>>> 转自: http://www.benegg.com/?p=23

--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
Free as in Freedom! 哲思自由软件社区:http://zeuux.org

bitjoe

unread,
Apr 29, 2009, 11:21:35 PM4/29/09
to dev4s...@googlegroups.com
等windows 7出来和windows 2007比较下,是否哪个最优。像windows NT professional这样子的,最好用了。

但是微软宣传win7好像像win98,感觉突出了上网本。

你们也都在跑题,呵呵,我继续跑。

2009/4/23 Kouga <ncw...@gmail.com>
跑題太遠了……(但是偶決定跟著跑一跑~)<-突然發現Gmail有好玩的表情~

Vista很難用很難用,非常難用——這是我的看法。用過Windows2007過後就直接拋棄了Vista~
等windows 7出来和windows 2007比较下,是否哪个最优。像windows NT professional这样子的,最好用了。

Linux非常非常絢麗~~真的~而且一些高清播放還不需要特別設置就可以直接播放……

2009/4/23 bitjoe <darve...@gmail.com>

有没有人觉得vista很好用的啊?

实话说,我觉得,vista,不错。让我对windows 2007又有了期待。

linux桌面太不强劲了,啥时候再以界面为中心设计一个操作系统,可能有希望打败微软。


2009/4/23 qiaojie <qia...@gmail.com>:
> 这个寻路系统的设计方案真是巨傻啊
> 只能支持单台寻路服务器,没什么伸缩性,用什么多进程共享内存方式,这个跟多线程没任何本质差别,还需要用调度程序来同步共享内存的访问,好愚昧啊。
> 其实在他的方案基础上稍做修改就能支持分布式的寻路系统了,我不知道是他故意不拿出来误导听众,还是脑子进水了才设计出一个这么傻的方案。
>
>
>
>
> 2009/4/23 benegg <ide...@163.com>
>>
>> 西山居的陈杰的幻灯片, 讲了网游服务端寻路, 当然也包括网游服务器的架构. 有不少有用的概念.
>>
>> http://docs.google.com/Present?docid=dds5zgx6_429v8d9crgc
>>
>> 另一个人总结了一些有用的东西:
>>
>>   1. 将独立的模块封装成单独的进程。
>>   2. 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另
>> 外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。
>>
>> http://timyang.net/architecture/game-backend/
>>
>> 强烈推荐想要开发网游的朋友都好好看这两篇文章!
>> ------
>> 转自: http://www.benegg.com/?p=23
>>
>
>
> >
>





--
签名是什么东西??




Kouga

unread,
Apr 29, 2009, 11:40:27 PM4/29/09
to dev4s...@googlegroups.com
咱现在来玩一个“洋葱皮游戏”,咱们先拿张白纸,画张地图当背景,然后拿张透明纸,上面画一堆玩家,叠在白纸上;再拿一张,一样画一堆玩家,一样叠上去……怎么样?是不是觉得这个区域的玩家越来越多?但是地图似乎距离我们越来越遥远了……没关系丫~地图这种数据,所有玩家都有一份,他们只需要当前和他在一起的玩家以及上下玩家数据——却仍旧是一大堆数据需要“同步”也。

此时,有几种方案:第一是将每个洋葱皮对应一个场景,玩家见到的就是“多线服务器”
第二是将每层洋葱皮拿一个进程来服务,然后就有“同步问题”
第三是,玩家可以看到整个透明的洋葱层,然后在需要与其它层的玩家交互时,才和它取得联系——嗯?似乎光展示玩家的状况是不需要同步的了?

2009/4/28 kennywong <huangw...@21cn.com>



--
签名是什么东西??

Kouga

unread,
Apr 29, 2009, 11:41:15 PM4/29/09
to dev4s...@googlegroups.com
其实我想说的是,服务器不只是可以在地图上平面切分,也可以在空间上纵向切分~

2009/4/30 Kouga <ncw...@gmail.com>



--
签名是什么东西??

Kouga

unread,
Apr 29, 2009, 11:45:01 PM4/29/09
to dev4s...@googlegroups.com
老兄先换个邮箱吧~你的邮件服务系统将整个话题切分成不同的会话了……建议用Gmail~

回题,咱们将游戏设计成“树”好不好?那么计算任务就是某些枝叶之间需要完成的了。通过区域划分后,将需要的运算直接分派到就近节点(从客户端到客户端,P2P),计算完毕直接反馈,服务器只需要在根部“观察"这个世界是否符合规则就是了。

2009/4/30 蔚 <huangw...@21cn.com>

而且上面所说的过程还没有包括验证,是交给服务器验证呢,

还是由其它的客户端一起验证,这又是一笔时间开销.








--
签名是什么东西??

qiaojie

unread,
Apr 30, 2009, 12:18:27 AM4/30/09
to dev4s...@googlegroups.com
我原本还以为是拿西山居的网游服务器架构改头换面一下拿出来忽悠,现在才发现原来
是根本没实现过,凭空yy出来的设计,难怪会如此不靠谱。反正yy么,怎么忽悠都是可
以的,吹的比他更神乎其神的多的是,sunway比较清楚吧,当初zona吹的怎么神,把
天桥忽悠的那是一愣一愣的,大把的往里砸银子,最后还不是连个泡都没见着。还有个
叫BigWorld的,刚出来的时候那个宣传,大有一统网游服务器市场的气势,用下来才发
现问题一堆,做出来的游戏还不及土制的服务器。
有空在这里yy些不靠谱的概念,不如自己去实践一下,成天yy是不会有什么提高的。




2009/4/30 Zoom.Quiet <zoom....@gmail.com>

unread,
Apr 30, 2009, 12:20:24 AM4/30/09
to dev4s...@googlegroups.com

玩家只需要跟他在一起的那些玩家的数据,一个玩家周围的玩家会不断的变化,不是吗.

其次,假设我一台服务器处理的是某一个玩家,及其周围的玩家,如果其周围的玩家数量就

超过单服承受能力呢.还有,B在A的可视范围内,C又在B的可视范围内,但是,C却不一定在

A的可视范围内.为什么我们不让他们完全可以分布在任何一台服务器上,而无需理会B,C是

否在自己的周围呢.




unread,
Apr 30, 2009, 12:24:50 AM4/30/09
to dev4s...@googlegroups.com

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

回题,咱们将游戏设计成“树”好不好?那么计算任务就是某些枝叶之间需要完成的了。通过区域划分后,将需要的运算直接分派到就近节点(从客户端到客户端,P2P ),计算完毕直接反馈,服务器只需要在根部“观察"这个世界是否符合规则就是了。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

AI要做的计算到底是什么,只是寻路吗?

假设我的NPC有很多种攻击和防守手段,则NPC要根据他周围的N个目标的情况,例如血量,职业或等级之类的

做出决策.那么,NPC自身的这么多状态,和NPC周围目标的这些状态.我们怎么交给负责计算的客户端呢.

 




unread,
Apr 30, 2009, 12:33:35 AM4/30/09
to dev4s...@googlegroups.com

刚没细看"洋葱皮"

我目前就这种想法,主要是要解决大量的数据同步问题.




Kouga

unread,
Apr 30, 2009, 1:20:47 AM4/30/09
to dev4s...@googlegroups.com
兄台如果有什么好的“实践经验”,欢迎拿来分享啊~

2009/4/30 qiaojie <qia...@gmail.com>



--
签名是什么东西??

谢昊阳

unread,
May 3, 2009, 9:39:18 PM5/3/09
to dev4s...@googlegroups.com
如果LZ所说的某个区域的玩家数量会超过单台服务器的承受能力的话。。如果是MMO的话像我平常做的单台服务器承受2000-3000用户量问题不大,LZ所设计的游戏居然在地图的某个区域就可能超过这个量么?如果真是如此,建议把这个区域单独一个服务器来处理

在09-4-30,Kouga <ncw...@gmail.com> 写道:

Kouga

unread,
May 3, 2009, 10:11:35 PM5/3/09
to dev4s...@googlegroups.com
嗯,这个和具体设计有关,划分的好的自然只需要平面切分,但是万一偶们的玩家可以上天入地……

2009/5/4 谢昊阳 <4609...@gmail.com>



--
签名是什么东西??

wan...@svc.com.cn

unread,
May 4, 2009, 6:50:45 AM5/4/09
to dev4s...@googlegroups.com
其实,个人你觉得网游服务器要使用分布式语言开发,运行在集群上肯定效率高

-----邮件原件-----
发件人: dev4s...@googlegroups.com [mailto:dev4s...@googlegroups.com] 代表 Zoom.Quiet
发送时间: 2009年4月30日 11:14
收件人: dev4s...@googlegroups.com
主题: Re: 分享: 陈杰谈网游服务器的后端技术

Kouga

unread,
May 4, 2009, 9:43:47 PM5/4/09
to dev4s...@googlegroups.com
使用CUDA来处理AI似乎效率更高哦~




--
签名是什么东西??

tao yuan

unread,
May 8, 2009, 9:01:39 PM5/8/09
to dev4s...@googlegroups.com
比较可行的方式是提供专门的AI服务器,由这个AI服务器来负责每个怪物的寻路和AI 计算。
这种AI服务器和GS结合的比较紧密。需要知道GS地图上的详细信息才可以。因为要涉及到动态阻挡的问题。

2009/5/5 Kouga <ncw...@gmail.com>

bitjoe

unread,
May 10, 2009, 4:09:37 AM5/10/09
to dev4s...@googlegroups.com
像这种游戏怎么作?

2009/5/9 tao yuan <yty...@gmail.com>:

cs_opengl32_hax.jpg

tao yuan

unread,
May 10, 2009, 9:32:17 AM5/10/09
to dev4s...@googlegroups.com
这种是精确碰撞的。服务器不行了。
需要客户端来判断了。

2009/5/10 bitjoe <darve...@gmail.com>

Kouga

unread,
May 12, 2009, 12:57:26 AM5/12/09
to dev4s...@googlegroups.com
CS不需要同时在线2000人规模的。注意讨论范围。

2009/5/10 bitjoe <darve...@gmail.com>



--
签名是什么东西??

Horin153

unread,
May 15, 2009, 6:06:08 AM5/15/09
to 高性能网络编程邮件列表
不分实际情况就这样改,情况只会更糟。
ppt中已经讲明了为什么要共享内存:因为 nav_mesh 数据量太大,并且是只读的。如果每个进程都有份自己的 nav_mesh 数据,那一台
服务器可能开一两个寻路进程就内存紧张了。
如果寻路做得这样复杂,其地图数据量必然是庞大的。
网游服务器如果是按集群进行部署的,一个集群中如果逻辑服务器只有几台,有哪个必要也配几台寻路服务器吗?ppt中有附图说明了这种部署情况。

即使如你设计,实质上也是把共享cache移到manager进程,manager进程更新cache时,照样要考虑互斥问题,有时可能还要考虑更新
cache的时序问题。

只要是协作处理共享资源,逻辑上是绕不开同步互斥问题的。

On 4月23日, 下午1时42分, qiaojie <qiao...@gmail.com> wrote:
> 改进很简单,用单个PathFindingManager进程来接受逻辑服务器的寻路请求再转发给各个PathFindingWorker进程来处理,而Pat hFindingManager可以缓存PathFindingWorker发回的结果。改进以后,各个PathFindingWorker进程就是独立的工作 进程,不再需要任何同步操作,另外也不需要用共享内存,要多核处理的话可以开多个线程,这样就可以把PathFindingWorker部署到多个物理服务器上 了。寻路结果的缓存放到PathFindingManager上完成,PathFindingManager本身计算负载很小,所以用单进程单线程就可以完成, 不存在同步和锁的问题。PathFindingManager本身还可以承担PathFindingWorker的管理和负载均衡。
>
> 2009/4/23 wing <wing922w...@gmail.com>
>
>
>
> > 确实如此,程序员很多都有这个毛病,我也经常这么乱说话,得罪很多人,我觉得这就是糟糕的"UI",也许本来你的建议非常有建设性,但是因为你说的太直接,对方 产生了反感,再好的建议也很难被顺利接受了。
>
> > 不过大家都是程序员,都包容理解一些,比如我觉得自己就是个sb,所以别人要说我非常sb时候,就没那么生气,不回应直接忽略过去,大家继续讨论这个服务器设计 的如何,我很感兴趣,但是对寻路这些东西不太懂,更兴趣的是整个架构可以借鉴的部分。
>
> > qiaojie能不能具体说说这个方案可以优化或者你设为设计不良的部分,很有兴趣听听。
>
> > 2009/4/23 Allen Jiang <jiangguilong2...@gmail.com>:
> > > 不瞒你说,凡是地球人都会朝这方向理解,可能这是你平时的说话习惯,言者无心,听着有意,但这种说话方式实在"设计"的不好。
>
> > > ----- Original Message -----
> > > From: qiaojie
> > > To: dev4s...@googlegroups.com
> > > Sent: Thursday, April 23, 2009 1:02 PM
> > > Subject: Re: 分享: 陈杰谈网游服务器的后端技术
> > > 好吧,其实我只是想说这个设计不好,对事不对人。
> > > 你一定要往人上面理解,那可以自动忽略我说的话。
>
> > > 2009/4/23 jacky zhao <jackyz.z...@gmail.com>


>
> > >> 巨傻啊、好愚昧啊、脑子进水了啊。
>
> > >> 讨论问题,最好不要带这种 "人身攻击" 型的话。
>

> > >> 2009/4/23 qiaojie <qiao...@gmail.com>


>
> > >>> 这个寻路系统的设计方案真是巨傻啊
> > >>> 只能支持单台寻路服务器,没什么伸缩性,用什么多进程共享内存方式,这个跟多线程没任何本质差别,还需要用调度程序来同步共享内存的访问,好愚昧啊。
> > >>> 其实在他的方案基础上稍做修改就能支持分布式的寻路系统了,我不知道是他故意不拿出来误导听众,还是脑子进水了才设计出一个这么傻的方案。
>
> > >>> 2009/4/23 benegg <ide...@163.com>
>
> > >>>> 西山居的陈杰的幻灯片, 讲了网游服务端寻路, 当然也包括网游服务器的架构. 有不少有用的概念.
>
> > >>>>http://docs.google.com/Present?docid=dds5zgx6_429v8d9crgc
>
> > >>>> 另一个人总结了一些有用的东西:
>
> > >>>> 1. 将独立的模块封装成单独的进程。
> > >>>> 2. 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另
> > >>>> 外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。
>
> > >>>>http://timyang.net/architecture/game-backend/
>
> > >>>> 强烈推荐想要开发网游的朋友都好好看这两篇文章!
> > >>>> ------
> > >>>> 转自:http://www.benegg.com/?p=23
>
> > --

> > wing
> > wing922w...@gmail.com
> > Hope is a good thing, maybe the best of things.

qiaojie

unread,
May 15, 2009, 6:37:09 AM5/15/09
to dev4s...@googlegroups.com
如果navmesh的数据量很大,需要要共享,那么可以用多线程,当然用多进程共享的方式也是可以的,只读数据,怎么共享都是可以的,这个不是重点。
重点在于cache上,用多进程在共享内存里维护是非常糟糕的设计,把cache移到manager进程去维护就不存在互斥的问题,完全可以串行化的更新cache,
没人会傻到开几个线程去刷新cache。
至于部署的问题是这样的,假设你一个集群有10台逻辑服务器,他们共享1台寻路服务器,那么每台逻辑服务器平均只能获得10%的寻路服务器的计算资源,
既然只需要10%的计算资源就可以满足寻路的性能要求,在逻辑服务器上挤一挤牙膏(或者升级一下硬件)就轻松可以搞定了,何必花那么大力气把寻路服
务单独抽出来另外搞个进程?何况,分布式计算还有网络通讯开销,最后能够获得的性能收益基本可以忽略。


2009/5/15 Horin153 <hori...@gmail.com>:

Kouga

unread,
May 16, 2009, 9:50:22 AM5/16/09
to dev4s...@googlegroups.com
其实我想说的是,用CUDA或者Stream或者OpenCL加速寻路算法就非常好了,起码有20X的加速……

2009/5/15 qiaojie <qia...@gmail.com>



--
签名是什么东西??
Reply all
Reply to author
Forward
0 new messages