当前课程知识点:游戏程序设计 >  第十四章 《分布式系统设计 》 >  14.2 进程间通信(下) >  14.2 进程间通信(下)

返回《游戏程序设计》慕课在线视频课程列表

14.2 进程间通信(下)在线视频

下一节:14.3 通信格式

返回《游戏程序设计》慕课在线视频列表

14.2 进程间通信(下)课程教案、知识点、字幕

这里简单的我们先列一下大纲

就会有几个方面

我们必须要考虑

第一个问题就是说

进程间的通信

和通信的格式

并发模型和超时处理

这四部分

这是我们这部分的一个重点

进程通信

什么叫进程通信

在我们前面提到就说分布式网络的一个核心组件

就是它会有

一些软件的一个组件来进行配合

通过网络进行通信来配合和协作完成任务

那么

这就是各个节点上面部署的软件组件

那么如果

从程序的角度来讲

它就是一个个的一个独立的进程

这个进程的话

它就是我们平常所说的服务器程序

那么这些程序之间

它需要有自己的一个通讯方式

拿一个那个生活中的例子举个例子

生活中的例子来看的话就是我们

生活中的一个

所谓写信

当然现在现在的话

我们大家都已经习惯于通过

手机

通过E-mail通过电话来进行沟通

那么再往前20年的话

甚至到可能到父辈

那个时候大家还没有什么手机

通讯的时候基本上大家可能

通信就靠写信或者是电报

那么假如说我们再回到当时那个场景

我们现在要去

写一封信给某个人的话

那我们会有很多东西

很多种维度的一些选择

第一个维度就说我们的信怎么送出去

这是一个问题

可以选自己送吧

我知道这个我送给谁

她的地址在哪

我可以自己送过去

第二种的是我交给邮局

让邮局的网络区域帮我们送

寄送这封信

那么这封信很关键的信息什么

像接收方的地址

我们必须要有谁来接收

接收方的地址是哪里

同时我们还要有发送方的地址

因为方便

别人收到信之后要给我们回信

还有就是这封信我们如何包装

我们是直接把信纸直接就送过去

还是说我们放在信封里面

还是说我们拿本书夹它一下

对吧

把这本书快递过去

那么同样的道理

那信里面的内容

我们要考虑我们到底是直接用明文写

我们是用

比如说中文写英文写对吧

怎么写

还有比如说可能

还有莫尔斯电码对吧

会不会加密

之后再把这封信送过去

那么我们需要

虽然我们生活中确实不会那么复杂

但是如果拿它来考虑的话

就是我们有不同的维度

真的去思考的话

其实有很多种维度啊

大家现在这个场景不熟悉

我相信

写过情书的同学可能对这个场景会更加的熟悉一点

对吧会不会用到其中的某些场景

前面提到的通信

那么通信的话需要走到网络

那么我们涉及到一个网络编程的一个知识

那么网络编程我们其实有

如何去实现

我们前面说的进程之间的通信

那么其实也有两种方式

第一种方式就说我们利用操作系统

提供的API

就是我们说SOCKET API

其进行一个自己来实现

通过操作系统底层提供了一些API的机制

来做到通信

那么这一块需要自己去

写大量的代码就实现了

那么这个涉及到比如游戏客户端

跟服务器店的通信

还有服务器跟第三方服务

他们之间的通信

都需要去处理

还有另外一种方式

就是说我们可以选择

不用自己去做

我们可以用网络中间件

就是我们说的消息队列

去帮我们完成这块的事情

那么像腾讯

腾讯游戏

它自己的自研的消息中间件叫Tencent TBUS

后面我们会讲到

那么这两种方式

可以类比于我们前面讲的就是

线下送信的一个是自己送

左边的SOCKET编程

相当于我们自己送

因为做了代码

都要自己去写

自己去处理其中的一些问题

那么右边的网络中间件就相当于

我托管给了中间件

让他们来帮我们实现

那这样的话就相当于

相对于是第二部分

就是这样

也许像一个邮局系统

它已经帮我做好了

那既然提到消息队列的话

那我们可以看看

消息队列的一个定义

那就是消息队列是专门来负责消息传递的

通用的一个中间件

它就是功能比较单一

就是发送方

会把要发的数据

叫消息吧

通过对应的API接口

丢给了消息队列

消息队列会帮你去做存储

转发路由

各种各样的事情最终保证它

会被投递给接收方

那么

至于接收方到底在哪里

