diff --git a/Books/2-框架概览.md b/Books/2-框架概览.md index bace9642..5f99f965 100644 --- a/Books/2-框架概览.md +++ b/Books/2-框架概览.md @@ -48,6 +48,23 @@ public abstract class GameFrameworkModuleBase : MonoBehaviour } ``` +## 热更域程序集设计与说明 +``` +Assets/GameScripts +├── Editor 编辑器程序集 +├── HotFix 游戏热更程序集目录 [Folder] +| ├── GameBase 游戏基础框架程序集 [Dll] +| ├── GameProto 游戏配置协议程序集 [Dll] +| ├── BattleCore 游戏核心战斗程序集 [Dll] +| └── GameLogic 游戏业务逻辑程序集 [Dll] +| ├── GameApp.cs 热更主入口 +| └── GameApp_RegisterSystem.cs 热更主入口注册系统 +└── Runtime Runtime程序集 +``` +游戏内主要玩法逻辑包括UI会在GameLogic中编写,GameBase则存放一些通用性的逻辑,GameProto存放与服务区交互的协议以及配置表逻辑,BattleCore为帧同步分离的逻辑层做预留。若有项目需求完全可以进行自定义增删HotFix程序集。 + +PS:注意增删程序集后需要同步到HybridClr的Setting面板以及TEngineSetting的面板。 + ## 常用模块接口 [3-1-资源模块](./3-1-资源模块.md) diff --git a/Books/3-1-资源模块.md b/Books/3-1-资源模块.md index ced8a22d..2ec94d4e 100644 --- a/Books/3-1-资源模块.md +++ b/Books/3-1-资源模块.md @@ -8,9 +8,29 @@ Scene窗口Resource对象可以设置一些资源模块的常用设置,比如 Menu窗口TEngineSetting可以设置一些资源模块的热更新设置,比如资源服务器地址以及在线参数等。备注在Luban目录下有一个基于Node的静态文件服务器,可以把在线参数以及AB放入用于做热更新测试。 ![image](src/3-1-2.png) +## 重要拓展概念 +* AssetReference (资源引用标识) 通用加载资源的时候绑定一个引用标识使你无需关心手动Dispose资源句柄。 +* AssetGroup(资源组数据)进行资源分组绑定管理内存中的生命周期资源生命周期托管给资源组的根节点进行Dispose。 -常用接口 +* LruCacheTable (Least Recently Used Cache缓存表) + +* ArcCacheTable (Adaptive Replacement Cache缓存表) + +## 加载资源示范 +``` csharp +//同步加载。 +GameModule.Resource.LoadAsset(location); + +//异步加载。 +GameModule.Resource.LoadAssetAsync(location, OnLoadSuccess); +private void OnLoadSuccess(AssetOperationHandle assetOperationHandle){} + +//使用UniTask异步加载。 +await GameModule.Resource.LoadAssetAsync(location,CancellationToken.None); +``` + +## 常用接口 remark:资源模块初始化的生命周期已经在流程模块实现了,具体有需求可以自定义开发。 ``` csharp /// diff --git a/Books/3-2-事件模块.md b/Books/3-2-事件模块.md index e3a318d9..5261f9dc 100644 --- a/Books/3-2-事件模块.md +++ b/Books/3-2-事件模块.md @@ -1,9 +1,11 @@ ## 3-2.事件模块 - GameEvent -高效的事件系统GameEventMgr,可以指定事件ID/事件String监听和分发事件。通过事件来驱动模块,如战斗的角色身上的事件流、UI和网络以及Model的数据流、开发中的绝大部分情况都可以通过事件来进行驱动。(配合UI模块或者拓展的战斗模块实现MVE[Model - View - Event]事件驱动架构) +高效且无GC的事件系统GameEvent,可以指定事件ID/事件String监听和分发事件。通过事件来驱动模块,如战斗的角色身上的事件流、UI和网络以及Model的数据流、开发中的绝大部分情况都可以通过事件来进行驱动。(配合UI模块或者拓展的战斗模块实现MVE[Model - View - Event]事件驱动架构) -注:UI模块的事件和UI生命周期存在绑定,销毁UI时可以自动移除UI所监听的事件。(AddUIEvent) +事件模块支持string和int作为事件Id,但推荐是使用int因为可以避免事件字典的哈希碰撞。这里实现了StringId.StringToHash的方法来定义事件ID达到事件系统的最佳性能。 + +注:UI模块的事件和UI生命周期存在绑定,销毁UI时可以自动移除UI所监听的事件,开发过程中只需要关心添加事件,避免了关闭UI但没有移除事件监听的问题,角色模块也可以参考实现。(AddUIEvent) ``` csharp -public static int Hellp = StringId.StringToHash("Hellp.Hellp"); +public static readonly int Hellp = StringId.StringToHash("Hellp.Hellp"); class A { diff --git a/README.md b/README.md index 4d26ca5e..3e2d84ce 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,20 @@ ## 为什么要使用TEngine 0. 开箱即用5分钟即可上手整套开发流程,代码整洁,思路清晰,功能强大。高内聚低耦合。您可以很轻易的把您不需要的模块进行移除替换。 -1. 使用次世代的HybridClr进行热更新、强大的Luban配置表、百万DAU游戏验证过的YooAsset资源框架,全平台热更新流程已跑通。 -2. 严格按照商业化流程执行的热更新、商业化的UI开发流程、以及资源管理等等。 +1. 严格按照商业要求使用次世代的HybridClr进行热更新、强大的Luban配置表、百万DAU游戏验证过的YooAsset资源框架,全平台热更新流程已跑通。 +2. 严格按照商业化流程执行的热更新、商业化的UI开发流程、以及资源管理等等,设计并实现了YooAsset资源自动释放、支持LRU、ARC严格管理资源内存。 3. C#双端解决方案,服务器使用Fantasy,是一套源于ETServer但极为简洁,性能更强,更好上手的一套商业级服务器框架。 4. 已有项目使用TEngine上架Steam、Wechat-minigame、AppStore。 +## 资源重要拓展概念 +* AssetReference (资源引用标识) 通用加载资源的时候绑定一个引用标识使你无需关心手动Dispose资源句柄。 + +* AssetGroup(资源组数据)进行资源分组绑定管理内存中的生命周期资源生命周期托管给资源组的根节点进行Dispose。 + +* LruCacheTable (Least Recently Used Cache缓存表) + +* ArcCacheTable (Adaptive Replacement Cache缓存表) + ## 为什么服务器使用C# Net Core现在已经更新到了8.0的版本,在性能和设计上其实是远超JAVA和GO。在JAVAER还在为JVM更新和添加更多功能时,其实他们已经被国内大环境所包围了,看不到.Net Core的性能之强,组件化的结构。国内大环境是JAVA和GO的天下这个不可否认,但是国外C#也确实很多。其实.Net Core最大的问题是大多数自己人都不知道他的优点(AOT、JIT混合编译、热重载等等),甚至很多守旧派抵制core。GO喜欢吹性能,但其实目前来看,除了协程的轻量级,大多数性能测试其实不如JAVA和.Net。简单可以说出了C++的性能以外,Net Core其实都打得过。 当然作为商业级解决方案服务器的耦合度也极低,如果不喜欢您也可以很轻松直接移除替换成你的服务器。