ET框架筆記 (笑覽世界寫)(轉)


客戶端

1.使用unity2017.2.0版本及以上2018版以下,編譯原始版ET客戶端報沒有引用錯誤時,刪除hoxfit下引用的UnityEngine.dll和UnityEngine.UI.dll,重新引用…\Editor\Data\UnityExtensions\Unity\GUISystem文件下的unityfengine.UI.dll和引用…\Editor\Data\Managed\UnityEngine 文件下的UnityEngine.dll和UnityEngine.CoreModel.dll,注意UnityEngine.dll和UnityEngine.CoreModel.dll必須都為…\Editor\Data\Managed\UnityEngine 文件內的,不然會報錯

2.使用2018版本,同上另外需要重新引用項目Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll即ET的Unity項目dll和ET的Unity.Plugins的dll,刪除所有失效的dll,不然編譯報錯需引用Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll。另外安卓SDK別更新最新的Android SDK Build-tools 28rc1工具。

3.unity2017.2.0版本及以上,你還可能用到的類庫為:UnityEngine.PhysicsModule.dll,若出現如下截圖錯誤,可在如下文件夾目錄下引用它…\Editor\Data\Managed\UnityEngine ,根據實際情況添加,也可能會出現其它報錯,需要引用對應的dll,當然不怕麻煩或者為了不報類似錯可以把如下文件夾目錄…\Editor\Data\Managed\UnityEngine下的所有dll全部引用。2017.2.0及以上的版本把unity的dll按系統分類拆分成很多個,所以需要分別引用需要的dll。

引用

4.如果Hotfix報關於UI的Canvas的錯,需要在Hotfix中添加UnityEngine.UIModule.dll。

UIModule報錯

5.(可選)使用unity2017.2.0以下版本,編譯原始版ET客戶端報沒有引用錯誤時,刪除hoxfit下引用的UnityEngine.dll和UnityEngine.UI.dll,重新引用…\Editor\Data\UnityExtensions\Unity\GUISystem文件下的unityengine.UI.dll和引用…\Editor\Data\Managed 文件下的UnityEngine.dll。

6.Microsoft Visual Studio使用15.5.4以上版本,否則Unity可能會加載不了Hotfix.dll。如果加載不了需要自行重新引用Hotfix.dll。

7.安裝VS2017、unity2017及以上版本后,按流程操作無誤,可能仍出現問題,可重啟計算機試試。

注:

1.在運行和打包時,關閉全局配置界面,避免出現報錯干擾。

2.Tool上ILRuntime的生成工具是為了給ILRuntime提速用,需先加上ILRuntime的宏再點擊上面的兩個按鈕,不然會報錯或者無法正常生成。

3.在2018中打包需要Api Compatibility Level選擇 .NET4.X庫,不然會報Bson的錯。

客戶端修改界面步驟:

調試方法:

1、unity設置標記輸入框里的ILRuntime宏刪除。

2、在VS里重新生成解決方案

3、工具菜單標記資源包在點PC生成資源包菜單

4、將Release文件夾下的PC文件夾替換掉主工程文件夾(LandlordsCore-master)文件夾下的PC文件夾

5、熱更時恢復unity宏標記設置

增加界面:

1.在Global/UI下添加需要增加界面(如:NewUI)的父物體(如:NewUIParent),在UI的ReferenceCollector上添加界面的父物體(NewUIParent)的引用。

2.需要增加的界面(NewUI)添加CanvasConfig並將CanvasName設置為需要增加界面的父物體(NewUIParent)的名字。

3.在UIType枚舉里面添加枚舉成員(如:BEnum)。

4.模仿UILoginFactory類新建一個UI***Factory類,在界面添加按鈕處調用打開方法:Hotfix.Scene.GetComponent<UIComponent>().Create(UIType.BEnum);

5.在新增加的界面(NewUI)做邏輯處理須模仿UILoginComponent類新建一個UI***Component類,在類中實現想要的效果;在新增加的界面(NewUI)的ReferenceCollector組件上需要的引用。

