下一篇 [2] ET框架初养成 mac OS第一次启动Demo

我写ET框架连载文章的目的有两点

第一点 是记录自己学习这个ET框架的点点滴滴. 看懂了 敲通了 并且记录了

第二点 就是分享自己踩平过的路 希望其中某一个心得体会能帮到你们

下面是作者对ET框架的介绍

ET Git地址 https://github.com/egametang/ET/

ET的介绍:

ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等

ET的功能:

1.可用VS单步调试的分布式服务端,N变1

一般来说,分布式服务端要启动很多进程,一旦进程多了,单步调试就变得非常困难,导致服务端开发基本上靠打log来查找问题。平常开发游戏逻辑也得开启一大堆进程,不仅启动慢,而且查找问题及其不方便,要在一堆堆日志里面查问题,这感觉非常糟糕,这么多年也没人解决这个问题。ET框架使用了类似守望先锋的组件设计,所有服务端内容都拆成了一个个组件,启动时根据服务器类型挂载自己所需要的组件。这有点类似电脑,电脑都模块化的拆成了内存,CPU,主板等等零件,搭配不同的零件就能组装成一台不同的电脑,例如家用台式机需要内存,CPU,主板,显卡,显示器,硬盘。而公司用的服务器却不需要显示器和显卡,网吧的电脑可能不需要硬盘等。正因为这样的设计,ET框架可以将所有的服务器组件都挂在一个服务器进程上,那么这个服务器进程就有了所有服务器的功能,一个进程就可以作为整组分布式服务器使用。这也类似电脑,台式机有所有的电脑组件,那它也完全可以当作公司服务器使用,也可以当作网吧电脑。

2.随意可拆分功能的分布式服务端,1变N

分布式服务端要开发多种类型的服务器进程,比如Login server,gate server,battle server,chat server friend server等等一大堆各种server,传统开发方式需要预先知道当前的功能要放在哪个服务器上,当功能越来越多的时候,比如聊天功能之前在一个中心服务器上,之后需要拆出来单独做成一个服务器,这时会牵扯到大量迁移代码的工作,烦不胜烦。ET框架在平常开发的时候根本不太需要关心当前开发的这个功能会放在什么server上,只用一个进程进行开发,功能开发成组件的形式。发布的时候使用一份多进程的配置即可发布成多进程的形式,是不是很方便呢?随便你怎么拆分服务器。只需要修改极少的代码就可以进行拆分。不同的server挂上不同的组件就行了嘛!

3.跨平台的分布式服务端

ET框架使用C#做服务端,现在C#是完全可以跨平台的,在linux上安装.netcore,即可,不需要修改任何代码,就能跑起来。性能方面,现在.netcore的性能非常强,比lua,python,js什么快的多了。做游戏服务端完全不在话下。平常我们开发的时候用VS在windows上开发调试,发布的时候发布到linux上即可。ET框架还提供了一键同步工具,打开unity->tools->rsync同步,即可同步代码到linux上,

./Run.sh Config/StartConfig/192.168.12.188.txt 

即可编译启动服务器。

4.提供协程支持

C#天生支持异步变同步语法 async和await,比lua,python的协程强大的多,新版python以及javascript语言甚至照搬了C#的协程语法。分布式服务端大量服务器之间的远程调用,没有异步语法的支持,开发将非常麻烦。所以java没有异步语法,做单服还行,不适合做大型分布式游戏服务端。例如:

// 发送C2R_Ping并且等待响应消息R2C_Ping
R2C_Ping pong = await session.Call<R2C_Ping>(new C2R_Ping());
Log.Debug("收到R2C_Ping");// 向mongodb查询一个id为1的Player,并且等待返回
Player player = await Game.Scene.GetComponent<DBProxyComponent>().Query<Player>(1);
Log.Debug($"打印player name: {player.Name}")

可以看出,有了async await,所有的服务器间的异步操作将变得非常连贯,不用再拆成多段逻辑。大大简化了分布式服务器开发

5.提供类似erlang的actor消息机制

