6.0大部分更新已经提交,具体修改请看Commit
///////以下内容属于早期聊天记录仅供参考///////
简单的说说ET6.0 beta(master)的设计。
目前还没到正式使用的程度, 先学习思路
- 之前每个功能是一个进程,比如realm gate location map,现在改成每个功能是一个Scene,一个Scene可以放到一个进程中。这样一台物理机先启动固定的进程,然后各个scene放到进程中运行。非常类似docker。
- 所有的Scene放在一个进程就变成了AllServer模式
- 服务器内部全部使用actor发送消息,比如realm发给gate,其实是发个actor消息到gate scene
- dbserver将取消,每个进程直连mongodb,使用异步调用存取数据
- 协程锁简化了很多实现,例如location队列,actor队列,mailbox消息队列,全部使用协程锁实现,代码非常精简。
- Scene可以开服前配置好在哪个进程(比如realm gate)也可以动态创建(比如副本,分线场景)。动态创建Scene回收Scene非常简单。
包括view层跟逻辑层完全分离,可以利用逻辑层代码写机器人。服务端分区支持,多个分区都能放到一个进程。
一个端就能完成任何测试,还能写机器人测试用例。这个解决大问题了,因为大家都知道游戏逻辑因为耦合非常严重,是很难写方法级别的单元测试,et6的这个设计可以非常方便的让大家写出协议级别的单元测试。并且一键开启上万个机器人来压测,把并发bug扼杀在摇篮里
你想想,开个客户端,同时点几下按钮就加了几个机器人,类似组队这种逻辑就可以一个人测试完成,是不是很爽啊
因为机器人会共享逻辑代码
6.0主要是更先进的allserver机制,机器人跟客户端共享逻辑代码,总之一句话,牛逼!
1. domain
domain就是指这个entity属于哪个scene,毕竟一个进程上可以容纳多个scene
domain还有个很重要的作用,就是设置domain的时候才会执行反序列化system,还有注册eventsystem
domain简单说是指属于哪个scene, 每个entity都有个domain字段,这样写逻辑方便能拿到自己scene上的数据
多进程多scene,具体scene放到那个进程完全取决于配制,全放到一个进程就是allserver了
如果是个很大的scene,需要容纳很多人,可能就需要单独占用一个进程,这样才能完全利用一个核
把每个scene都分配一个进程,就跟5.0差不多了
Ray:
et一开始就是多进程嘛..没毛病.不过现在是在进程内又开辟了相对独立的容器.熊猫能说说这么改的实际应用场景吗..什么实际需求促使了你做这个大刀阔斧的改动
熊猫:
@Ray 原因是很多动态副本跟分线的需求,现在可以16核机器起16个进程,然后动态分配副本跟分线到进程上.
比如很多单人副本,没必要一下子开很多进程来支持。需要的时候找一个负载低的进程动态创建一个就行了,用完就可以回收了
2. 客户端
客户端架构大改
客户端domain也有用,客户端也会存在多个scene。比如gamescene是永久存在的,再搞个scene挂在gamescene下面作为当前进入的场景,切换场景的时候删除这个scene再创建一个scene。
Justin沙特王子:
我还是期待ET6.0能把客户端层给删掉。。。
熊猫:
删掉客户端?等6.0出来就知道et双端威力了。机器人框架就是服务端跟客户端合成一个程序,机器人直接使用客户端代码跑在linux上.
还有测试用例框架,直接调用客户端代码发送消息给服务端,不双端怎么能做到?
熊猫 2021/3/11 22:42:56
前端的难度在渲染,而渲染是框架无法提供的东西
所以我以前一直不愿意给et前端增加功能,总觉得没啥必要,增加的只是些框架层面的小功能,可有可无
熊猫 2021/3/11 22:50:09
不过et6将有大升级,机器人,ai,测试用例,这些基本上跟前端关联很大。又是没人做过的东西。开源出来会很有价值。大大增加et前端的粘度,绝对让你老老实实用et前端。
没看到我开源机器人,等我开源机器人就知道前后端统一的优势了
我们机器人压测 99%的代码都是直接使用客户端代码。只需要写极少代码就能做出机器人
1%,你想想,机器人不就是一个没有ui的客户端啊,直接把客户端逻辑层共享起来放到服务端不就行了
客户端一个zonescene就是一个机器人。多创建几个就行了
3. entity&component
6.0把child集成到了entity,跟component并列,一个entity必须设置parent。这样删除一个entity能把他的所有组件跟children全部删掉
4. 客户端热更方案
总结:c#热更方案现在挺多了,大家灵活选用,ilruntime也行,csharp2lua也行,腾讯还有个什么tk lua,大家可以灵活选用。
et永远不会用lua这种垃圾语言 csharp.lua不是lua,做过大项目就知道动态类型语言的垃圾之处
Csharp.lua和ILRuntime
熊猫:
csharp.lua绝对牛逼。那些ifix啥的都只能临时用用
优点就是对c#语法完全兼容, c#跟csharp. lua的关系就好比ts跟js。怎么没人去质疑为啥要用ts呢?CSharp.lua对C#支持是完备的,不需要关心底层的lua,这就跟写C++不用关心汇编一样,除非性能有问题才会在C++中包一下汇编代码
ILRuntime跨域这个不是问题,是有些c#语法不完全支持, ilrt门槛也有点高,不过对于动手能力强的人来说,不是啥大问题。性能也是一个方面,纯计算lua比ilrt高,charp. lua性能不错,阿里巴巴用来做过fps手游,性能不是问题。
汇编也很恶心,问题是cpp都要编译成汇编,没关系啊,你又不需要写汇编,或者极少写。
js不恶心吗?现在有了ts,直接翻译成js,只写ts不香吗?
我准备集成csharp.lua到ET6.0里面, 毕竟ilrt学习成本有点大, ilrt库支持太麻烦了
6.0自己选用热更方案,先不集成了 目前ET的master分支去掉了ILRuntime,客户端没有热更。
熊猫 2020/12/2 15:32:58
我们顶多还有4个月就上线了,到时候我来整合charp. lua 延期! 鸽了~
傑 :
ILRuntime对C#部分都支持其实,就一些不常用的不行,比如beginInvoke,委托只能invoke,其他一律不行,volatile的似乎也不行,cs.lua好在不用学啥,你写啥就给你翻译成对应的lua。
5. 关于dots:
不知道为啥大家对dots这么感兴趣,首先dots是多线程的,意味着无序,这在做网游中使用限制就很大了,逻辑层基本上无法使用,因为不同端你不能逻辑处理不一样啊。那么仅仅能在表现层使用一下,那这些跟et关系就不大了,我这次抽出了view层,完全可以自己在view层想怎么做就怎么做了。什么都想用多线程,那是不可能的。