游戏服务器h2engine架构优化和跨平台设计
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#版本正在紧锣密鼓的开发中,大家拭目以待。
相关连接
游戏服务器h2engine架构优化和跨平台设计的更多相关文章
- Unity3d&C#分布式游戏服务器ET框架介绍-组件式设计
前几天写了<开源分享 Unity3d客户端与C#分布式服务端游戏框架>,受到很多人关注,QQ群几天就加了80多个人.开源这个框架的主要目的也是分享自己设计ET的一些想法,所以我准备写一系列 ...
- C++游戏服务器的性能优化
以下只是某次项目的一次经历,最终并没有按照这样的方案来优化,但对思路方面确实是一个提高,所以记录在此. ------------------------------------------------ ...
- 深入浅出node.js游戏服务器开发1——基础架构与框架介绍
2013年04月19日 14:09:37 MJiao 阅读数:4614 深入浅出node.js游戏服务器开发1——基础架构与框架介绍 游戏服务器概述 没开发过游戏的人会觉得游戏服务器是很神秘的 ...
- h2engine游戏服务器设计之聊天室示例
游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...
- H2Engine游戏服务器设计之属性管理器
游戏服务器设计之属性管理器 游戏中角色拥有的属性值很多,运营多年的游戏,往往会有很多个成长线,每个属性都有可能被N个成长线模块增减数值.举例当角色戴上武器时候hp+100点,卸下武器时HP-100点, ...
- FPS游戏服务器设计的问题 【转】
一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时 ...
- (转)FPS游戏服务器设计的问题
FPS游戏服务器设计的问题出处:http://www.byteedu.com/thread-20-1-1.html一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击 ...
- 游戏服务器设计之NPC系统
游戏服务器设计之NPC系统 简介 NPC系统是游戏中非常重要的系统,设计的好坏很大程度上影响游戏的体验.NPC在游戏中有如下作用: 引导玩家体验游戏内容,一般游戏内有很多主线.支线任务,而任务的介绍. ...
- 同一世界服务器架构--Erlang游戏服务器
Erlang最大的优点是方便,很多基础功能都已经集成到Erlang语言中.之前用C++写服务器的时候,管理TCP连接很繁琐,需要写一大堆代码来实现.底层的框架需要写很多代码实现,这样既浪费时间 ...
随机推荐
- display的属性值测试
由于在学习CSS的display的属性值只针对block.inline.inline-block和flex进行过了解,并且自己观察得知列表中li的display属性是list-item,而想要触发BF ...
- DX11 Without DirectX SDK--03 渲染一个立方体
回到 DirectX11--使用Windows SDK来进行开发 一个立方体有8个顶点,然而绘制一个立方体需要画12个三角形,如果按照前面的方法绘制的话,则需要提供36个顶点,而且这里面的顶点数据会重 ...
- 接口调用(发送http请求)
// 向对应的url地址发送http请求, 并获取响应的json字符串 public String getHttpResponse(String url) { // result用 ...
- Project facet Java version 1.8 not supported JDK版本不对无法启动项目解决办法
https://jingyan.baidu.com/article/6c67b1d69a59a02787bb1e30.html
- JavaScript设计模式之----组合模式
javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...
- TestNG失败用例自动截图
参考:https://blog.csdn.net/wangxin1982314/article/details/50247245 1. 首先写一个截屏方法 public class ScreenSho ...
- 基于 HTML5 OpenLayers3 实现 GIS 电信资源管理系统
前言 通过结合 HTML5 和 OpenLayers 可以组合成非常棒的一个电信地图网络拓扑图的应用,形成的效果可以用来作为电信资源管理系统,美食定位分享软件,片区找房,绘制铁轨线路等等,各个领域都能 ...
- status.go
))) return key }
- B20J_1297_[SCOI2009]迷路_矩阵乘法
B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ...
- 为什么说JAVA中要慎重使用继承
JAVA中使用到继承就会有两个无法回避的缺点: 打破了封装性,迫使开发者去了解超类的实现细节,子类和超类耦合. 超类更新后可能会导致错误. 继承打破了封装性 关于这一点,下面是一个详细的例子(来源于E ...