6.熱更時須打開unity設置標記輸入框里的ILRuntime宏,Hotfix工程添加ILRuntime宏(屬性—–>生成–>條件編譯符號處加上 ILRuntime,重新生成修改過的工程,如不添加宏會無法啟動。

7.點擊工具菜單Tools–>打包–>設置標記–>設置標記,再Tools–>打包–>PC生成資源,將Release文件夾下的PC文件夾替換掉主工程文件夾(LandlordsCore-master)文件夾下的PC文件夾。

熱更時,只能hotfix拓展Model中的類,model無法拓展hotfix中的類,熱更的拓展方法只能放在hotfix中,model中不能調用hotfix中的方法。

服務端(基於哲學棋牌Demo)

各服務器作用

注:按需將整個系統拆分成不同的進程。比如你需要一個單獨處理聊天的服務器進程,那么可以增加Chat進程。根據需求配置服務器功能。

1.Manager:連接客戶端的外網和連接內部服務器的內網,對服務器進程進行管理,自動檢測和啟動服務器進程。加載有內網組件NetInnerComponent,外網組件NetOuterComponent,服務器進程管理組件。自動啟動突然停止運行的服務器,保證此服務器管理的其它服務器崩潰后能及時自動啟動運行。

2.Realm:對ActorMessage消息進行管理(添加、移除、分發等),連接內網和外網,對內網服務器進程進行操作,隨機分配Gate服務器地址。加載有ActorMessage消息分發組件ActorMessageDispatherComponent,ActorManager消息管理組件ActorManagerComponent,內網組件NetInnerComponent,外網組件NetOuterComponent,服務器進程管理組件LocationProxyComponent,Gate服務器隨機分發組件。客戶端登錄時連接的第一個服務器,也可稱為登錄服務器。

3.Gate:對玩家進行管理,對ActorMessage消息進行管理(添加、移除、分發等),連接內網和外網,對內網服務器進程進行操作,隨機分配Gate服務器地址,對Actor消息進程進行管理,對玩家ID登錄后的Key進行管理。加載有玩家管理組件PlayerComponent,ActorMessage消息分發組件ActorMessageDispatherComponent,ActorManager消息管理組件ActorManagerComponent,內網組件NetInnerComponent,外網組件NetOuterComponent,服務器進程管理組件LocationProxyComponent,Actor消息管理組件ActorProxyComponent,管理登陸時聯網的Key組件GateSessionKeyComponent。對客戶端的登錄信息進行驗證和客戶端登錄后連接的服務器,登錄后通過此服務器進行消息互動,也可稱為驗證服務器。

4.Location:連接內網,服務器進程狀態集中管理(Actor消息IP管理服務器)。加載有內網組件NetInnerComponent,服務器消息處理狀態存儲組件LocationComponent。

5.Map:連接內網,對ActorMessage消息進行管理(添加、移除、分發等),對場景內現在活動物體存儲管理,對內網服務器進程進行操作,對Actor消息進程進行管理,對ActorMessage消息進行管理(添加、移除、分發等),服務器幀率管理。ActorMessage消息分發組件ActorMessageDispatherComponent,ActorManager消息管理組件ActorManagerComponent,內網組件NetInnerComponent,服務器進程管理組件LocationProxyComponent,服務器幀率管理組件ServerFrameComponent。

6.AllServer:將以上服務器功能集中合並成一個服務器。另外增加DB連接組件DBComponent,DB管理組件DBProxyComponent。

7.Benchmark:連接內網和測試服務器承受力。加載有內網組件NetInnerComponent,服務器承受力測試組件BenchmarkComponent。

 

數據庫(基於哲學紳士的ET棋牌Demo)

1_80BDG6[YMQV_YML}5@8BQ

數據庫組件

一、Hotfix

1.DBQueryBatchRequestHandler : AMRpcHandler<DBQueryBatchRequest, DBQueryBatchResponse>

批量加入數據庫緩存字典。

2.DBQueryJsonRequestHandler :  AMRpcHandler<DBQueryJsonRequest, DBQueryJsonResponse>

通過json批量加入數據庫緩存字典。

3.DBSaveRequestHandler : AMRpcHandler<DBSaveRequest, DBSaveResponse>

保存數據到數據庫。

4.DBSaveBatchRequestHandler : AMRpcHandler<DBSaveBatchRequest, DBSaveBatchResponse>

批量保存數據到數據庫。

5.DBQueryRequestHandler : AMRpcHandler<DBQueryRequest, DBQueryResponse>

數據添加到數據庫緩存字典。

二、Model

1.InnerMessage類中包含數據請求和數據回復相關的類。

(1)、數據請求類繼承ARequest,包含有DBQueryRequest緩存請求類、DBQueryBatchRequest批量緩存請求類、DBQueryJsonRequest用Json緩存請求類、DBSaveRequest數據保存請求類、DBSaveBatchRequest數據批量保存請求類。

(2)、數據回復類繼承AResponse,包含有DBQueryResponse緩存回復類、DBQueryBatchResponse批量緩存回復類、DBSaveResponse數據保存回復類、DBSaveBatchResponse數據批量保存回復類。

2.DBProxyComponent:用於進行數據緩存保存和保存到數據庫操作。

3.DBComponent:連接數據庫。

4.DBCacheComponent:數據庫緩存組件。

5.DBTask類的子類DBSaveTask執行數據保存、DBSaveBatchTask批量數據保存、DBQueryTask查詢數據庫保存至數據緩存字典、DBQueryBatchTask批量查詢數據庫保存至數據緩存字典、DBQueryJsonTask用Json查詢數據庫保存至數據緩存字典。

三、數據庫讀寫

(1)、原版ET數據庫讀寫

1.創建需要讀寫的類,繼承Entity。

T1TC`@ACG~F)Z@C_SH@$)FQ

2.讀寫數據,調用DBProxyComponent類中的方法查詢或者保存。

查詢方法有Query<T>(long id, bool needCache = true)按類名的ID查詢、QueryBatch<T>(List<long> ids, bool needCache = true)批量按類名的ID查詢、QueryJson<T>(string json, bool needCache = true)按類名用json進行自定義查詢。

原版ET數據庫讀寫2

保存方法有Save(Disposer disposer, bool needCache = true)按保存類中數據、SaveBatch(List<Disposer> disposers, bool needCache = true)批量保存類中數據、Save(Disposer disposer, bool needCache, CancellationToken cancellationToken)定時保存超時取消保存,保存時需要 EntityFactory.CreateWithId<AAA>(IdGenerater.GenerateId());實例化需要保存的類,AAA為需要保存的類名。

原版ET數據庫讀寫3

(2)、棋牌Demo數據庫讀寫

1.創建需要讀寫的類,繼承EntityDB。

原版ET數據庫讀寫4

2.EntityDB類上方添加標簽 [BsonKnownTypes(typeof(AAA))],AAA為需要讀寫的類名。

原版ET數據庫讀寫5

3.讀寫方法與原版ET相同。

 

ET添加修改消息

消息發送接收路線:例如消息發送路線:客戶端–>網關服務器–>內部功能服務器–>網關服務器–>客戶端,游戲啟動時通過標簽將協議碼為鍵、消息類為值存入字典,將消息請求類作為鍵、消息處理類作為值存入字典,將消息通過下文第四步中的Session類由AChannel類Send發送,通過TCP或UDP發送到目標網關服務器,網關服務器接收到消息由網關消息助手類處理發給內部功能服務器,內部功能服務器處理的消息處理類處理,通過消息回復類作為載體將消息回傳消息給網關服務器,網關服務器消息處理助手類中由消息回復類作為載體接收好數據被消息處理助手類回傳給客戶端,客戶端用相同的消息回復類接收回傳的數據進行使用。

服務器收發消息通過網關服務器gate進行,gate接收消息后根據情況將消息分發給其它服務器處理,其它服務器處理后消息回傳給gate,再由gate發給客戶端。

內部功能服務器實現分布式服務器功能:除Manager管理服務器和Location轉發Actor的服務器之外的服務器均作為路由服務器,ActorProxyComponent消息管理組件作為路由信息存儲組件存儲本服務器使用的消息ID和ActorProxy類處理Actor消息類(發送、接收等),先讀取路由信息存儲組件中的緩存,緩存沒有的情況下會由ActorProxy通過LocationProxyComponent服務器消息處理狀態存儲組件向Location轉發Actor消息IP對應的編號、管理服務器發送key(Actor消息ID),Location服務器通過LocationComponent處理其它服務器發送的Actor消息ID獲取消息的對應的IP,請求IP對應編號的服務器通過ActorProxyComponent或UnitGateComponent類讀取IP編號,然后通過IP編號能獲取到對應的IP和端口,從而發送消息給目標服務器。從Location服務器收到的Actor消息IP對應的服務器IP編號會存儲在本地服務器緩存。

群主熊貓解析:Actor其實非常非常簡單,別想的很復雜,一般分布式游戲服務器,跨進程發消息,比如A玩家在Map1,B玩家在Map2,A是B的好友,那么B並不知道A在哪個Map上,B玩家怎么給A玩家發消息呢?一般有個friend server,A可以在進入map1的時候把自己的位置注冊到friend server上,那么friend server就知道了A玩家的位置,B發消息就可以通過friend server來轉發消息給A。那么我們可以簡化一下這個過程,A玩家登錄進入Map1的時候把自己注冊到Location server,告訴location server自己在Map1上面,B要發消息給A,直接去查詢location server不就知道A在哪個map上了嗎,比如B查到A的位置在Map1上面,就可以直接發消息到map1,消息里面帶了一個actorid也就是A玩家的id,Map1收到這個消息發現這是一個IActorMessage,就會根據這個actorId找到A,把消息交給A處理。這就是actor位置透明的原理。 B發消息給A用的的ActorProxy,因為A一般在一個進程會呆比較長的時間,B沒必要每次都去查A的位置,第一次發送不知道A的位置,然后去location查了A的位置,之后B知道了A的位置就不用查了,直接發到Map1就行了。問題是萬一A不在Map1了,這時B發到Map1的消息根據A的id就會在Map1上找不到A。這時會返回一個not found actor的錯誤給B,B收到這個消息會重新去location server查A的位置,再重新發送。

此分布式服務器框架如果不夠用,瓶頸在於Location服務器的消息處理速度,可增加location服務器數量解決:在將Actor消息的ID與與所在服務器的IP對應編號作為消息傳給所有Location進行進行同ETDemo中Location服務器相同的處理,在處理Actor消息時,只需要向多個location服務器中的任意一個發送消息即可獲取到Action消息對應的IP編號。此方法瓶頸在於location服務器內能存儲的Action消息ID和IP編號的鍵值對個數。

此分布式服務器框架類似於即時通信服務器架構中的一種,Location服務器提供存儲和查詢目標消息服務器的IP服務:

分布式服務器

https://www.cnblogs.com/myd620/p/6081100.html  即時通信服務器架構

http://blog.csdn.net/u010738184/article/details/49472795

分布式系統 (大規模分布式系統原理解析和架構實踐)

https://www.cnblogs.com/liulun/p/3625941.html

分布式緩存服務器設計原理

 

物理分布式服務器發布
方法一:更改LandlordsCore-master\Config\StartConfig文件下的IP端口配置文件,將需要發布在物理服務器上的服務器編號對應的配置最后一項設置為 “ServerIP” : “*”  ,將不需要發布在此物理服務器上的服務器編號對應的配置最后一項設置為  “ServerIP” : “”  ,然后啟動服務器即可實現物理分布式部署(啟動LandlordsCore-master\netcoreapp2.0下的app.dll,可以使用bat批處理:dotnet App.dll –appId=AAA –appType=Manager –config=../Config/StartConfig/BBB,如dotnet App.dll –appId=1 –appType=Manager –config=../Config/StartConfig/LandlordsCore.txt)。
方法二:部署時,將需要部署的服務器的服務器IP位置處填上  *  號,在不需要部署的服務器IP處刪除*,保存,然后點擊啟動即可。
服務器部署
 

一、Actor消息

1.在協議碼類Opcode類添加協議碼。

Actor消息1

2.在OuterMessage文件中添加消息類。

如果需要序列化添加protobuf序列化標簽[ProtoContract]

注冊消息標簽[Message(Opcode.Frame_ClickMap)]

幀消息繼承幀同步抽象類AFrameMessage

添加protobuf屬性序列化標簽[ProtoMember(int a)],a為唯一

Actor消息2

3.添加消息實現類。

添加消息實現標簽[MessageHandler((int)Opcode.XX)],XX參數為對應的消息協議碼

繼承消息實現的抽象類AMHandler<BB>,BB參數為對應消息的消息類,需要序列化則添加protobuf相關標簽。此類為消息接收方接收到消息后處理消息的類。

Actor消息3

4.添加消息轉發組件

Actor消息4

5.發送消息

通過SessionComponent類中SessionComponent.Instance.Session調用Session中的方法發送消息。

Actor消息5

客戶端:

Actor消息6

服務端:

Actor消息7

Actor消息8

 

附:來自TIM的在線文檔”ET框架筆記”,點擊查看:
https://docs.qq.com/doc/BBHvys04uyFR11t2171PDPa34yGBCe2XqPFc3


免責聲明!

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



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