開源分享 Unity3d客戶端與C#分佈式服務端遊戲框架

好久以前,在博客園寫了一篇文章,《分佈式網遊server的一些想法語言和平臺的選擇》,當時就有了用C#作網遊服務端的想法。寫了個Unity3d客戶端分佈式服務端框架,最近發佈了1.0版本,取名ET框架。ET框架的目標就是簡化客戶端開發,簡化分佈式服務端開發,可是功能很是強大,徹底能夠做爲一個大型分佈式服務端使用。ET框架有不少創造性的設計:javascript

1.可用VS單步調試的分佈式服務端,N變1

通常來講,分佈式服務端要啓動不少進程,一旦進程多了,單步調試就變得很是困難,致使服務端開發基本上靠打log來查找問題。日常開發遊戲邏輯也得開啓一大堆進程,不只啓動慢,並且查找問題及其不方便,要在一堆堆日誌裏面查問題,這感受很是糟糕,這麼多年也沒人解決這個問題。ET框架使用了相似守望先鋒的組件設計,全部服務端內容都拆成了一個個組件,啓動時根據服務器類型掛載本身所須要的組件。這有點相似電腦,電腦都模塊化的拆成了內存,CPU,主板等等零件,搭配不一樣的零件就能組裝成一臺不一樣的電腦,例如家用臺式機須要內存,CPU,主板,顯卡,顯示器,硬盤。而公司用的服務器卻不須要顯示器和顯卡,網吧的電腦可能不須要硬盤等。正由於這樣的設計,ET框架能夠將全部的服務器組件都掛在一個服務器進程上,那麼這個服務器進程就有了全部服務器的功能,一個進程就能夠做爲整組分佈式服務器使用。這也相似電腦,臺式機有全部的電腦組件,那它也徹底能夠看成公司服務器使用,也能夠看成網吧電腦。咱們開發的時候就只須要啓動一個服務器進程,這個服務器進程就能夠用VS啓動,那麼固然就可使用VS進行單步調試了。java

2.隨意可拆分功能的分佈式服務端,1變N

分佈式服務端要開發多種類型的服務器進程,好比Login server,gate server,battle server,chat server friend server等等一大堆各類server,傳統開發方式須要預先知道當前的功能要放在哪一個服務器上,當功能愈來愈多的時候,好比聊天功能以前在一箇中心服務器上,以後須要拆出來單獨作成一個服務器,這時會牽扯到大量遷移代碼的工做,煩不勝煩。ET框架在日常開發的時候根本不太須要關心當前開發的這個功能會放在什麼server上,只用一個進程進行開發,功能開發成組件的形式。發佈的時候使用一份多進程的配置便可發佈成多進程的形式,是否是很方便呢?隨便你怎麼拆分服務器。只須要修改極少的代碼就能夠進行拆分。不一樣的server掛上不一樣的組件就好了嘛!python

3.跨平臺的分佈式服務端

ET框架使用C#作服務端,如今C#是徹底能夠跨平臺的,在linux上安裝mono,便可,不須要修改任何代碼,就能跑起來。性能方面,由於.net已經開源,mono已經被微軟收購,如今mono的性能很強,測試了,只比windows慢一點點,比lua,python什麼快的多了。作遊戲服務端徹底不在話下。日常咱們開發的時候用VS在windows上開發調試,發佈的時候發佈到linux上便可。ET框架還提供了一鍵同步工具,打開unity->tools->rsync同步,便可同步代碼到linux上,linux

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

便可編譯啓動服務器。ios

4.提供協程支持

C#天生支持異步變同步語法 async和await,比lua,python的協程強大的多,新版python以及javascript語言甚至照搬了C#的協程語法。分佈式服務端大量服務器之間的遠程調用,沒有異步語法的支持,開發將很是麻煩。因此java沒有異步語法,作單服還行,不適合作大型分佈式遊戲服務端。例如:git

// 發送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,全部的服務器間的異步操做將變得很是連貫,不用再拆成多段邏輯。大大簡化了分佈式服務器開發github

5.提供相似erlang的actor消息機制

erlang語言一大優點就是位置透明的消息機制,用戶徹底不用關心對象在哪一個進程,拿到id就能夠對對象發送消息。ET框架也提供了actor消息機制,實體對象只須要掛上ActorComponent組件,這個實體對象就成了一個Actor,任何服務器只須要知道這個實體對象的id就能夠向其發送消息,徹底不用關心這個實體對象在哪一個server,在哪臺物理機器上。其實現原理也很簡單,ET框架提供了一個位置服務器,全部掛載ActorComoponet的實體對象都會將本身的id跟位置註冊到這個位置服務器,其它服務器向這個實體對象發送消息的時候若是不知道這個實體對象的位置,會先去位置服務器查詢,查詢到位置再進行發送。mongodb

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了json

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框架的服務端是一個強大靈活的分佈式服務端架構,徹底能夠知足絕大部分大型遊戲需求。使用這套框架,客戶端開發者就能夠本身完成雙端開發,節省大量人力物力,節省大量溝通時間。

代碼地址:https://github.com/egametang/Egametang
討論QQ羣 : 474643097

使用方法: 1.用git clone代碼下來,安裝Unity 2017.1p5 和VS2017 2.vs打開Unity/Unity.sln,編譯 3.再啓動一個vs打開Server/Server.sln,編譯 4.打開Unity->tools菜單->命令行配置,選擇LocalAllServer.txt 這是啓動單一App的方式,若是要啓動一組多App服務器,在命令行工具中選擇127.0.0.1.txt,點擊啓動便可,具體配置均可以本身用這個命令行配置工具修改 5.點擊工具中的啓動,這樣就啓動了服務端(也能夠用VS啓動,方便單步調試) 7.運行Unity,輸入賬號,點擊登陸這時日誌 鏈接Gate成功,表示運行OK!

相關文章
相關標籤/搜索