服务器框架回顾

  【c++端游】

  第一个接触的游戏项目,MMORPG,虽说MMORPG有蛮高的技术门槛,但那会大多在写逻辑,很少深入底层,所以收获有限。

  win平台的,整体看分了三层:HomeServer、GameServer、四个DB进程(AccountDB、CharDB、LogDB、MailDB)。HomeServer负责登录排队、同中控、平台交互等;GameServer是游戏主体,内部除了数据库、网络IO......游戏逻辑相关的采用了单线程架构,有统一的Service循环框架,各种功能都是注册进Service由主循环发起,比如:AI、Buff、移动、玩家数据写库...

  在线玩家均放于内存池中,因单线程缘故,所以对强交互的支持很高(不必考虑并发操作一致性,rpc调用,rpc delay……)。类传奇的战斗方式,也能应付密集计算。

  可惜整体上的实现了解不多,深入研习过的只有三个部分:AI、网络模块、活动设计。

  我们的AI是个基于虚函数的递归调用系统(本质用的解析器模式),附带初始化时指定切换规则。简单说来分为三个层级:

    1)Do:执行基础动作,如走路、攻击、睡觉

    2)Base:对Do层做简单包装,加入条件判断、控制等,如随机走、围绕某点、跟随

    3)Logic:组合任意AI(Logic之间也能互相组合),有切换逻辑

  同行为树的区别:

    1)逻辑判断、行为写在了一起

    2)行为树提取了通用节点,易于组织逻辑,比如

      a)Selector Node

      b)Sequence Node

      c)Parallel Node

  与外部系统交互上:

  • 行为树
    • 弄个全局变量/dic,写condition检测
    • 新增对应条件节点,Update时自己检查
  • 项目AI
    • 通过事件类型,直接告诉AI切换行为( OnEvent )
    • AI内部只关心自己的常规流程,比如巡逻、攻击、跟随…
    • 特殊条件的逻辑,全交给外界事件处理……觉得这样解耦挺不错
      • 发事件的地方,相当于决策层
      • 行为树里的决策层,就是整个树结构,行为都封装在行为节点,或一棵小树里
    • 相对而言行为树的Condition Node就得拉入外部数据

  

  这个AI系统,对比behaviac的行为树,量级算是很轻了,核心代码不超300行,容易把控细节,且实现大多玩法的AI不成问题。

  网络模块,windows下固然是IOCP,这个可以另开贴子详细描述,可挖的东西非常多。

  活动设计,一位大神的作品,用c++做通信内核、数据存放,具体逻辑全放Lua脚本,扩展性非常高,且使用方便。举个印象很深的例子:

  客户端需要的数据是非常杂乱的,很难统一格式,大神在脚本层做了一套指令系统,svr端只需调同一接口发出指令即可,形如“Command#param1#param2#param3...”,客户端脚本中,只需注册同名函数,即能自动调用。发送显示信息方便非常。

  AI和IOCP有整理重构过,源码地址:

  https://github.com/3workman/InterpretAI

  https://github.com/3workman/IOCP

  【lua手游】

  这个项目的架构比较时髦,Logic、Gateway、Battle、Cross、SDK、Center、DB、World……齐全了。

  多线程架构,c++做内核,Lua写逻辑,其中Logic、Battle、Gateway、DB均可水平扩展。Cross负责后台模块之间的通信,比如Battle同Logic(每个Battle、Logic完成初始化后,去Cross注册下)。

  先说优点:

    1)使用方便,包装的Rpc通信,不必注册消息,且用的buffer传参,代码中连定义消息结构体都省了;

    2)起服流程设计很好,区分了Init、OnReady、Sequence等不同的接口调用阶段,方便数据布局、热更新;

    3)借助Lua强大的mettable,可以做到在业务层消灭所有数据库操作,全底层控制,玩家数据自动同步客户端;

    4)支持逻辑事务性,server端批量操作,直接调接口,只要一个失败,整个msg调用自动回退……爽的一比,不用预先搞一坨判断;

  缺点也明显:

    1)底层有大量的数据拷贝,性能不高,作为手游服务器,貌似仅支持5k在线

    2)不支持强交互,同erlang、go自带的轻量线程不同,这里的是系统级线程,玩家之间的数据修改加锁的,且无法保证时序上数据的一致性,比如B先改了A的数据,C再去访问,很可能C拿到的还是旧数据……批量玩家的数据交互,甚至需要开发者自己预估竞态,然后用对应技巧规避;

    3)该服务器原用于页游的,被设计成:一个服务器进程可跑多个服的数据,所以一个线程可能在跑几个服的数据,而一个服的数据也会分在多个线程中。这个特性让你在写代码时要额外注意,比如A、B两玩家若分配在不同线程,那他们彼此是不可见的,用错API就一直返回空了;再比如活动数据,要求全服一致,就不能随便乱放了;

    4)静态生存期的数据种类太多了,有:玩家数据、玩家临时数据、ShareData、玩家共享数据、lua文件数据、全局_G数据……要理解它们各自存在的目的、适用场景~~可得一番功夫

  虽说如此,但这个架构我觉得是很优秀的,尤其设计思想,几个优点带来的福音,写代码high爆了,开发效率非常高,一个熟手就能应付全部svr端任务。

  【go手游】

  最近刚接触,go是个很好用的语言,并发虽然没erlang那么牛逼,但一般的游戏绝对够用。且写出的代码可读性高(也有不好的,没奇技淫巧玩,硬编码的写法多了不少),静态语言省了一大部分动态语言的debug时间。

  说回架构,这个项目用的多进程架构:accountSvr、battleSvr、chatSvr、crossSvr、gamesvr、logSvr、mongoDB。

  主逻辑服务器gamesvr用的http短连接(上面两个都是用的长连接,Battle战斗服务器用的UDP),battleSvr、chatSvr用的tcp长连接同client交互。

  每个模块都是单独的一个进程,架构非常清晰,功能内聚,很有些每个模块提供一种服务的味道,可以继续延伸,还在研习之中。

  这个相比之前的服务器,最大优点是简单、清晰,学习掌握成本很低,且够用……嗯,这也是go的设计哲学呐(*^__^*)   

