H2engine的GitHub星星不知不觉已经破百了,也没有特意推广过,但是慢慢的关注的人越来越多。因为事情多,好久没有写东西了,前一段时间有了一些想法,把h2engine又更新了一下,感觉h2engine又向前迈了一大步。本文记录一下最近的心得体会,以及做出的相应修改。

关于RPC

H2engine的rpc部分使用的是原来fflib的ffrpc组件,ffrpc设计的比较强大,但是因为h2engie的架构特点,ffrpc的一些功能用不到,很多网友都询问我关于rpc部分的设计问题,我仔细思考后觉得确实可以把h2engine的rpc部分进行简化,这样对于使用者而言更容易理解。
先看一下h2engine的架构:

  • H2engine设计的为单gate,单服环境内linux下一个gate完全能够满足性能要求,Apache/nigx都是一个进程不是吗?单gate让分布式的结构大大简化。我们知道一般单服架构都有个loginserver,现在可以省略了,因为单gate,每个服直接配置gate地址。
  • H2engine为多进程架构,但是h2engine限定了采用伪分布式的设计,虽然gate和gameserver通过网络通信,但是限定了gate和gameserver在一台机器上。虽然gate和gameserver放在不同机器上也可以通信,但是我们从现实运营的情况出发,很少运维会把gate和gameserver放不同机器上,一般有的时候一台机器上甚至有多个服。所以伪分布式是既能满足需求又能大大简化架构的一个设计。
  • 采用伪分布式设计后,gameserver之间就可以利用共享内存了,全局的数据比如排行榜、行会、好友、组队等,这些模块都是分布式进程中最费时费力容易出错的,但是在h2engine里变得逻辑清晰,直接操作全局内存就可以了,全同步。
  • Rpc模块进行了简化,其实rpc通信分三种,gate调用gameserver接口,gameserver调用gate接口,和gameserver与gameserver之间调用,发现没,所有架构内rpc都需要通过gate,而且h2engine是单gate伪分布式(127.0.0.1速度飞起),那么整个rpc结构就变得非常清晰简单,感兴趣的可以看下gate的broker文件和rpc文件。这两个文件一个是gate端中转,一个是请求端封装,非常简洁。
  • 网络层进行了升级,原来socket是裸的指针,很多网友还是表达了不知道什么时候应该调用safedelete的问题,所以还是改成了智能指针,不需要关系socket什么时候释放。另外socket的私有数据进行了泛型封装,可以存入任何私有数据类型。
    共享内存的简单示意:

关于跨平台

2engine一直是只支持linux下编译,Windows的移植一直没有时间弄,虽然行业内大部分服务器都是跑linux的,但是如果可以Windows下可以开发调试,那对于提高平常的开发效率来说将会大有裨益。
2engine由于一开始是在linux下gcc下开发的,那么在Windows下也用gcc,那么需要修改的跨平台代码将会非常少,本着这个思路,h2engine成功移植到了Windows,并且改动的非常少。

  • Windows下的虽然有mingw直接包含了gcc环境,但是想用上cmake等编译工具还是挺麻烦的,所以我找了一个集成mingw且算得上比较流行的一个Windows IDE:CodeBlocks。见了一个CodeBlocks的项目,想要在Windows下运行只要下载一个CodeBlocks,然后双击工程文件就可以了。
  • 编译h2engine需要依赖openssl、curl、mysql、lua、python2.7,依赖文件都放到windependency文件夹里,包括运行的dll。
  • H2workerlua在Windows下用的lua5.1
  • H2workerpython在Windows下用的python2.7
    注意:CodeBlocks调试需要安装python2.7,setting->debugger->default 里executable path设置为 C:\Program Files (x86)\CodeBlocks\MinGW\bin\gdb32.exe

    关于C sharp

    H2engine的c#版本正在紧锣密鼓的开发中,大家拭目以待。
    相关连接

  1. 文档 http://h2cloud.org
  2. 源码 https://github.com/fanchy/h2engine

