本文讨论以下实现:

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 网络游戏架构底层深入分析相关推荐

  1. 【Unity学习笔记】b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别)

    [Unity学习笔记]b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别) 自己跟着学完了,写了不少代码,会放在CSDN代码库,因为老师并没有提供源码,录屏也不是完全连续,所以难 ...

  2. 揭秘 AWS 基础架构底层运维和构建之道!

    整理 | 夕颜 出品 | CSDN(ID:CSDNnews) 在去年的AWS re:Invent大会上,AWS全球基础架构和客户支持资深副总裁Peter DeSantis在主题演讲中分享了AWS基础网 ...

  3. 视频教程-Unity网络游戏架构设计-Unity3D

    Unity网络游戏架构设计 网名:海洋,CSDN社区讲师,3D游戏引擎开发者,IT讲师,计算机图形学方向研究生,曾在浙江大学CAD&CG;国家重点实验室学习.从事IT行业15年,主导或参与了1 ...

  4. 网络游戏架构与微服务架构简单对比

    笔者十年前做过网络游戏,当第一次看到微服务架构就发现它和网络游戏架构很像,如下图: 先来简单介绍一下这个网游架构,有些东西记不清了,如今的网游大牛看到可别丢砖头. 用户下载网游客户端,登录网游,首先会 ...

  5. 一、网络游戏架构的前世今生(1)

    本文中的部分资料内容源于前aws的同事. 第一章将按下述顺序进行展开 网络游戏架构的基本理解 网络演进 计算演进 数据库演进 存储演进 实际案例 总结 网络游戏架构的前世今生 1. 网络游戏架构与游戏 ...

  6. 一、网络游戏架构的前世今生——计算篇

    上文: 网络游戏架构的前世今生(2) 网络游戏架构的前世今生--计算篇 计算方案演进 游戏的分类 会话游戏的简单架构 分服.合服.全球同服 计算方案演进 游戏的分类 游戏的分类方式有很多种,从玩家容易 ...

  7. 网络游戏架构设计那些事

    一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块. 这里说的模块可以指一个进程,或者一个线程方式存在,本 ...

  8. Nacos集群CP架构底层Raft分布式一致性协议实现

    Nacos集群CP架构底层Raft协议实现 一.CAP定理 分区容错性 CP模式 AP模式 二.Raft算法 Leader Election 领导选举 Log Replication 日志复制 Rep ...

  9. 适用于独立游戏开发的Unity3D 网络游戏架构设计

    最近在GitChat上发布了一个网络游戏框架教程,目标是带领读者搭建一个商业游戏的网络架构设计,该架构设计是游戏的核心技术,将采用 Unity 2017.2 最新版本作为开发工具.内容分为 UI 架构 ...

最新文章

  1. Codeforces Round #632 (Div. 2) C和D和F
  2. PXE新手经典思路引导
  3. 一文了解c/c++、java、JavaScript、php、Python的用途
  4. 华为成为全球领先的移动设备供应商
  5. eclipse工具连接mysql_eclipse工具中使用Data Source Explorer连接数据库(MySQL)
  6. 鹅厂设计师是如何做设计的?
  7. 基于ASP.NET Core的模块化设计: 虚拟文件系统
  8. The user specified as a definer (#39;root#39;@#39;%#39;) does not exist
  9. 微课系列(四):Python中map对象的几种用法和注意事项
  10. linux 共享内存 信号量 同步
  11. linux avi 转mp4,LINUX下有没有像格式工厂一样的媒体转换软件?比如RMVB转AVI 转MP4...
  12. 【南方者】【考证】【软考】【系统规划与管理师】论文万能模板
  13. 《如何搭建小微企业风控模型》第三节 风控模型概览
  14. 《第一行代码 第二版》Android studio java开发学习笔记+源码
  15. java中把gui插入图片_在java中使用图片实现gui的美化.pdf
  16. 投资初创企业股权分配方法
  17. IC数字芯片学习各类公众号汇总
  18. nginx负载均衡两台服务器文件,Nginx之负载均衡 :两台服务器均衡(填坑)
  19. FE节点挂掉且重启报错sleepycat.je.LockTimeoutException: (JE 7.3.7) Lock expired
  20. 英国essay写作思路

热门文章

  1. spreadsheet属性方法事件
  2. 小米手机 miui 8.x开启开发者模式指导
  3. tsconfig之strict严格模式相关
  4. stored-program Computer/von Neumann Architecture 冯诺依曼体系结构
  5. python 串口示波器
  6. creo6.0安装教程
  7. 杰理之实现蓝牙三方通话功能【篇】
  8. 【NDN学习】NDN的定义,基础,解决什么问题
  9. 晚上失眠白天没精神,怎么把这种状态调整回来!
  10. PERL-5.26.1安装教程(LINUX系统)