时间: 2024-07-30 13:33:49

服务器框架回顾的相关文章

流行的python服务器框架有哪些

今天给大家推荐5款目前比较流行的python开发http://www.maiziedu.com/course/python/服务器框架,并向大家简单介绍下服务器框架的作用吧: 1.tonardo---- 多并发.轻量级应用, "非阻塞"的web 容器.类似tomcat.这个大家太熟悉了,就不多说了. 2.Twisted---- Twisted 是一个Python 应用程序和库文件的集成套件.其中包括全套页面服务器应用程序和基于文本模式的游戏引擎.还有一些诸如对数据流进行处理的模块.是一

PHP socket 服务器框架集

1.Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询.Swoole可以广泛应用于互联网.移动通信.企业软件.网络游戏.物联网.车联网.智能家庭等领域. 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品. 2.workerman workerman是一个高性能的PHP

跨平台网络通信与服务器框架 acl 3.2.0 发布

acl 3.2.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台:整个 acl 项目主要包含三个函数库:lib_acl(纯C开发的基础库,主要包含网络通信及服务器编程框架以及其它丰富的功能).lib_protocol(包含 HTTP/PING/SMTP 通信协议的C语言实现).lib_fiber(网络协程库).lib_acl_cpp

acl 网络通信与服务器框架库示例列表

跨平台网络通信及服务器框架库 --- "acl" 项目里有大量的测试及应用示例,主要有三个示例集合,如下: 1.acl/samples:该目录下的例子主要是基于 lib_acl 及 lib_protocol 两个库的例子-    1.1 acl: 打印当前 acl 库版本号程序-    1.2 aio/client: 非阻塞 io 客户端-    1.3 aio/server: 非阻塞 io 服务器-    1.4 base64: base64 编/解码程序-    1.5 btree

SPWebServer:一个基于 SPServer 的 web 服务器框架

SPWebServer:一个基于 SPServer 的 web 服务器框架 博客分类: OpenSource项目 应用服务器框架Web网络应用多线程 看到这个题目,估计很多人会问:为什么要再实现一个 web 服务器? 这里有几个原因: 1.这是一个 web 服务器框架,不是一个完整的 web 服务器.也就是说 SPWebServer 提供的是一套 API 和类库,可以方便地集成到现有的应用程序中.可以称 SPWebServer 为 embedded web server . 2.有些时候,我们需

Boost Asio 异步TCP服务器框架

Boost Asio 异步TCP服务器框架 flyfish 2015-5-30 session 类 头文件 #pragma once #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> class session: public boost::enable

游戏服务器框架:Leaf/go

Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率并追求极致的开发效率.Leaf 适用于几乎所有的游戏类型.其主要的特性: 良好的使用体验.Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 稳定性.Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 多核支持.Leaf 通过模块机制和 leaf/go 尽可能的利用多核资源,同时又尽量避免各种副作用 良好的模块支持. 一个 Leaf 开发的游戏服务器由多个模块组成(例如 LeafServer),模块有以下特点

spserver 开源服务器框架研究与分析

网上开源的C/C++服务器框架 还是比较少的. 最近研究了 spserver , 里面用了较多的设计模式,使用设计模式的目的是把不变的东西和可变的东西分离并且封装起来,避免以后修改代码, 应用设计模式的书里面讲的就是 “对修改关闭,对扩展开放”,但是滥用设计模式会把简单的问题复杂话了. spserver代码量比较少,比较容易看懂,如果只是做一个简单的echo服务器的话,spserver  可以给新手一个快速搭建服务器的框架. 用vld测试后, 发现spserver有很多内存泄露的地方.并且 ms

流行python服务器框架

流行python服务器框架 1.tonardo---- 多并发.轻量级应用, “非阻塞”的web 容器.类似tomcat.这个大家太熟悉了,就不多说了. 2.Twisted---- Twisted 是一个Python 应用程序和库文件的集成套件.其中包括全套页面服务器应用程序和基于文本模式的游戏引擎.还有一些诸如对数据流进行处理的模块.是一个异步的网络开发框架,其中包含可以独立运行的服务器.类似tomcat. 3.django---- 一个web开发的框架.类似struts.admin功能号称是