ET源码学习
Ha啤酒来大杯的
不会就问我,问了也不一定会
展开
-
ET6.0版本流程梳理(三)- 服务器客户端交互
这个篇文章是主要捋服务器的逻辑,并且这里将会捋一下客户端和服务端对于消息的交互同样是触发AppStart事件一样加载Excel表导出的byte文件,生成类实例。这里与客户端不同的地方在于。客户端利用ab包加载。服务器IO读取的然后调用StartProcessConfig的Get方法。StartProcessConfig类就是配置类,也就是上读取生成的Excel实例,这里StartProcessConfig有个端口号然后就是老几样TimerComponent、OpcodeTypeComponent原创 2021-07-08 14:39:01 · 1134 阅读 · 2 评论 -
ET源码学习(十五):ActorLocationSenderComponent
这个和ActorMessageSender很像也有些许不同首先和ActorMessageSender一样都需要每10秒进行一次Check这里发现是搜索当前孩子,然后判断是否超时,然后移除###然后是Call首先根据entityId找到组件下ActorLocationSender孩子实体,没有则会创建然后将消息序列化,并且拿到ActorLocationSender的InstanceId,启用协程锁调用CallInnerCallInner 代码比较长 分2个图片首先检测ActorLoc原创 2021-07-05 15:47:51 · 134 阅读 · 0 评论 -
ET源码学习(十四):LocationProxyComponent
LocationProxyComponent主要是调用ActorMessageSenderComponent来发发送特定的消息这里主要看Add、和AddLocationAdd利用ActorMessageSenderComponent发送ObjectAddRequest消息然后看看这个消息的处理方法ObjectAddRequestHandler可以看到只是将key和InstanceId存储在LocationComponent的一个字典中、这个里这个LocationComponent的存取都有协程原创 2021-07-05 15:01:28 · 124 阅读 · 0 评论 -
ET6.0版本客户端流程梳理(二)- 登陆及其他逻辑梳理
上篇梳理了游戏开始初始化相关操作,并且加载了UI到场景中并且放到了对应层级里面这里涉及与服务器的交互,这里只谈客户端的,服务器的初始化和接收等下次再说下面来看游戏登陆相关逻辑在进入Login界面点击登陆,此时都会集中到LoginHelper类中,下面来看Login干什么了在初始化文章中我们知道在客户端创建了一个KcpComponent,通过这个组件创建一个Session。利用这个Session发送C2R_Login消息。并等待返回R2C_Login,这里call结合之前看的应该很好理解,这里梳理原创 2021-07-05 14:07:20 · 616 阅读 · 0 评论 -
ET6.0版本客户端流程梳理(一)- 初始化
这篇不会细说各个类具体实现,感兴趣的可以自己看。主要是示例项目如何跑起来的,以及各功能流程启动首先将客户端的4个dll加入到EventSystem中,这里将会检查得到所有的标识了BaseAttribute的类,如消息,事件,实体逻辑系统等。通过触发AppStart事件,进入到AppStart_Init调用Run函数初始化在这里添加必要的组件,首先是TimerComponent和CoroutineLockComponent这2个在之前文章已经看过了。然后是资源组件,这个资源组件也就是加载ab原创 2021-07-02 10:18:56 · 1150 阅读 · 1 评论 -
ET源码学习(十二):ActorMessageDispatcherComponent
在学习InnerMessageDispatcher中对于IActorRequest和IActorMessage分发时利用了ActorMessageDispatcherComponent的RunMessage。这节来看ActorMessageDispatcherComponent组件先看属性,就一个字典Awake根据Attribute添加到字典中,分发消息,这个方法在InnerMessageDispatcher出现过...原创 2021-07-02 10:18:23 · 140 阅读 · 0 评论 -
ET源码学习(十三):CoroutineLock
在第八节消息分发时有下面这个代码可以看到下面代码中有一个叫做协程锁的组件,并且利用了using包裹起来了,这个就是协程锁。主要用途是确保只有一个协程对对象进行操作。具体可以参考烟雨大佬B站讲解(https://www.bilibili.com/video/BV12J411E7ik)下面来看一下协程锁如何实现的CoroutineLock继承IDisposable可以使用using并利用Dispose释放下面可以看到当CoroutineLock被释放时,将会利用携程锁组件进行通知Notify,目前不原创 2021-07-02 10:18:37 · 311 阅读 · 0 评论 -
ET源码学习(十一):ActorMessageSenderComponent
在学习这个源码前,先去看看ETBook上的Actor模型和Actor Location文章ETBook Actor笔记ET是单线程多进程架构,不需要重写一套Profiler工具,不需要考虑多台物理机问题,缺点是消息跨进程传输需要序列化及反序列化。多线程开发对于公共变量的访问需要加锁,会变得很难维护Actor模型是服务器消息通信机制和客户端是没有什么关系的。ET客户端使用这个Actor完全是因为Gate需要对客户端消息进行转发。在学习InnerMessageDispatcher中对于IActo原创 2021-07-02 10:12:26 · 196 阅读 · 0 评论 -
ET源码学习(十):NetThreadComponent
在学习NetInnerComponent时候,在Awake中,有NetThreadComponent类型的单例组件将自身的AService通过Add加入到一个Hashset中了,现在我们来看看NetInnerComponent一样先看属性Awake在非网络线程执行服务器的循环发送...原创 2021-07-01 17:48:27 · 191 阅读 · 0 评论 -
ET源码学习(九):Session
在InnerMessageDispatcher中对于普通的IResponse消息对消息进行了读取还有发送属性先看构造函数,没啥好说的然后看在Dispatcher中调用的OnRead方法根据IResponse的RpcId获得RpcInfo结构体,并设置其Tcs的结果Send 前2个Send只是将IMessage转化为Stream,然后通过最后的Send的服务器发送,根据之前学的知道服务器发送本质还是AChannel发送Call方法,创建RpcInfo,上面的Send方法接收参数是原创 2021-07-01 17:48:06 · 309 阅读 · 0 评论 -
ET源码学习(八):InnerMessageDispatcher
在学习NetInnerComponent时出现了InnerMessageDispatcher,这节先看InnerMessageDispatcher。这节涉及ActorMessageDispatcherComponent和Session。ActorMessageDispatcherComponent在这节基本所有方法都用过。在NetInnerComponent的OnRead中,调用了InnerMessageDispatcher的Dispatch方法InnerMessageDispatcher中只有Dis原创 2021-07-01 17:47:45 · 129 阅读 · 0 评论 -
ET源码学习(七):NetInnerComponent
看完TService和TChannel发送大部分调用是 由TService提供,然后看看其中AService中的委托和Send是由NetInnerComponent注册的先看属性,一个服务,一个IMessageDispatcher然后是Awake,new一个内网消息分发,然后将OnError,OnRead,OnAccept注册到服务回调中,最后加入NetThreadComponent中,这里出现了InnerMessageDispatcher和NetThreadComponent新出来的后面再看原创 2021-07-01 17:45:18 · 172 阅读 · 0 评论 -
ET源码学习(六):TChannel
上篇看完了TService现在看看其中出现的TChannel先看属性看看构造函数这里会发现有2个构造函数:1、一个传入的IP地址,此时将会设置isConnected = false。也就是未连接,所以调用ConnectAsync异步连接2、另一个传入socket,此时说明是已经连接的isConnected = true,然后直接开始收发,也就是StartRecv和StartSend连接先看ConnectAsync,和TService有点像,同步的话就直接执行,异步的由回调抛到主线程执原创 2021-07-01 17:44:47 · 359 阅读 · 0 评论 -
ET源码学习(五):TService
这里我看的顺序是TChannel,然后是TService。然后发现个人感觉先看TService好理解点现在不用管TChannel到底干什么了,只用先看个流程AService是TService基类,主要的函数就是下面几个,可以发现在接收和读取时调用的委托下面来看TService的异步接收接收完后,重新执行AcceptAsync,并根据socket创建TChannel并存储在idChannels中最后执行OnAccept,由AService可以知道这个就是一个委托并且TService还原创 2021-07-01 17:33:30 · 256 阅读 · 0 评论 -
ET源码学习(四):CircularBuffer
每行代码什么意思,都加上了注释。直接看图片就行了先看有什么属性然后Length这个缓存块内有多少字节数AddLast函数,内有缓存机制Read函数 这里只写了Stream的例子,里面还有读写byte[]的Read函数。实现基本 一样Write函数...原创 2021-07-01 17:32:54 · 168 阅读 · 0 评论 -
ET源码学习(三):Message系列IMHandler和MessageDispatcher
先看接口AMHandler继承自IMHandler拥有MessageHandler属性标签是个抽象方法下面是AMRpcHandler这个相比AMHandler方法,可以发现原来的Message变成了Request和Response 并且需要一个回调protected abstract ETTask Run(Session session, Request request, Response response, Action reply);MessageDispatcher有一个操作码和Lis原创 2021-07-01 17:31:57 · 627 阅读 · 0 评论 -
ET源码学习(二):Message系列-OpcodeTypeComponent
Message系列比较多可能会分好多节来看OpcodeTypeComponent是一个单例组件里面有很多的成员变量,直接看肯定不知道是什么,所以先看Awake方法中都添加了注释看完上面就知道下面变量的含义了 public class OpcodeTypeComponent: Entity { public static OpcodeTypeComponent Instance; 是外部Message(opcode>20000)且继承IActor原创 2021-07-01 17:31:29 · 377 阅读 · 0 评论 -
ET源码学习(一):TimerComponent
首先是个单例组件,这个组件在被AddComponent时将会执行Awake方法,,并且可以看到每帧都会执行Update方法然后看一下组件中有什么属性MultiMap是继承了SortedDictionary排序字典类(就是加入会自动排序)的类,并且有一个Empty用于返回没有元素的List下面是TimerComponent的Update方法及属性,图片都加上了个人理解的注释下面来看Run方法剩下的一些方法,zhexie最后的一些异步方法看下面之前需要吧ETTask或者C# asyn原创 2021-07-01 17:30:18 · 520 阅读 · 0 评论