【ET8】0.ET8入門-ET框架介紹

ET8?新特性

  1. 多線程多進程架構,架構更加靈活強大,多線程設計詳細內容請看多線程設計課程
  2. 抽象出纖程(Fiber)的概念,類似erlang的進程,非常輕松的創建多個纖程,利用多核,仍然是單線程開發的體驗
  3. 纖程調度: 主線程,線程池,每個纖程一個線程,3種調度方式
  4. Fiber間通信的Actor消息機制
  5. Entity方面,domain改成IScene,只要實現IScene接口,Entity就是domain,這樣定義domain更加自由
  6. 預測回滾的幀同步實現 想詳細了解可以看幀同步課程
  7. protobuf換成了memorypack,實現無gc的網絡
  8. 純C#版的kcp庫,性能非常強,由sj提交
  9. 熱更dll改成用ide編譯,更加方便
  10. sj利用source generater實現了代碼自動模板功能,目前可以自動生成System類,開發者只需要定義Awake Update靜態方法即可,特別方便
  11. sj開發了分析器,實現了EntitySystemOf,根據entity接口一鍵生成對應的system方法
  12. 客戶端利用fiber實現網絡獨立線程(demo已實現),甚至可以把邏輯跟表現使用獨立的纖程,更好的利用多核
  13. 幀同步demo直接利用纖程創建房間,更加方便
  14. 純c#版尋路dotrecast,至此ET已經完全C#化,沒有任何cpp代碼了
  15. kcp跟軟路由底層同時支持tcp跟websocket,當udp聯不通的情況下,可以切換成tcp Websocket,并且支持運行時動態切換,玩家不掉線!
  16. 集成了sj的非托管容器庫,性能爆炸

用ET的17個理由

  1. 多進程多線程Actor架構,客戶端跟服務端都可以輕松創建纖程(fiber)利用多核,比如客戶端網絡一個纖程,尋路一個纖程,幀同步邏輯層一個纖程,表現層一個纖程
  2. async await協程同步代碼編寫,避免回調地獄
  3. 0GC消耗,超強的MemoryPack序列化, 超強的網絡層性能
  4. kcp支持,網絡響應非常迅速,并且閃斷wifi 4g都不會導致掉線,做競技游戲必備
  5. kcp底層可以使用tcp udp Websocket協議,當udp聯不通的情況下,可以切換成tcp Websocket,并且支持運行時動態切換,玩家不掉線!
  6. 軟路由防攻擊設計,買些垃圾主機就可以防住黑客攻擊,比買高防省錢多了,并且用戶不會掉線
  7. 雙端C#開發,前后端共享代碼,C#本身性能極強,僅次于CPP,不需要學一些亂起八糟的語言,很多獨立游戲開發者,一個人就能用ET開發mmorpg游戲
  8. 強大的編譯分析器,編譯器就能幫助大家寫出正確的ET風格的代碼
  9. 客戶端hybridclr熱更新支持
  10. 客戶端服務端均支持運行時熱重載,客戶端服務端不需要關閉進程就能修改代碼,大大提升了開發效率以及運營效率
  11. 完善的demo,源碼帶有狀態同步跟預測回滾的幀同步demo
  12. 完善的機器人開發機制,機器人直接共享客戶端邏輯代碼,減少95%機器人開發工作量,接入ai機器人非常輕松。大規模機器人壓測,輕而易舉
  13. 強大的ai開發機制,比行為樹更加容易
  14. 強大的單元測試開發機制,每個單元測試都是整個游戲環境,不用搞mock隔離,開發起來非常輕松
  15. 優美的程序結構,數據跟方法完全分離
  16. all in one的開發體驗,開發時只需要啟動unity,發布的時候又可以單獨發布服務端,并且可以跨windows跟linux平臺
  17. 客戶端服務端數據開發期完全可視化,開啟ENABLE_VIEW宏即可在Unity Hierarchy面板中看到客戶端跟服務端的所有的Entity對象以及字段的內容
  18. 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框架是一個強大靈活的分布式服務端架構,完全可以滿足絕大部分大型游戲需求。使用這套框架,客戶端開發者就可以自己完成雙端開發,節省大量人力物力,節省大量溝通時間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206682.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

