tnl 网络游戏架构底层深入分析
本文讨论以下实现:
NetConnection <--> NetObject
NetConnection <--> NetEvent
remote create
昨天分析出来了tnl架构是如何实现远程对象实现以及传递的,现在把分析的过程帖到这里.
这里分析了从Interface (封装udp socket), NetConnection(在无连接的udp上维持点点的连接状态,
客户端服务端单单对应)以及其子类, Netevent以及其子类NetObject(被相应的connection序列化de序列化的类)
这里头关键是在声明类的时候就声明一系列的宏使得tnl系统能在客户端维持一个列表将远端来的packet de序列化成相应的对象
用id标示然后放在全局表里,再调用用户函数的callback执行业务逻辑,相应的类注册机制,其实很简洁优秀,据介绍在torque的其他部分也使用了.
void EventConnection::readPacket(BitStream *bstream)
U32 classId = bstream->readInt(mEventClassBitSize);
if(classId >= mEventClassCount)
{
setLastError("Invalid packet.");
return;
}
NetEvent *evt = (NetEvent *) Object::create(getNetClassGroup(), NetClassTypeEvent, classId);
在这里根据classID来创建object的
因为所有的包都是packet,所以还是得从各个readPacket里来找。
1.netInterface->checkIncomingPacket()
2.conn->readRawPacket()
3.在readRawPacket()里有EventConnection::readPacket()
4.在这个readPacket里有new Object(),
unpack(),processEvent()...
onGhostRemove
onGhostAdd
都在ghostConnection::readPacket里。。。
readPacket啊,你咋就这么nb呢,啥都干了。。
tnl也是分三层的
继承 connectionRequest()是在 connection建立的时候被 callback 的
直接做 packet也就是这里了
然后
其实也就是两层。。netevent 和 netobject 啊
都是要
remote create的
This id-based instantiation allows objects subclassed from NetEvent and NetObject to be serialized into data packets, transmitted, constructed on a remote host and deserialized.
archoverview其实写的很清楚
然后 callback 应用层来
得到其指针
所以就的有个safepointer
因为生成 对象和 注销对象不是同一个 人(系统)做的
当然你要是不实现callback 那就直接 消耗在那里了
// iterate through the ghost always objects and InScope them...
// also post em all to the other side.
void GhostConnection::writePacket(BitStream *bstream, PacketNotify *pnotify)
正如在 read packet里把 ghost 了的unpacket一样在
writepacket里把 ghost了的写进去。。
void GhostConnection::objectInScope(NetObject *obj)
{
实际上。。是把 object的指针加到自己的 connection所有的 object列表里的
// check if it's already in scope
// the object may have been cleared out without the lookupTable being cleared
// so validate that the object pointers are the same.
这里是说明一下先
发送的时候
当轮巡到这个 object的时候检查
其 update 的mask 在 packupdate里的
(程序员自己设置)有这个mask就发送
到对方的时候就unpacket
还是有一个关于event的继承的。。。现在发现其做法跟netobject应该是一样的
只不过他们适合不同的场合。
不是说裸到直接干 writepacket
一个表状态,一个事件
因为实际上 netobject就是 eventobject的 子类啊
有了 ghost的功能
而这个功能。。当然也是 connection 所有的
所以其实 connection跟 object 是紧密不可分割
值得注意的是
实际上 ghostobject 也是可以rpc 的
但是 现在我不是太清楚这个 rpc 是只是穿给对应的
connection 还是在所有connection 间一次就传递过去了
Normally a RPC method marked as
// RPCToGhost will be broadcast to ALL ghosts of the object currently in
// scope.
果然是 给全部的
不是单单在一个 connection 范畴的
这样还扩展了 rpc
如你所知 rpc 是单对单的
这对于广播事件很方便。
游戏里有很多广播事件。
不适合用状态来做。
void Player::onGhostAvailable(TNL::GhostConnection *theConnection)
{
// this function is called every time a ghost of this object is known
// to be available on a given client.
// we'll use this to demonstrate targeting a NetObject RPC
// to a specific connection. Normally a RPC method marked as
// RPCToGhost will be broadcast to ALL ghosts of the object currently in
// scope.
// first we construct an event that will represent the RPC call...
// the RPC macros create a RPCNAME_construct function that returns
// a NetEvent that encapsulates the RPC.
TNL::NetEvent *theRPCEvent = TNL_RPC_CONSTRUCT_NETEVENT(this, rpcPlayerIsInScope, (renderPos.x, renderPos.y));
// then we can just post the event to whatever connections we want to have
// receive the message.
// In the case of NetObject RPCs, if the source object is not ghosted,
// the RPC will just be silently dropped.
theConnection->postNetEvent(theRPCEvent);
}
其实所谓的广播。。也就是 callback 的for 循环
因为就是一个 netevent 发到所有的
连接上的 ghostconnection 。。
而要自己使用的话。。就是 从
gConnection 列表里一个 for 循环
省去了应用层的遍历了。
这个函数 是 非静态的
只有 ghost了 这个对象的connection 才会真正发送这个netevent
从而实现filter 和广播
即 自己用的话
for 循环还是要写的
theConnection->postNetEvent(theRPCEvent);其实就是
eventconnection 的接口啊
要是一般的程序员就只能用 很麻烦而消耗很大的真正的
corba 机制做
那真是没有理解 corba机制。。
tnl的某些对象注册和动态生成的机制估计在torque engine里也有用到。。
游戏里很多单体和static 要不没办法通信了。
tnl 网络游戏架构底层深入分析相关推荐
- 【Unity学习笔记】b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别)
[Unity学习笔记]b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别) 自己跟着学完了,写了不少代码,会放在CSDN代码库,因为老师并没有提供源码,录屏也不是完全连续,所以难 ...
- 揭秘 AWS 基础架构底层运维和构建之道!
整理 | 夕颜 出品 | CSDN(ID:CSDNnews) 在去年的AWS re:Invent大会上,AWS全球基础架构和客户支持资深副总裁Peter DeSantis在主题演讲中分享了AWS基础网 ...
- 视频教程-Unity网络游戏架构设计-Unity3D
Unity网络游戏架构设计 网名:海洋,CSDN社区讲师,3D游戏引擎开发者,IT讲师,计算机图形学方向研究生,曾在浙江大学CAD&CG;国家重点实验室学习.从事IT行业15年,主导或参与了1 ...
- 网络游戏架构与微服务架构简单对比
笔者十年前做过网络游戏,当第一次看到微服务架构就发现它和网络游戏架构很像,如下图: 先来简单介绍一下这个网游架构,有些东西记不清了,如今的网游大牛看到可别丢砖头. 用户下载网游客户端,登录网游,首先会 ...
- 一、网络游戏架构的前世今生(1)
本文中的部分资料内容源于前aws的同事. 第一章将按下述顺序进行展开 网络游戏架构的基本理解 网络演进 计算演进 数据库演进 存储演进 实际案例 总结 网络游戏架构的前世今生 1. 网络游戏架构与游戏 ...
- 一、网络游戏架构的前世今生——计算篇
上文: 网络游戏架构的前世今生(2) 网络游戏架构的前世今生--计算篇 计算方案演进 游戏的分类 会话游戏的简单架构 分服.合服.全球同服 计算方案演进 游戏的分类 游戏的分类方式有很多种,从玩家容易 ...
- 网络游戏架构设计那些事
一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块. 这里说的模块可以指一个进程,或者一个线程方式存在,本 ...
- Nacos集群CP架构底层Raft分布式一致性协议实现
Nacos集群CP架构底层Raft协议实现 一.CAP定理 分区容错性 CP模式 AP模式 二.Raft算法 Leader Election 领导选举 Log Replication 日志复制 Rep ...
- 适用于独立游戏开发的Unity3D 网络游戏架构设计
最近在GitChat上发布了一个网络游戏框架教程,目标是带领读者搭建一个商业游戏的网络架构设计,该架构设计是游戏的核心技术,将采用 Unity 2017.2 最新版本作为开发工具.内容分为 UI 架构 ...
最新文章
- Codeforces Round #632 (Div. 2) C和D和F
- PXE新手经典思路引导
- 一文了解c/c++、java、JavaScript、php、Python的用途
- 华为成为全球领先的移动设备供应商
- eclipse工具连接mysql_eclipse工具中使用Data Source Explorer连接数据库(MySQL)
- 鹅厂设计师是如何做设计的?
- 基于ASP.NET Core的模块化设计: 虚拟文件系统
- The user specified as a definer (#39;root#39;@#39;%#39;) does not exist
- 微课系列(四):Python中map对象的几种用法和注意事项
- linux 共享内存 信号量 同步
- linux avi 转mp4,LINUX下有没有像格式工厂一样的媒体转换软件?比如RMVB转AVI 转MP4...
- 【南方者】【考证】【软考】【系统规划与管理师】论文万能模板
- 《如何搭建小微企业风控模型》第三节 风控模型概览
- 《第一行代码 第二版》Android studio java开发学习笔记+源码
- java中把gui插入图片_在java中使用图片实现gui的美化.pdf
- 投资初创企业股权分配方法
- IC数字芯片学习各类公众号汇总
- nginx负载均衡两台服务器文件,Nginx之负载均衡 :两台服务器均衡(填坑)
- FE节点挂掉且重启报错sleepycat.je.LockTimeoutException: (JE 7.3.7) Lock expired
- 英国essay写作思路