erlang语言一大优势就是位置透明的消息机制,用户完全不用关心对象在哪个进程,拿到id就可以对对象发送消息。ET框架也提供了actor消息机制,实体对象只需要挂上ActorComponent组件,这个实体对象就成了一个Actor,任何服务器只需要知道这个实体对象的id就可以向其发送消息,完全不用关心这个实体对象在哪个server,在哪台物理机器上。其实现原理也很简单,ET框架提供了一个位置服务器,所有挂载ActorComoponet的实体对象都会将自己的id跟位置注册到这个位置服务器,其它服务器向这个实体对象发送消息的时候如果不知道这个实体对象的位置,会先去位置服务器查询,查询到位置再进行发送。

6.提供服务器不停服动态更新逻辑功能

热更是游戏服务器不可缺少的功能,ET框架使用的组件设计,可以做成守望先锋的设计,组件只有成员,无方法,将所有方法做成扩展方法放到热更dll中,运行时重新加载dll即可热更所有逻辑。

7.客户端热更新一键切换

因为ios的限制,之前unity热更新一般使用lua,导致unity3d开发人员要写两种代码,麻烦的要死。之后幸好出了ILRuntime库,利用ILRuntime库,unity3d可以利用C#语言加载热更新dll进行热更新。ILRuntime一个缺陷就是开发时候不支持VS debug,这有点不爽。ET框架使用了一个预编译指令ILRuntime,可以无缝切换。平常开发的时候不使用ILRuntime,而是使用Assembly.Load加载热更新动态库,这样可以方便用VS单步调试。在发布的时候,定义预编译指令ILRuntime就可以无缝切换成使用ILRuntime加载热更新动态库。这样开发起来及其方便,再也不用使用狗屎lua了

8.客户端全热更新

客户端可以实现所有逻辑热更新,包括协议,config,ui等等

9.客户端服务端用同一种语言,并且共享代码

下载ET框架,打开服务端工程,可以看到服务端引用了客户端很多代码,通过引用客户端代码的方式实现了双端共享代码。例如客户端服务端之间的网络消息两边完全共用一个文件即可,添加一个消息只需要修改一遍。

10.KCP ENET TCP Websocket协议无缝切换

ET框架不但支持TCP,而且支持可靠的UDP协议(ENET跟KCP),ENet是英雄联盟所使用的网络库,其特点是快速,并且网络丢包的情况下性能也非常好,这个我们做过测试TCP在丢包5%的情况下,moba游戏就卡的不行了,但是使用ENet,丢包20%仍然不会感到卡。非常强大。框架还支持使用KCP协议,KCP也是可靠UDP协议,据说比ENET性能更好,使用kcp请注意,需要自己加心跳机制,否则20秒没收到包,服务端将断开连接。协议可以无缝切换。

11. 3D Recast寻路功能

可以Unity导出场景数据,给服务端做recast寻路。做MMO非常方便,demo演示了服务端3d寻路功能

12. 服务端支持repl,也可以动态执行一段新代码

这样就可以打印出进程中任何数据,大大简化了服务端查找问题的难度

13.打包工具

ET框架带有一整套打包工具,完全傻瓜式。一键打包,自动分析共享资源。对比md5更新

14.还有很多很多功能,我就不详细介绍了

a.及其方便检查CPU占用和内存泄漏检查,vs自带分析工具,不用再为性能和内存泄漏检查而烦恼
b.使用NLog库,打log及其方便,平常开发时,可以将所有服务器log打到一个文件中,再也不用一个个文件搜索log了
c.统一使用Mongodb的bson做序列化,消息和配置文件全部都是bson或者json,并且以后使用mongodb做数据库,再也不用做格式转换了。
d.提供一个强大的ai行为树工具
e.提供一个同步工具
f.提供命令行配置工具,配置分布式非常简单

ET框架的服务端是一个强大灵活的分布式服务端架构,完全可以满足绝大部分大型游戏需求。使用这套框架,客户端开发者就可以自己完成双端开发,节省大量人力物力,节省大量沟通时间。