部署在哪台机器上面

是什么样的网络上面

发送方都不用关心

我只要告诉

目的方是谁就可以了

那这样的话它有些特点

它可以把消息的发送方和接收方

进行一个解耦

互相之间可以不用知道对方的一个实际的存在

或者知道他存在并且它的地址是什么就OK了

那么还要

会有比较好的一个稳定和可靠性

另外

它的性能通常会比较高

因为它的功能比较单一

它可以在这里做到大量的优化

这就是我们用消息队列的一个好处

那么对于消息队列

实际上是有业界

有非常多的开源的这些实现

每一个都有自己的优点和缺点

以及它擅长的地方

那么这一块我们

在课上因为时间有限

所以大家感兴趣

可以在课下去针对于

业界比较流行的

一些中间件

进入一个深入的学习和使用

这里的话

我会重点讲一下腾讯游戏自己的

一个通信方案

那么它的系统叫TBUS系统

什么叫TBUS

TBUS就是说

我们知道每一个

分布式系统里面最小的一个单元的话

如果定义到程序级别

那就是一个进程

那么每个进程

他其实我们需要标记它

标记它到底如何来识别

和找到这个进程

那么这里面的我们用一个叫TBUS地址

TBUS地址是一个点分十进制的一个表示方式

它的定义的话会是

World Zone Func Instance

这个四个维度

那么举个例子来讲

就是说

比如说大家在玩游戏

可能说微信

大家会问你在哪个区啊

对吧

大家在玩的时候都会问你在哪个区

你可能会告诉朋友说我在微信一区

那么这里面的微信其实就是一个World

因为它是微信

还有另外一World可能是叫QQ对吧

还有可能叫游客模式

那个区

那么一区就是我们说的Zone

还有那么Func

其实就代表了你的一个进程

它的功能

比如我们的功能是一个PVP战斗进程的话

那么它可能

这个Func比如ID等于一

那么它代表的其实是

微信一区里面的PVP的战斗进程

它专门负责处理战斗的

那么还有个Instance

那么你处理战斗的可能只有一组

因为单个战斗的一个程序进程

它可能能力有限那我们其实分布式里面

它会是一组

每组唯一的它每一个都有个唯一编号

那比如说编号是一

那么就是一号

那么如果说我们简单类比的话

那可能就说微信一区的一号战斗服务器进程

战斗的进程

就是这又是一个TBUS进程

对于TBUS的一个编码

它可以标识到唯一的一个进程

这里我们看一个例子吧

就是说

我们图上它也可以看到

上下两部分

上半部分和下半部分分别是一台实体的

一个物理机器

在这上面

我们部署了一些

两个业务进程

进程A和进程B

他们是在两台机器上

那么A和B之间

它是需要有通信和配合的

比如说

A现在要发一个消息给B

发给B

那么它如何把这个消息投递出去了

那么在TBUS系统里面

大家可以看到

这边的虚线

它实际上是一个虚拟的

并不存在的

实际上

他的消息发送

A会发给一个叫TBUSD的一个进程

这个TBUSDA

我们把它叫做TBUSDA

进程A和TBUSDA它是在同一台机器上

那么TBUSDA收到

进程A发过来的消息之后

它会去把这个消息转给B机器所在的TBUSD

我们把它定义为B的话

那么就相当于是TBUSD之间

会有一个消息的转化

同时B进程所在的

它物理机上的TBUSD

收到消息之后

会通过TBUS的channel转给进程B

所以这样的话我们就看到

比如说A和B之间的一次通信过程

变成了A到本机的TBUSD

在从本机的TBUSD到B所在的TBUSD

最后从B的TBUSD然后转到进程B

那么这是一个一次通信过程完成

那么

就通过这种方式

就建立起来了

A跟B之间的一个

通信的一个通道

大家可以在这里可以看到就说

A

发消息的时候

它需要知道什么呢

它只需要知道进程B的一个

TBUS地址

就可以了

那么按照这里的例子来讲的话就是

进程A发给B

只要知道B的地址就OK

那么它怎么做到的

A只要知道B的地址就可以发送过去呢

前面我们看到它的详细过程

大家应该能够分析的出来

最关键的关键点在于TBUSDA

它要能知道

B到底在哪台机器上对吧

同而能找出对应的TBUSD把消息投递

那么这里面就有两个很重要的因素

第一个就是刚才说的

TBUSD如何知道一个进程

在哪台机器上

同时还需要知道这台机器上TBUSD的地址