首次面試經歷(忘指導)當我在簡歷上寫了蒼穹外賣,瑞吉外賣時……

&#x1f308;鍵盤敲爛&#xff0c;年薪30萬&#x1f308; 個人簡介: 大三在校生&#xff0c;二本院校&#xff0c;專業&#xff1a;信息管理與信息系統 面試崗位&#xff1a; java開發實習生 投”簡歷“ 臨近大三寒假&#xff0c;很早就有實習想法的我&#xff0c;對12月做…

一篇文章了解JDK的前世今生

我們每天都在開發Java,每天都在使用JDK,那么我們了解JDK的發展史嗎,這篇文章將帶你深入了解JDK的發展史。 JDK(Java Development Kit)是Java開發者工具包,是用于編寫Java程序和運行Java程序的軟件開發工具集。自從1995年Java語言首次發布以來,JDK已經經歷了數十年的發展…

python打開相機,用鼠標左鍵框選矩形區域,支持一次框選多個矩形區域,通過鼠標右標清除上一次畫的矩形。

方案一 import cv2# Global variables rectangles [] current_rectangle [] drawing False# Mouse callback function def mouse_callback(event, x, y, flags, param):global rectangles, current_rectangle, drawingif event cv2.EVENT_LBUTTONDOWN:drawing Truecurren…

C語言——常用庫函數

