dantesite 2010-01-15
/* QQ: 2#4#2#1#0#6#7#6#4 #表示为空 Mail: lin_style#foxmail.com #替换成@ */
核心,我的并行思路
整体拓扑图
代码执行模块层次
核心,我的并行思路
21:31 2009-12-18
昨晚睡觉的时候,又仔细的考虑了下采取的整个框架模型。前提是要充分利用多核和分布。
方法一:把整个游戏看成一个场景,多线程+锁的肆意执行。想都不用想,代价何其巨大和复杂,抛弃
方法二:为了解决这种异步,加入一个任务队列,并且指定一个线程只能执行几个场景。也就是网络收包还是共同的,场景执行分开了。这样的瓶颈是任务队列需要网络线程、场景执行线程的资源竞争;并且还需要维护一个场景和玩家的关系表,同时可能造成空取。即取得的包不是自己所属的场景。
方法三:既然方法二已经把场景执行线程分开,那何不把网络的连接也分开呢?具体方法如下:
先给若干个场景编号指定好逻辑线程,接着再分配一个网络接包线程,把这个看成是一个完整的游戏服务端。在N核的机器上/不同的机器上,你可以启动N个这样的完整程序,分别指定好不同的场景编号,亲缘到各自的CPU数上。这样就成了一个完整的游戏世界。(也就是吧CPU切成单核单核的应用)然后你要维护的就是,当玩家进行场景切换时,如果场景不在当前的服务端里,改怎么进行跳转,这也就是此次要解决的分布式难题
那么登录模块也可以这么做。一个CPU对应着一个bin,该bin包括一个完成端口的线程(为了防止阻塞等意外可以多个),一个逻辑处理线程,然后一个已经连接的套接字队列。那么,你就得为客户端单独配置一个登陆接口的文件,指定好IP和各个端口。当然,这件事可以交给更新服务器去做。
2009-12-24
今天又机会看了下bigworld的引擎结构图。发现主体的架构是差不多的。让我兴奋了一把。但是bigworld的邮局数据转移,让我大开了眼界,毕竟以前都是自个瞎琢磨。
在我的结构里,最麻烦的就是场景切换时不在一个线程里的数据转移。而BW得做法是,在服务端和客户端的中间设置一排中间服务器,专门用来用户数据的海量转发。这样就不涉及到用户数据转移的问题。而且实现起来也确实直观,决定采用。
整体拓扑图
逐个介绍下每个部件的作用:
Login邮局分配:非常关键的路由。它负责邮局服务器的监控,知道邮局的负载量;负责帮助客户端对邮局的寻址工作。客户端与邮局分配服务器采取的是UDP的连接。原因有二:邮局服务器:进行客户端和BIN之间的消息转发。
Bin1..Bin4:主程序:你只要为他提供好场景编号,就可以像一个独立的游戏程序跑动。尽量将一些最即时的信息(比如打斗)放在这里面运算。
DPC:用来控制非即时性的消息。比如物品的邮寄,聊天消息的转发,数据存储等。
代码执行模块层次
层次上分为网络层,队列层,和逻辑层。以及一个main的启动初始程序。
整个大致的工作流程就是:在接收方面,网络层收到数据后,统一放到队列里,然后由逻辑层解析,有结果返回时直接由逻辑层发送。
这样设计的原因有二: