【轉】egametang框架簡介


討論QQ群 : 474643097

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上安裝mono,即可,不需要修改任何代碼,就能跑起來。性能方面,因為.net已經開源,mono已經被微軟收購,現在mono的性能很強,測試了,只比windows慢一點點,比lua,python什么快的多了。做游戲服務端完全不在話下。平常我們開發的時候用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.客戶端服務端用同一種語言,並且共享代碼

下載ET框架,打開服務端工程,可以看到服務端引用了客戶端很多代碼,通過引用客戶端代碼的方式實現了雙端共享代碼。例如客戶端服務端之間的網絡消息兩邊完全共用一個文件即可,添加一個消息只需要修改一遍。

9.UDP TCP協議無縫切換

ET框架不但支持TCP,而且支持可靠的UDP協議,UDP支持是封裝了ENet庫,ENet也是英雄聯盟所使用的網絡庫,其特點是快速,並且網絡丟包的情況下性能也非常好,這個我們做過測試TCP在丟包5%的情況下,moba游戲就卡的不行了,但是使用ENet,丟包20%仍然不會感到卡。非常強大。

10 還有很多很多功能,我就不詳細介紹了

a.及其方便檢查CPU占用和內存泄漏檢查,vs自帶分析工具,不用再為性能和內存泄漏檢查而煩惱
b.使用NLog庫,打log及其方便,平常開發時,可以將所有服務器log打到一個文件中,再也不用一個個文件搜索log了
c.統一使用Mongodb的bson做序列化,消息和配置文件全部都是bson或者json,並且以后使用mongodb做數據庫,再也不用做格式轉換了。
d.提供一個強大的ai行為樹工具
e.提供一個同步工具
f.提供命令行配置工具,配置分布式非常簡單

ET框架的服務端是一個強大靈活的分布式服務端架構,完全可以滿足絕大部分大型游戲需求。使用這套框架,客戶端開發者就可以自己完成雙端開發,節省大量人力物力,節省大量溝通時間。

使用方法:
運行指南

討論QQ群 : 474643097


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM