5.12.webrtc接口调用过程

在上节课中呢,我向你介绍了外接口的设计以及我们红接口展开之后的样子,对吧?那今天呢?我们再来看看整个接口调用过程。那整个这个调用过程啊,非常的复杂,我通过一张图呢,向你做了一下展示,那么通过这张图,我们可以看到。整个从一开始红的展开,
在这里插入图片描述

到最后我们调用到create peer connection这个API这个过程呢?需要11步。那它还是非常复杂的,我们要理解起来呢,也会非常的费劲,但是通过这张图呢,可以大大简化,我们在理解这个过程中的复杂度。那即使这样,其实我们在理解的时候可能还会遇到各种各样的困难,那这些细节呢?可能你还需要去根据这张图再对照的代码去一点点的抠,才能完全理解。那不过呢,有了我们这张图之后,

它就相当于一个地图,对吧?能指引你怎么去看这个代码?那第一步应该从哪儿开始?第二步怎么走?第三步怎么走?那顺着这个过程,你去一点一点捋就会非常容易将这个代码。理解清楚了,那我们都知道,对于代码的阅读其实是一个非常吃功力的一件事儿,那如果我们的。这个能力不够的时候呢,其实你要根据你自己的一些欠缺去补一些知识,所以我们阅读y八七c代码也好,

还是阅读linux代码也好?一定要有一种恒心,然后去想了解它其中的奥秘,就不要嫌麻烦,不要怕吃苦,对吧?那在这个理解的过程中,一定会对你的整个能力的提升有非常大的帮助,当然这些都是一些题外话了。那我们还是言归正传来看一下。对于外部rtc来说,它是如何一步一步从外层的接口儿最终调用到外部rtc和音库中的接口儿的。那我们来看一下这个过程啊。那第一步当然就是这个宏定义了,这个宏定义其实就是外边其实给我们定义好展开之后就变成了。

第二幅图这个样子对吧?那对于第一幅图中的这些红呢,实际我去掉了一些边边角角的东西,只留了最核心的,便于我们理解的一些代码。那我们先来看一下这个红啊,那首先是红的,一开头它是由begin开始的,后边是某某某proxy map,对吧?那在这里呢,是signaling proxy map,也可能呢,没有signaling。那这些呢?

它的区别是什么?代表的含义是什么?我们在上节课都已经向你做过介绍了,那这里我就不再重复了。那后边就是你要对哪个类做一个代理类对吧?那这里呢?就是peer connection factory。给他做一个代理类,那在其中呢?我只保留了一个方法,就是create peer connection这个方法,其他方法都去掉了。我们只看这一个方法,将这一个方法了解清楚之后,其他的方法你都能够理解了。

那对于create peer connection来说,我们展开啊,就变成了这个样子。首先是class peer connection factory。对吧,后边呢是它的一个后缀with proxy internal,在后边是它的继承关系,那这个呢,我们不太关心,就给它滤掉了。好在这里边呢,是包括了一个方法,就r method,它是可以重载的,根据不同的参数。

那它在内部呢,就生成了一个method call的一个对象,那名字呢,就叫call里边有很多参数。其中第一个参数c下划线杠实际就是web rtc核心中的peer connection factory这个对象。那后边呢,是peer connection factory的对应方法,也就是create peer connection,那再往后就是参数。那当我们有了这个对象之后,它会调用这个对象的master方法。这个muscle是什么含义呢?实际就是一个包裹的意思,只是做了一层简单的封装。那在后边包含了一些参数rtc from here。

那对于这个红呢,后边我们还会做介绍。实际它指的就是我们现在执行的这个代码,行后边我们会看看这个宏是怎么展开的?对于这节课来说呢,我们先不讲解,我们只要知道它表示的就是我们现在执行的这行代码就OK了,那我们重点来看看method call。它是如何实现的?就指向了三三就是method code的一个实现class method code啊,它继承自message,还有message handler继承自这两个类。那么,在这个类中啊,它包含了一个marshall的方法。

它有很多参数,那第一个参数呢就是post from,也就是rtc from here,它是一个固定的值,就是我们当前执行的这行代码。好在后边呢,是线程是在哪个线程执行?就是signaling three的信令线程执行。好在这个marshal方法中,它又定义了一个对象,这个对象的类型呢是?synchronize method call就是同步调用,那当生成这个对象之后呢?调用它的invoke方法。那下面呢,

我们再来看看它是如何定义的,就是从四到五了,对吧?那它的定义就如这里展示的,它继承自message data以及message handler。这两个类,那其中的一个重要的方法就是invoke我们来看看invoke中它是怎么做的。那实际invoke中做的事儿呢,就是从五到六,这个就是synchronized method call invoke它做的事儿。它实际在这个函数中啊,非常简单,就是调了一个post。那这post是什么含义呢?就是进行线程的切换。

那关于线程切换这一块的详细内容,我们在下节课中向你做详细介绍,那现在我们只要知道,只要调了post,实际就是从我们当前执行的这个线程。发送了一个消息给我们的目标线程,那当把这个消息发送完了之后,在invoke中做了什么事呢?就是wait。那这个wait是干什么呢?就是等待目标线程执行完成之后,再从这个wait唤醒,继续下边的逻辑。所以pose的目的就是向目标线程发送一个消息,那这样呢,

就从当前执行的线程告诉目标线程,你去执行吧,我在这等你,等你执行完了之后呢?再把我叫醒,我再继续干活儿,就是这个意思,非常简单,那进入到目标线程之后,由于我们在发送的时候。是给他构造了一个消息,而这个消息呢,是有一些特殊要求的。它是继承自message handler的。那么,

在message handler中呢?会有on message方法。也就是说,当进入到目标线程之后,它执行哪句呢?就执行这一句,在接收到的message里边,有一个handler,那么handler里有on message。这个方法。然后就切换到on message这个逻辑中去执行,而on message是在哪儿呢?实际还是在synchronized method code这个对象中定义的,也就是在这里。on message那在on message中,

它会调用什么呢?调用proxy所指向的message,那这个proxy下划线又是谁呢?实际就是我们在调用method call的时候传入的this,那这时候这个this呢?实际就是method call,所以就会执行到method call中的。on message方法,所以从七就跳到了八就执行它的on message,那在on message中呢,又会调用自己内部的invoke。在自己内部的中呢,又会调r下划线的in,而r下划线指的就是return type。那也就是说,

调用到了return type中的in moke,那在return type中的in moke中呢?调用了。c里边的method。那c是谁呢?c实际就是peer connection factory,那method呢?就是我们在宏中定义的create。那它最终就切换到了web rtc核心库中的peer connection factory。里边儿的create peer connection这个方法中,最后就执行到了中的这个方法。那从而呢,就从外层的接口层调入了y8 tc的内核层,从外层的。代理类调用到了核心类中的,

具体的print peer connection方法,对吧?这就是它的一个完整的过程。所以如果没有这张图,你去看代码的时候理解起来也是非常困难的,但有了这张图,那很多的这个细节啊,步骤啊。都一步一步的向你展示清楚了,第一步就是宏展开,宏展开是在预编译时进行宏展开的,当我们。真正执行起来的时候呢,它调用的就是peer connection victory with proxy internal这个对象中的方法。所以执行的就是第二步,

那么在第二步中呢,它创建了一个method call对象,那么又执行到第三步,第三步中呢,又有m方法。执行般数方法从第四步到第五步,那就这样一步一步执行,从第一步一直到第11步,最终。从应用层调入了y8 tc的内核层。而且中间进行了一次切换。那我们还要知道,当整个过程都执行完成之后呢?实际目标线程还会发送一个唤醒消息。让应用层从这个等待处唤醒。

那么,唤醒之后,应用层又开始继续执行它的逻辑了,这是一个完整的过程。那通过这个讲解呢?应该你对整个过程啊,都非常清楚了。那下面呢,我们就来看一下代码,看看代码是如何实现的,那代码的位置是在哪?它是怎么做的?那我们现在切换到Windows系统下。好,那现在呢?

我们已经切换到Windows系统下,那上面我们所介绍的接口从应用层调到外边tc核心层。整个逻辑的实现,实际都是在src下边的API目录下,在API目录下呢,我们找。lib间隔share connection API找这个项目,那在这个项目中呢?我们可以发现两个文件。叫做proxy点h和proxy点CC那首先我们点开proxy点h,那么在proxy点h中呢?我们刚才介绍的所有的这个逻辑都是在这里出现的。首先我们看一下宏的定义。那宏定义是在哪呢?那我们可以搜索一下ctrl ctrl f。
在这里插入图片描述

begin.好。那我们搜begin之后呢,就会看到。有两个重要的宏,一个是begin signaling proxy map,一个是begin proxy map。那么,在这两个红经意中啊,在里边又加入了其他的紫红,对吧?在这些紫红的后边呢,是它的一个静态方法print,也就是创建代理类的一个方法。那我们来看看这些紫红都是干什么的,

就是我们在进行红展开的时候,并不像我们想象的它就是一个红下边儿,所有代码都写在这里了,对吧?不是的,它又进行了其他的封装,那我们看每一个封装都实现了一个具体的功能。proxy map polar print,那这个红是定义代理类的名字,我们可以看到它是通过两个双井号。来连接。前边和后边的。那c呢,是传入的参数,后边连接的呢,
在这里插入图片描述

就是它后缀。那再后边呢,是它继承自哪?好,除此之外呢?它还给这个类呢,定义了一个别名,就在我们之前的课程中呢,已经向你做过介绍了,对吧?那其他的一些呢,都不太重要了,所以对这个红来说呢,它主要干两件事,第一件事呢就是定义代理类的类名。

第二呢,是给代理类的类名儿起一个别名儿。就这两件事。好,这是第一个紫红,那我们再看第二个。那第二个紫红呢,就是它的构造函数了,对吧?某某某类的proxy with internal这个代理类。而且呢,它的构造函数是受保护的,也就是说外部是不能直接访问的。对吧,那除此之外呢?
在这里插入图片描述

它还包括了线程成员signaling thread和worker thread,那所有的接口呢,都是在这两个线程中。执行的,所以我们一定要知道y8其实有很多线程,但其中能够用于处理接口的只有这两个线程。好,这是第二个,那第三个宏呢?用于析构函数的定义,并且呢,定义了真正使用类的类型。比如说我们设置的代理类是peer connection factory proxy with internal,那么这里的这个c盖呢?指的就是。
在这里插入图片描述

peer connection factory OK,这就是笔跟红,它的一个作用,那下面呢,我们再来看看and。对于and proxy map来说。

在这里插入图片描述

它只定义了一个右画括号分号,代表一个类的结束,这非常好理解好我们再看一下method那对于proxy method来说呢?它是根据你后边儿的这个number来确定参数的数量的,如果零就说明这个method没有参数,如果是一。代表method有参数。那么,对于这个proxy method红来说,
在这里插入图片描述

它实际就是定义一个个method。它是一个可重载的函数。那么是根据输入参数来进行重载的,在它内部定义的就是master call对象。那当定义好method靠对象之后呢,就可以调用call的m方方法,那要切换的线程呢,就是signaling three的。在这里呢,都做了明确的指示。那我们根据刚才我们介绍那张图,然后再进入到m如何定义的里是执行的什么逻辑这样一步一步往下推演,你就能知道具体它是怎么从应用层调入到外边核心层的?那以上呢,就是我们这节课所要介绍的内容,

那实际上在这节课中,我向你介绍的最为最为关键的就是我们前面介绍那张图。告诉你y8 rtc的接口是如何定义以及是如何从宏展开到最终调用到y8 rtc核心库的这样一个完整的过程,一共需要11步。这个过程还是非常复杂的,有的同学可能会有疑问啊,经过这样一个复杂的过程,是不是y8 tc的学习效率会非常低呢?因为从开始到结束,函数反复的进出都是会消耗资源的。实际答案是并不会影响效率。其中的原因呢,是经过编译器优化之后,真正从接口层到核心层,只需要很短的一个路径,

就能够达到。我们在调试的时候在看代码的时候,它是一层一层多次抽检,进入到核心层的,但经过编译之后呢?只需要两三个调用,就进入到y八二七四的核心库了,所以这个担心呢,并没有必要。那以上呢,就是我们这一课所介绍内容有任何的问题呢,你可以通过讨论区或者是q群去给我留言,我在那里呢,给你做相应解答好,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值