游戏服务器h2engine架构优化和跨平台设计的更多相关文章

  1. Unity3d&C#分布式游戏服务器ET框架介绍-组件式设计

    前几天写了<开源分享 Unity3d客户端与C#分布式服务端游戏框架>,受到很多人关注,QQ群几天就加了80多个人.开源这个框架的主要目的也是分享自己设计ET的一些想法,所以我准备写一系列 ...

  2. C++游戏服务器的性能优化

    以下只是某次项目的一次经历,最终并没有按照这样的方案来优化,但对思路方面确实是一个提高,所以记录在此. ------------------------------------------------ ...

  3. 深入浅出node.js游戏服务器开发1——基础架构与框架介绍

    2013年04月19日 14:09:37 MJiao 阅读数:4614   深入浅出node.js游戏服务器开发1——基础架构与框架介绍   游戏服务器概述 没开发过游戏的人会觉得游戏服务器是很神秘的 ...

  4. h2engine游戏服务器设计之聊天室示例

    游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...

  5. H2Engine游戏服务器设计之属性管理器

    游戏服务器设计之属性管理器 游戏中角色拥有的属性值很多,运营多年的游戏,往往会有很多个成长线,每个属性都有可能被N个成长线模块增减数值.举例当角色戴上武器时候hp+100点,卸下武器时HP-100点, ...

  6. FPS游戏服务器设计的问题 【转】

    一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时 ...

  7. (转)FPS游戏服务器设计的问题

    FPS游戏服务器设计的问题出处:http://www.byteedu.com/thread-20-1-1.html一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击 ...

  8. 游戏服务器设计之NPC系统

    游戏服务器设计之NPC系统 简介 NPC系统是游戏中非常重要的系统,设计的好坏很大程度上影响游戏的体验.NPC在游戏中有如下作用: 引导玩家体验游戏内容,一般游戏内有很多主线.支线任务,而任务的介绍. ...

  9. 同一世界服务器架构--Erlang游戏服务器

        Erlang最大的优点是方便,很多基础功能都已经集成到Erlang语言中.之前用C++写服务器的时候,管理TCP连接很繁琐,需要写一大堆代码来实现.底层的框架需要写很多代码实现,这样既浪费时间 ...

随机推荐

  1. Linux的安装(虚拟机环境)与基础配置

    一.背景 本文介绍如何安装虚拟机VMware以及如果在虚拟机上安装Linux系统以及Linux安装完毕之后的基础配置 需要准备的东西有VMware以及Linux镜像文件 二.下载安装VMware 下载 ...

  2. javascript 用函数语句和表达式定义函数的区别详解

    通常我们会看到以下两种定义函数的方式: // 函数语句 function fn(str) { console.log(str); }; // 表达式定义 var fnx=function(str) { ...

  3. c++ 输出精度

    1  保留小数点后**位 cout.flags(ios::fixed); cout.precision(4); //设置输出精度,

  4. Python Selenium 之生成Beautiful可视化报告

    提到自动化测试,少不了自动化生成测试报告,更少不了漂亮的测试报告呀!刚好看到在github上有个大神分享了BeautifulReport,与unittest测试框架完美的结合起来,就能生成Beauti ...

  5. sql server 高可用日志传送

    一. 日志传送概述 SQL Server使用日志传送,可以自动将主服务器的事务日志备份发送到一个或多个辅助数据库上.可选的监视服务器,记录备份和还原操作的历史记录及状态. 优点 提供灾难恢复解决方案 ...

  6. Libevent教程001: 简介与配置

    本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...

  7. Javascript高级程序设计复习——第五章引用类型 【原创】

    5.1  Object类型 1:创建Object实例的两种方式 ①new构造法 var obj1 = new Object(); 注意大写!不传递参数时可以省略圆括号 obj1.hehe = &quo ...

  8. app后端设计(4)-- 通讯的安全性

    在app的后台设计中,一个很重要的因素是考虑通讯的安全性. 因此,我们需要考虑的要点有: 1. 在app和后台,都不能保存任何用户密码的明文 2. 在app和后台通讯的过程中,怎么保证用户信息的安全性 ...

  9. 整合 ucenter 注册自动激活

    http://my.oschina.net/banbo/blog/311691 应用整合 UCenter,同步注册到 Discuz 的用户,在 Discuz 登录时得手动激活,用户体验很不好,不过解决 ...

  10. Java面试题之对static的理解

    1.静态变量 类型说明符是static.2.静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个 ...