到底在哪里

那么

这两个核心的信息

我们是通过叫GCIM和GRM

这两套工具这两个配置

它其实是一个配置管理工具

通过它来知道的

那我们看看它到底在做什么事情

这里是GRM

GRM是指路由配置信息

全局的路由配置

那么刚才提到TBUSD需要把A发过来的消息

转给另外一台物理机的时候

那么它需要有一个配置信息

告诉TBUSDA说

B所在的进程

所在的机器的TBUSD的IP和端口

这里大家可能会有点熟悉呢

就是说网络编程里面大家都会想到

我需要知道对方IP

需要知道对应的程序的端口

那么它的配置是在这里

A是不需要知道

但是TBUSD是需要知道的

那么TBUSD就是通过

就是通过这样的配置信息

来找到我应该把消息发送给谁

那么第二个问题TBUSD

收到消息之后怎么知道转发给

我这台他所在的那台物理机上的

哪个进程

那个或者叫我们前面提到的进程B呢

因为可能这台机器上署了很多进程

可能有除了进程B还有C还有D

那么这个时候它需要

通过GCIM的一个配置

来找到进程B

所在的一个TBUS chancel的一个

标识

对于我们叫shmid

它其实是一个共享内存的

共享内存的一个ID

那么通过这个的话

我们就能找到TBUS chancel

TBUS chancel

然后通过TBUS chancel

把消息转发过去

那到这里的话

大家可能又会注意到

就说TBUS chancel在里面

也是扮演一个很关键的

一个信息

一个很重要的一个位置

因为它是本机内部的各个进程之间

通信是走的TBUS chancel

其实它是一块共享内存

大家都知道共享内存是

由操作系统来管理的

统一来管理的各个进程

可以之间共享

读到同一块地一个共享内存

那么这个的channel

它的信息分为三部分

第一部分叫

Control信息

给你是它的一个控制

一些控制的和关键信息在里面

剩下两个会有两个queue

两个队列对吧

这个队列而且是一个环形的一个队列

那么大家从这个图上可以看到一个

很明显的标识

就是AB两个程序

他们之间建立起来的这个TBUS channel

这两个

两个队列环形队列是不同的

比如说我们看到

A只会去写上面那个队列

同时上面那个队列只会被B来读

所以可以看的到

A写第一个

但反过来B来写消息的时候

它只会写下面的一个

但同时

这个是被A来读

所以大家可以看到

这两个队列

实际上大家是有分工的

一个是A来写B来读

另外一个是B来写

A来读

都可以

这是我们计算机程序里面的一个生产者

消费者模型里面的

单生产者单消费者模型

这样的模型其实是一个非常简单的

而且可以需要无锁化的

不需要锁来去

进行保护的

那个简单的一个团队里它的

性能会非常强

因为他不需要去做锁不需要做同步

这是

channel它的一个实现的原理

TBUS它如何进行跨界通信

如何利用TBUSD

加上GC GRM来做跨界路由

同时再利用了GCIM

来做本机的这个寻址

它屏蔽了这个部署上的一个细节

刚才前面提到发送方和接收方

他不需要知道对方到底在哪里

你具体部署在什么机器

这台机器到底放在什么机房对吧

甚至是不是在同一个地方

它们不太关心

而且我们用TBUS地址来替代了

传统上的IP和端口

那这样的话

它在

当一台机器的

一台机器出现故障

前面提到一台机器它

是有一定的故障率的

这台机器出问题了之后换了一台机器去

那么一台物理机器

那么它的IP地址可能发生变化

但是它的TBUS地址是不会变的

只是底层的映射关系发生了变化

所以这个他对上层的应用层是没有影响的

或者要基本上很少影响

不需要部署

不需要改部署结构

那么还有一个就是程序

它重启的时候影响很小

因为它网络层已经被TBUSD托管了

那么它不需要去把连接断开再建立的整个过程

它也不会把

网络链接中未处理的消息给丢掉

同时它也还有快速恢复

因为他从共享内存里面可以继续去

读消息进行处理消息

同样的话

它可以做到性能比较强

因为它整个都是无锁化的一个实现

然后存内存的一个操作

这个是一个

TBUS系统作为一个网络中间件

构建各个进程之间的

一个通信网络

游戏程序设计课程列表:

第一章 《游戏开发导论》

-1. 1什么是游戏(上)

--1.1 什么是游戏(上)

--选择题

-1.2 什么是游戏(下)

