ET8?新特性
- 多線程多進程架構,架構更加靈活強大,多線程設計詳細內容請看多線程設計課程
- 抽象出纖程(Fiber)的概念,類似erlang的進程,非常輕松的創建多個纖程,利用多核,仍然是單線程開發的體驗
- 纖程調度: 主線程,線程池,每個纖程一個線程,3種調度方式
- Fiber間通信的Actor消息機制
- Entity方面,domain改成IScene,只要實現IScene接口,Entity就是domain,這樣定義domain更加自由
- 預測回滾的幀同步實現 想詳細了解可以看幀同步課程
- protobuf換成了memorypack,實現無gc的網絡
- 純C#版的kcp庫,性能非常強,由sj提交
- 熱更dll改成用ide編譯,更加方便
- sj利用source generater實現了代碼自動模板功能,目前可以自動生成System類,開發者只需要定義Awake Update靜態方法即可,特別方便
- sj開發了分析器,實現了EntitySystemOf,根據entity接口一鍵生成對應的system方法
- 客戶端利用fiber實現網絡獨立線程(demo已實現),甚至可以把邏輯跟表現使用獨立的纖程,更好的利用多核
- 幀同步demo直接利用纖程創建房間,更加方便
- 純c#版尋路dotrecast,至此ET已經完全C#化,沒有任何cpp代碼了
- kcp跟軟路由底層同時支持tcp跟websocket,當udp聯不通的情況下,可以切換成tcp Websocket,并且支持運行時動態切換,玩家不掉線!
- 集成了sj的非托管容器庫,性能爆炸
用ET的17個理由
- 多進程多線程Actor架構,客戶端跟服務端都可以輕松創建纖程(fiber)利用多核,比如客戶端網絡一個纖程,尋路一個纖程,幀同步邏輯層一個纖程,表現層一個纖程
- async await協程同步代碼編寫,避免回調地獄
- 0GC消耗,超強的MemoryPack序列化, 超強的網絡層性能
- kcp支持,網絡響應非常迅速,并且閃斷wifi 4g都不會導致掉線,做競技游戲必備
- kcp底層可以使用tcp udp Websocket協議,當udp聯不通的情況下,可以切換成tcp Websocket,并且支持運行時動態切換,玩家不掉線!
- 軟路由防攻擊設計,買些垃圾主機就可以防住黑客攻擊,比買高防省錢多了,并且用戶不會掉線
- 雙端C#開發,前后端共享代碼,C#本身性能極強,僅次于CPP,不需要學一些亂起八糟的語言,很多獨立游戲開發者,一個人就能用ET開發mmorpg游戲
- 強大的編譯分析器,編譯器就能幫助大家寫出正確的ET風格的代碼
- 客戶端hybridclr熱更新支持
- 客戶端服務端均支持運行時熱重載,客戶端服務端不需要關閉進程就能修改代碼,大大提升了開發效率以及運營效率
- 完善的demo,源碼帶有狀態同步跟預測回滾的幀同步demo
- 完善的機器人開發機制,機器人直接共享客戶端邏輯代碼,減少95%機器人開發工作量,接入ai機器人非常輕松。大規模機器人壓測,輕而易舉
- 強大的ai開發機制,比行為樹更加容易
- 強大的單元測試開發機制,每個單元測試都是整個游戲環境,不用搞mock隔離,開發起來非常輕松
- 優美的程序結構,數據跟方法完全分離
- all in one的開發體驗,開發時只需要啟動unity,發布的時候又可以單獨發布服務端,并且可以跨windows跟linux平臺
- 客戶端服務端數據開發期完全可視化,開啟ENABLE_VIEW宏即可在Unity Hierarchy面板中看到客戶端跟服務端的所有的Entity對象以及字段的內容
- WebGL以及微信小游戲支持,有ET8的webgl版本,開發體驗跟ET8完全一致,無縫對接ET8的服務器
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(new C2R_Ping()) as R2C_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消息機制,實體對象只需要掛上MailBoxComponent組件,這個實體對象就成了一個Actor,任何服務器只需要知道這個實體對象的id就可以向其發送消息,完全不用關心這個實體對象在哪個server,在哪臺物理機器上。其實現原理也很簡單,ET框架提供了一個位置服務器,所有掛載MailBoxComponent的實體對象都會將自己的id跟位置注冊到這個位置服務器,其它服務器向這個實體對象發送消息的時候如果不知道這個實體對象的位置,會先去位置服務器查詢,查詢到位置再進行發送。
6.提供服務器不停服動態更新邏輯功能
熱更是游戲服務器不可缺少的功能,ET框架使用的組件設計,可以做成守望先鋒的設計,組件只有成員,無方法,將所有方法做成擴展方法放到熱更dll中,運行時重新加載dll即可熱更所有邏輯。
7.客戶端使用C#熱更新,熱更新一鍵切換
可以使用csharp.lua或者ILRuntime稍加改造即可做客戶端熱更。再也不用使用狗屎lua了,客戶端可以實現所有邏輯熱更新,包括協議,config,ui等等。
8.客戶端熱重載
開發不用重啟客戶端即可修改客戶端邏輯代碼,開發極其方便
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,也可以動態執行一段新代碼
這樣就可以打印出進程中任何數據,大大簡化了服務端查找問題的難度,開啟repl方法,直接在console中輸入repl回車即可進入repl模式
13.提供客戶端機器人框架支持
幾行代碼即可創建機器人登錄游戲。機器人壓測輕而易舉,機器人跟正常的玩家完全一樣,上線前用機器人做好壓測,大大降低上線崩潰幾率
14.AI框架
ET的AI框架讓AI編寫比UI還簡單
15.測試用例框架
跟市面上的測試用例不同,ET的測試用例都是一個完整的游戲環境,針對協議級別,不需要搞各種接口去mock。寫起來非常快速
16.還有很多很多功能,我就不詳細介紹了
a.及其方便檢查CPU占用和內存泄漏檢查,vs自帶分析工具,不用再為性能和內存泄漏檢查而煩惱
b.使用NLog庫,打log及其方便,平常開發時,可以將所有服務器log打到一個文件中,再也不用一個個文件搜索log了
c.統一使用Mongodb的bson做序列化,消息和配置文件全部都是bson或者json,并且以后使用mongodb做數據庫,再也不用做格式轉換了。
d.提供一個同步工具
ET框架是一個強大靈活的分布式服務端架構,完全可以滿足絕大部分大型游戲需求。使用這套框架,客戶端開發者就可以自己完成雙端開發,節省大量人力物力,節省大量溝通時間。