egametang框架服务端运行流程

et框架的构建块主要由entity和componet组成,类似unity的组件。一个Entity可以挂载多个不同Component。Entity和Component的共同基类Disposer用于提供对象池和事件机制。所有Disposer的派生类都可以从对象池中获取。
entity的构造函数会调用IdGenerator类来根据服务器id当前时间以及一个自增计数组合出一个唯一的id。对象池Fetch对象的时候也会用这个IdGenerator生成新的唯一Id。通常使用EntityFactory.Create方法创建Entity实例,这样会先从对象池获取,随后注册到全局事件管理器ObjectEvents。
Disposer创建时会被注册进单例的ObjectEvents,如果它实现了ILoad,IUpdate,IStart,就会注册进相应的列表,在ObjectEvents启动,更新或者载入的时候触发对应的事件处理方法(此方法在接口中定义)。
Disposer实现了IDisposable,在使用using或者手动调用Dispose之后会被对象池回收。
et框架的服务端启动项目是app.proj 里面只有一个带main的program类型。et自定义了一个OneThreadSynchronizationContext,在有异步回调到来的时候保存delegate和参数到一个多线安全的队列,然后在后面的主循环中调用update,在主线程中取出本次主循环产生的所有异步回调,从而保证了所有的回调函数都被捕捉到单一主线程执行。在主线程中多用await和async既符合顺序的思考习惯,避免了很多的回调定义分散在多个函数中,又可以在等待某一异步操作完成时自动将执行权交给调用函数的后续代码,避免了单线程主线挂起而永远等不到回调完成的问题。单线程的架构既避免了各种多线编程的复杂性和问题陷阱,又可以在组织服务器集群时根据服务器cpu支持的线程数合理启动数量相当的进程来充分发挥服务器计算能力,避免了过多线程造成的上下文切换开销,有利于总体性能的提高。
et框架的启动项目是App.proj,其中只有一个Program类,类中包含入口函数Main。
启动之后首先注册Model程序集中提供的各种基础模型类,随后加载Hotfix中可以热更新的类型并且注册到ObjectEvents。一方面是提供IAwake ILoad IUpdate接口中的事件处理,一方面检索各类Attribute并且注册到相应容器中以便后续查找。
Game.Scene是很重要的单例实体,其上的component代表了服务端进程能提供的基础功能集合。
OptionComponent和StartConfigComponent用来读取unity中设定的服务器集群配置,给后续的启动步骤留下依据。
后续OpcodeTypeComponent和MessageDispatherComponent提供服务端进程相应网络消息回调的功能,这个所有种类的服务端进程都需要。
随后是根据本身的appid添加自身需要的Component。这些具体的组件后续的文章会继续介绍。最后是进入服务端主循环:每此循环休息1ms防止CPU占用过高;处理发生的异步回调;处理各种IDisposer的update事件。
服务端的设计思路和基本运行流程就到这里,后续会再介绍框架的其他方面。
参考资料:
搞懂SynchronizationContext:http://www.cnblogs.com/lzxianren/p/SynchronizationContext.html
作者:fancybit
qq:148332727
egametang框架服务端运行流程的更多相关文章
- Rsync服务端部署流程
Rsync服务端部署流程 Rsync服务端部署流程: 一.rsync服务端配置流程 配置rsync配置文件/etc/rsyncd.conf 创建同步的本地目录/dingjian 并根据需要 ...
- cas 服务端认证流程
CAS服务端流程分析 'CAS单点登录服务器端的登录流程' -----流程的配置在/WEB-INF/login-webflow.xml文件中 <var name="credential ...
- react+redux教程(六)redux服务端渲染流程
今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...
- PyV8在服务端运行自动崩溃问题
近来想在服务端架设WSGI + PyV8去自动解析JavaScript代码,然后返回解析后的数据给客户端.但是发现,在nginx配置后,客户端一请求,服务端的python脚本自动崩溃. 见代码: de ...
- Netty服务端创建流程及组件职责
public class NettyServer { public static void main(String[] args) throws InterruptedException { NioE ...
- springMVC框架介绍以及运行流程(图解)
1 Springmvc是什么? spring web mvc和struts2都属于表现层的框架,spring web mvc是spring框架的一部分(所以spring mvc与spring之间不需要 ...
- HTTPS 客户端验证 服务端证书流程
网上的文章很多, 但是对摘要的验证流程不够通俗易懂. QQ截图20160420114804.png 证书预置和申请 1:客户端浏览器会预置根证书, 里面包含CA公钥2:服务器去CA申请一个证书3: C ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
随机推荐
- 与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件
与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件 CMDNMapDataCache.cpp 读取二进制代码的方法
- HTML <select>标签
1.简单的下拉列表 <html> <body> <form> 名: <select name="firstname"> <op ...
- nodejs http小爬虫
本课程用nodejs写一个http小爬虫,首先科普一下,爬虫就是把网上的网页代码给弄下来,然后纳为己用.目前最大的爬虫:百度快照等的. 下面直接上代码 示例一: var http = require( ...
- poweshell批量删除某类型文件
错误方法 rm *.o" -recurse 按照提示,rm(remove-item)是可以递归删除子文件夹的.但是这个方法确实无效.在他们的示例里面找到说明: --------------- ...
- 让我们一起爱(装)上Homestead吧
本文是Laravel实战:任务管理系统(一)的扩展阅读原文链接 先来点残酷现实: 真正用过homestead的,一般不会问homestead到底好在哪里 如果你还没有爱上homestead,只能说明 ...
- python3 第十四章 - 数据类型之Dictionary(字典)
在python中字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下 ...
- git log 查看指定文件的提交记录
使用git log除了可以看整个仓库的提交记录外,还可以指定某个文件的提交记录. 1. 查看指定文件的历史提交记录 命令: git log -- <file> 说明:只需要指定文件名称. ...
- XML,HTML,XHTML
对于上面3种技术,我们经常使用到,这里具体的做一个总结,来对比一下这3个东西. 什么是XML? XML即Extentsible Markup Language(可扩展标记语言),是用来定义其它语言的一 ...
- android CheckBox与监听
<CheckBox android:id="@+id/cb1" android:layout_width="fill_parent" android ...
- Request和Response
1 简介 web服务器收到客户端的http请求,会针对每一个请求,分别创建一个用于代表请求的request对象和代表响应的response对象. request和response对象既然代表请求和响应 ...