--1.2 什么是游戏(下)

--选择题

-1.3 游戏是如何开发出来的

--1.3 游戏是如何开发出来的

-1.4 游戏引擎(上)

--1.4 游戏引擎(上)

-1.5 游戏引擎(下)

--1.5 游戏引擎(下)

--单选题

-1.6 如何成为一个游戏开发者

--1.6 如何成为一个游戏开发者

--多选题

第二章 《游戏服务器概述 》

-2.1 什么是游戏服务器

--2.1 什么是游戏服务器

--单选题

-2.2 游戏服务器的和分类发展

--2.2 游戏服务器的和分类发展

--单选题

-2.3 核心技术和实现难点

--2.3 核心技术和实现难点

--单选题

-2.4 设计原理与方法论

--2.4 设计原理与方法论

--单选题

第三章 《《三维几何学基础》 》

-3.1 三维坐标系统

--3.1 三维坐标系统

--多选题

-3.2 向量与运算

--3.2 向量与运算

--单选题

-3.3 矩阵与线性变换

--3.3 矩阵与线性变换

--双选题

-3.4 四元数

--3.4 四元数

--多选题

第四章 《游戏循环及实时模拟》

-4.1 游戏循环概述(上)

--4.1 游戏循环概述(上)

--多选题

-4.2 游戏循环概述(下)

--4.2 游戏循环概述(下)

--单选题

-4.3 《无尽之路》的实现

--4.3 《无尽之路》的实现

--单选题

-4.4 支撑游戏的功能

--4.4 支撑游戏的功能

--选择题

-4.5 支撑游戏的机制与系统

--4.5 支撑游戏的机制与系统

--多选题

第五章 《随机数在游戏中的应用》

-5.1 基本介绍

--5.1 基本介绍

--单选题

-5.2 随机数生成器

--5.2 随机数生成器

--单选题

-5.3 随机数分布与应用

--5.3 随机数分布与应用

--单选题

第六章 《游戏性系统》

-6.1 什么是游戏玩法开发

--6.1 什么是游戏玩法开发

--单选题

-6.2 建立愿景 Vision

--6.2 建立愿景 Vision

--单选题

-6.3 划定边界 Scope

--6.3 划定边界 Scope

-6.4 迭代 Iteration

--6.4 迭代 Iteration

--单选题

-6.5 迭代 Iteration+抛光Polish

--6.5 迭代 Iteration+抛光Polish

--单选题

第七章 《实时图形渲染管道》

-7.1实时图形渲染管道 宏观渲染系统

--7.1实时图形渲染管道 宏观渲染系统

--单选题

-7.2实时图形渲染管道 应用阶段

--7.2实时图形渲染管道 应用阶段

--单选题

-7.3实时图形渲染管道 几何阶段

--7.3实时图形渲染管道 几何阶段

--单选题

-7.4实时图形渲染管道 光栅化阶段

--7.4实时图形渲染管道 光栅化阶段

--单选题

-7.5实时图形渲染管道 总结 参考

--7.5实时图形渲染管道 总结 参考

第八章 《材质着色与光照》

-8.1 物理回顾1

--8.1 物理回顾1

--单选题

-8.2 物理回顾2

--8.2 物理回顾2

--单选题

-8.3 材质 1

--8.3 材质 1

-8.4 材质 2

--8.4 材质 2

-8.5 材质3

--8.5 材质3

-8.6局部光照

--8.6局部光照

--单选题

-8.7 全局光照

--8.7 全局光照

--单选题

第九章 《游戏动画》

-9.1 动画介绍

--9.1 动画介绍

--多选题

-9.2 游戏动画介绍

--9.2 游戏动画介绍

-9.3 动画技术类型

--9.3 动画技术类型

--多选题

-9.4 骨骼蒙皮动画

--9.4 骨骼蒙皮动画

--多选题

-9.5 动画流水线

--9.5 动画流水线

--多选题

-9.6 动画前沿趋势

--9.6 动画前沿趋势

--多选题

第十章 《网络同步技术》

-10.1 .基本概念

--10.1 .基本概念

--多选题

-10.2 设计目标

--10.2 设计目标

--多选题

-10.3 传输数据分析

--10.3 传输数据分析

--多选题

-10.4 常用同步方案 1

--10.4 常用同步方案 1

-10.4 常用同步方案 2

--10.4 常用同步方案 2

-10.4 常用同步方案 3

--10.4 常用同步方案 3