C語言——常用庫函數 memcmp int my_memcmp(char* str1,char* str2,int num) {while(num--){if(*str1>*str2){return 1;}else if(*str1<*str2){return -1;}else{str1;str2;}}return 0; }memcpy void* my_memcpy(void *str1,void *str2,int size) {int *p1str1;int *p2…

Linux數據庫Mysql增刪改查

從安裝數據庫到增刪改查 apt install mariadb-serverUndefined 安裝好后初始化 mysql_secure_installationUndefined 查 查詢現有的庫 show databases;SQL 進入庫 use mysql;Perl 查詢表 show tables;SQL 查詢表結構 desc mysql;SQL 查詢表內容 select * from my…

深度學習TensorFlow2基礎知識學習后半部分

介紹幾個重要操作&#xff1a; 1.范數 a tf.fill([1,2], value2.) b tf.norm(a)# 二范數#第二種計算方法 # 計算驗證 a tf.square(a) log("a的平方:", a) a tf.reduce_sum(a) log("a平方后的和:", a) b tf.sqrt(a) log("a平方和后開根號:"…

NVIDIA與 Sparkfun 的合作伙伴在 Hackster.io 上發起了人工智能創新挑戰賽,喊你來參加!

NVIDIA與 Sparkfun 的合作伙伴在 Hackster.io 上發起了人工智能創新挑戰賽&#xff0c;喊你來參加&#xff01; 本次競賽的目標旨在吸引開發者社區在 NVIDIA Jetson Orin 平臺上為邊緣構建生成式 AI 應用程序和模型&#xff0c;希望通過本次比賽提高人們對新 Jetson 生成式 AI…

Python微信公眾號批量發布文章問題記錄,調用api接口發草稿箱編碼有問題

1、accesstoken獲取方法 def get_access_token():url https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid{}&secret{}.format(*****************, ***********)response requests.get(url)res_html response.json()access_token res_ht…

四元數,歐拉角,旋轉矩陣,旋轉向量

四元數&#xff0c;旋轉矩陣&#xff0c;旋轉向量&#xff0c;歐拉角 一、歐拉角 1、歐拉角是表達旋轉的最簡單的一種方式&#xff0c;形式上它是一個三維向量&#xff0c;其值分別代表物體繞坐標系三個軸(x,y,z軸&#xff09;的旋轉角度&#xff0c;默認旋轉正向為逆坐標軸逆…

C#winform上下班打卡系統Demo

C# winform上下班打卡系統Demo 系統效果如圖所示 7個label控件(lblUsername、lblLoggedInEmployeeId、lab_IP、lblCheckOutTime、lblCheckInTime、lab_starttime、lab_endtime)、3個按鈕、1個dataGridView控件、2個groupBox控件 C#代碼實現 using System; using System.Dat…

Java零基礎——Elasticsearch篇

1.Elasticsearch簡介 Elasticsearch是一個基于Lucene的一個開源的分布式、RESTful 風格的搜索和數據分析引擎。Elasticsearch是用Java語言開發的&#xff0c;并作為Apache許可條款下的開放源碼發布&#xff0c;是一種流行的企業級搜索引擎。Elasticsearch用于云計算中&#xf…

【Ambari】Python調用Rest API 獲取YARN HA狀態信息并發送釘釘告警

&#x1f984; 個人主頁——&#x1f390;開著拖拉機回家_Linux,大數據運維-CSDN博客 &#x1f390;?&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

二層交換原理

二層交換設備工作在OSI模型的第二層&#xff0c;即數據鏈路層&#xff0c;它對數據包的轉發是建立在MAC&#xff08;Media Access Control &#xff09;地址基礎之上的。二層交換設備不同的接口發送和接收數據獨立&#xff0c;各接口屬于不同的沖突域&#xff0c;因此有效地隔離…

【C/PTA —— 15.結構體2(課內實踐)】

C/PTA —— 15.結構體2&#xff08;課內實踐&#xff09; 7-1 計算職工工資7-2 計算平均成績7-3 找出總分最高的學生7-4 通訊錄的錄入與顯示 7-1 計算職工工資 #include<stdio.h> #include<stdlib.h> typedef struct GZ {char name[6];double j;double f;double z;…

記一次由 jedis 引發的離譜選學問題

背景 我的應用中&#xff0c;使用 jedis 作為連接 redis 的客戶端&#xff0c;一直在用的好好的&#xff0c;后來有一個新的組件&#xff0c;也需要使用 redis&#xff0c;但是組件是內部封裝的&#xff0c;我只能提供一個 StringReidsTempalte&#xff0c;所以我基于應用本身…

Java 多線程之 LockSupport (阻塞和喚醒線程)

文章目錄 一、概述二、使用方法三、測試示例1四、測試示例2 一、概述 LockSupport 是Java并發包中的一個工具類&#xff0c;用于線程的阻塞和喚醒。它提供了一種基于線程的許可&#xff08;permit&#xff09;的方式來實現線程的阻塞和喚醒&#xff0c;而不需要顯式地使用鎖。例…

【無線網絡技術】——無線廣域網(學習筆記)

&#x1f4d6; 前言&#xff1a;無線廣域網(WWAN)是指覆蓋全國或全球范圍內的無線網絡&#xff0c;提供更大范圍內的無線接入&#xff0c;與無線個域網、無線局域網和無線城域網相比&#xff0c;它更加強調的是快速移動性。典型的無線廣域網&#xff1a;蜂窩移動通信系統和衛星…

Linux UUCP命令教程:如何在Linux系統中進行文件復制(附實例詳解和注意事項)

Linux UUCP命令介紹 UUCP&#xff08;Unix-to-Unix Copy&#xff09;是一套允許遠程執行命令和傳輸文件的程序。UUCP命令是該套件中的一個程序&#xff0c;它為請求文件復制操作提供了用戶界面。UUCP套件還包括uux&#xff08;遠程命令執行的用戶界面&#xff09;、uucico&…

Java期末復習題之抽象類、接口

點擊返回標題->23年Java期末復習-CSDN博客 第1題. 首先設計一個學生抽象類Student&#xff0c;其數據成員有name(姓名)、age(年齡)和degree(學位)&#xff0c;以及一個抽象方法show()。然后由Student類派生出本科生類Undergraduate和研究生類Graduate&#xff0c;本科生類Un…

js moment計算當前時間到24:00:00的剩余時間

2023.12.7今天我學習了如何計算當前的時間到24:00:00剩下的時間&#xff0c;https://momentjs.cn/ const now moment(); // 獲取當前時間const endOfDay moment().endOf(day); // 設置當天的 23:59:59const duration moment.duration(endOfDay.diff(now)); // 計算剩余時間的…