[1] ET框架初养成 爱之初体验相关推荐

  1. 爬虫选手初养成Day1 | 影评数据爬虫及情感分析

    爬虫选手初养成Day1 爬取影评数据 网络爬虫 踩坑指南 影评数据应用之情感分析 数据预处理 词向量嵌入 模型训练 结果测试 踩坑指南 众所周知,Python的爬虫是一个很好用的数据工具,但是学校课程 ...

  2. 魅蓝3 原声android,#原创新人# 一个初当煤油的体验 — MEIZU 魅蓝3 开箱测评

    #原创新人# 一个初当煤油的体验 - MEIZU 魅蓝3 开箱测评 2016-06-12 16:09:12 13点赞 5收藏 18评论 大一狗,大学快一年了,学习没咋弄好 ,倒是闲逛之余认识了张大妈 ...

  3. 【RT-Thread Smart】ART-Pi Smart 开发板开箱及爱之初次体验

    ART-Pi Smart 开发板开箱及爱之初次体验 首先, 感谢RT=Thread给的试用机会, 感谢熊大的指导. 本文ART-Pi Smart开箱及初次体验内置应用 标题开箱 收到有几天了.我们一步 ...

  4. Abaqus模拟偏心受压钢管混凝土柱(浇筑混凝土之前钢管存在初应力和初变形)

    1.结构参数 1.基本参数 柱的尺寸为600x600x4000.内嵌钢管Φ400×14.钢管外侧混凝土的强度等级为C40,钢管芯内混凝土强度等级为C60.钢管采用Q345B,钢筋为HRB400.柱截面 ...

  5. Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

    Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...

  6. Java程序员从笨鸟到菜鸟之(八十五)跟我学jquery(一)爱之初体验jquery

    一.Jquery简介 jQuery是一个优秀的Javascrīpt框架.它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari  ...

  7. python android开发_Android与Python爱之初体验

    独家授权码个蛋转载 * 前言 看到这个标题,大家可能会认为就是Android运行python脚本,或者用python写app,这些用QPython和P4A就可以实现了.我在想既然C可以调用Python ...

  8. 专辑一:爱之初体验(初级)

    1.Everyone Has a Story in Life(每个人都有自己的故事) A 24-year-old boy seeing out from the train's windows sho ...

  9. 因缺思厅Qpython爱之初体验

    歪瑞歪瑞因缺思厅的APP ---------------------------------除了美观基本上没什么卵用的分割线----------------------------------- Qp ...

最新文章

  1. iDoNews 业界报不道:大众点评最有价值的两个东西
  2. 图案研究2--斜线续
  3. 前端资源构建-Grunt环境搭建
  4. 【Python 爬虫】 2、HTTP基本原理
  5. java登录注册升级代码_【升级版】Java 登录,注册,传数据到后台小案例
  6. currenthashmap扩容原理_高并发编程系列:深入探讨ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)...
  7. SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件
  8. 第8章 数据库的分库分表
  9. ajax教程 异步刷新验证,Ajax实现异步刷新验证用户名是否已存在的具体方法
  10. element级联选择框的使用~干货分享
  11. 【Endnote】EndnoteX9快速上手教程
  12. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)...
  13. oracle数据库直方图,数据库 – Oracle伪造直方图
  14. C# 传递给C++函数的结构体没有对齐的问题
  15. 2022年系统分析师论文模拟题--押题
  16. windows连接远程桌面必须要有用户名和密码
  17. 2017-9-13 NOIP模拟赛[xxy]
  18. 一篇实验结果统计检验入门文档
  19. 联想与戴尔台式计算机比较,戴尔台式机和联想台式机哪个好用
  20. 计算机连接不上蓝牙鼠标,win10系统蓝牙鼠标连接不上的图文教程

热门文章

  1. 算法提高 质数的后代(合数为两个素数的乘积)
  2. 主动扬声器(有源音箱)和被动扬声器(无源音箱)哪个好 如何选择?有什么区别?
  3. 全方位揭秘!大数据从0到1的完美落地之Mysql链接工具
  4. java repaint闪烁_java中paint,repaint,update之间的关系(闪烁问题的解决)
  5. CVT-SLR: Contrastive Visual-Textual Transformation for Sign Language Recognition with Variational Al
  6. 【源码】三相异步电动机的动态建模
  7. 计算机专业学什么语言好找工作?
  8. 400年都破解不了的密码长啥样,你知道吗?
  9. 关于c语言操作cjson数据相关示例
  10. 什么是跨终端web开发