-10.4 常用同步方案 4

--10.4 常用同步方案 4

--多选题

-10.5 方案对比

--10.5 方案对比

--多选题

第十一章 《游戏常用几何学》

-11.1 基本图元

--11.1 基本图元

--单选题

-11.2 图元距离(上)

--11.2 图元距离(上)

--单选题

-11.2 图元距离(下)

--11.2 图元距离(下)

--单选题

-11.3 图元相交测试+ 其他几何方法

--11.3 图元相交测试+ 其他几何方法

--单选题

第十二章 《游戏物理模拟》

-12.1 著名物理引擎介绍

--12.1 著名物理引擎介绍

--单选题

-12.2 物理引擎原理(上)

--12.2 物理引擎原理(上)

--单选题

-12.3 物理引擎原理(下)

--12.3 物理引擎原理(下)

--单选题

-12.4 游戏中的物理体

--12.4 游戏中的物理体

--单选题

-12.5 物理引擎使用入门

--12.5 物理引擎使用入门

--单选题

第十三章 《开发工具 》

-13.1开发语言

--13.1开发语言

--单选题

-13.2 开发环境

--13.2 开发环境

--单选题

-13.3 腾讯开发组件介绍

--13.3 腾讯开发组件介绍

--单选题

-13.4 网络通信+业务框架介绍

--13.4 网络通信+业务框架介绍

--多选题

第十四章 《分布式系统设计 》

-14.1 进程间通信(上)

--14.1 进程间通信(上)

-14.2 进程间通信(下)

--14.2 进程间通信(下)

-14.3 通信格式

--14.3 通信格式

-14.4 并发模型

--14.4 并发模型

-14.5 超时处理

--14.5 超时处理

-14.6 大系统小做(上)

--14.6 大系统小做(上)

--多选题

-14.7 大系统小做(下)

--14.7 大系统小做(下)

-14.8 架构层面的技术支持(上)

--14.8 架构层面的技术支持(上)

--单选题

-14.9 架构层面的技术支持(下)

--14.9 架构层面的技术支持(下)

-14.10 分布系统的关键能力

--14.10 分布系统的关键能力

--多选题

第十五章 《游戏人工智能》

-15.1 游戏人工智能综述

--15.1 游戏人工智能综述

-15.2 人工智能在游戏中主要方法 上

--15.2 人工智能在游戏中主要方法 上

--多选题

-15.3人工智能在游戏中主要方法 (下)

--15.3人工智能在游戏中主要方法 (下)

-15.4 人工智能在游戏制作中的应用领域1

--15.4 人工智能在游戏制作中的应用领域1

--多选题

-15.5 人工智能在游戏制作中的应用领域2

--15.5 人工智能在游戏制作中的应用领域2

-15.6 人工智能在游戏制作中的应用领域3

--15.6 人工智能在游戏制作中的应用领域3

--多选题

-15.7 人工智能在游戏运营中的应用实践(上)

--15.7 人工智能在游戏运营中的应用实践(上)

-15.8 人工智能在游戏运营中的应用实践(下)

--15.8 人工智能在游戏运营中的应用实践(下)

--多选题

第十六章 《游戏支撑系统 》

-16.1 游戏支撑系统(1)

--16.1 游戏支撑系统(1)

--单选题

-16.2 游戏支撑系统(2)

--16.2 游戏支撑系统(2)

--单选题

-16.3 游戏支撑系统(3)

--16.3 游戏支撑系统(3)

--单选题

-16.4 游戏支撑系统(4)

--16.4 游戏支撑系统(4)

--单选题

-16.5 游戏支撑系统(5)

--16.5 游戏支撑系统(5)

第十七章 《游戏逻辑服务器和反外挂》

-17.1 游戏逻辑服务器(上)

--17.1 游戏逻辑服务器(上)

--单选题

-17.1 游戏逻辑服务器(下)

--17.1 游戏逻辑服务器(下)

-17.2 外挂与反外挂(上)

--17.2 外挂与反外挂(上)

-17.2 外挂与反外挂(下)

--17.2 外挂与反外挂(下)

--多选题

第十八章 《运行环境和运维 》

-18.1运行环境

--18.1运行环境

--多选题

-18.2物理部署

--18.2物理部署

--多选题

-18.3系统的可运维性

--18.3系统的可运维性

--多选题

-18.4运维案列分析

--18.4运维案列分析

--多选题

14.2 进程间通信(下)笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。