RTM 是实时消息(Real-time Messaging)的简称。在实时互动场景中,用户通常有两种互动方式:一种是通过音视频进行互动,比如语音连麦、视频连麦等;另一种是通过非音视频的方式进行互动,比如文字聊天、世界频道消息、消息用户列表,以及多人游戏角色间的交互等互动。后者可通过实时消息 RTM SDK 来实现。
实时消息 RTM SDK 已被集成到众多场景中,例如语音聊天室、直播聊天室、视频聊天、在线教育、游戏以及 IoT 等场景。那么关于 RTM 在上述场景中的落地与应用是怎样实现的?未来 RTM 产品的进化方向在哪里?作为开发者,如何快速接入、进行高效开发?以上问题,声网Agora 跨平台 SDK 开发负责人张涛与声网Agora RTM 产品负责人王搏近期的 Agora Talk 中为大家作出了解答。以下内容为演讲内容回顾。
王搏: 大家好,我是声网 RTM 产品负责人,王搏。本次分享会分成两部分进行,首先由我给大家介绍最新的 RTM 以及 Unity 相关进展。之后,会由张涛同学给大家做 Unity RTM 的实操分享。
Unity 是一个在移动游戏、AR、VR 等领域主流的一个游戏引擎。我们可以用 Unity 做非常多的事情,比如游戏方面,可以做休闲游戏、多人竞技、MMO、RPG 等等这些游戏上的内容和创新;在线教育方面,我们也看到有越来越多的开发者选择Unity,借助它非常好的表现力和互动能力去做游戏化教学的教具,激发更多的学生有兴趣去参与到这样的学习活动中。另一方面,也有很多开发者借助 Unity 做一些 VR、AR 全新虚拟体验。我们刚刚讲的这三种情景,参与者或者玩家除了体验 Unity 带来的表现力,或者游戏制作精良的内容外,很大的一个乐趣来自于人与人之间的 实时互动 。
什么是实时互动?
所谓 实时互动 ,我们认为一般会包含以下三个特点。
第一个:共享情景。如果我们在同一个游戏中,这个游戏可能就是我们一起共享的情景。
第二,这个情景可以是任意规模或者形式的,可能是一对一的PK、几个人一起玩斗地主,或者上百人、上千人的游戏,所以会存在不同的规模和大小。
第三,它可能是无处不在的,可能在地铁上玩游戏、玩手机,在教室里学习,体验一些VR的沉浸式体验。这些,都是实时互动可能发生的特征。
同时,实时互动一般会有以下的场景,比如语音互动,可能在游戏里的实时语音、小队语音等等,可能会包含实时的文字聊天、公屏聊天、密聊。往大了一点说,我们可以认为游戏指令也是一种互动,比如在王者荣耀里,控制一个角色往前走往后走,释放一个技能,对应的玩家也会做出相应的响应。可以把这个认为是人和人之间、玩家和玩家之间在游戏里做了些互动,所以这些语音、文字聊天以及指定互动,可能就是我们会遇到的一些实时多人互动中的具体表现形式。
如上图所示,开发者可能在处理这些实时互动中会遇到一些痛点。在实时音视频里,或者说 RTC 里面,可能会遇到听声辨位、噪声抑制、回应消除,或者卡顿延迟等等相关的问题,声网的 RTC 以及 RTC Unity 在社区内是非常受到欢迎的一个解决方案,能够帮助开发者解决在实时音视频中遇到的问题。同时,我们也看到很多开发者可能会在消息和控制性上遇到问题,比如我怎样保证高可靠和弹性扩容。举个例子,我现在可能是一个刚开发的一个游戏,那么怎样才能保证它在数周或者数个月后,能支持上万上 10 万的玩家在里面进行各种各样的互动,包括消息和信令。
以及跨国跨区的延迟或丢包率大。怎样确保我在中国玩家和韩国玩家之间能够做到实时语音、文字聊天,或者是游戏指令的一些互通呢?在大频道上,比如国战时,可能会达到几千上万人,怎样才能做好同频消息呢?这也许会带来非常高的转发吞吐量,对应可能会有消息风暴的处理。这其实都有非常非常多的需要处理的地方。
还有一点是指令的实时到达,我们可以看到游戏的指令其实对于游戏的胜败是非常重要的。可能因为一个指令收到了或者晚到了,对应的角色就能够存活下来,从而决定了游戏的胜负。以上这些方面,可能都是决定多人实时互动的体验中非常关键的地方和痛点。基于以上原因,我们推出了RTM 来解决这些问题,包括最近刚刚支持的RTM Unity SDK,目前是 GitHub 的社区版,来更好的帮助开发者解决多人互动在游戏中的消息和信令上的问题。
RTM Unity SDK
Agora 实时消息 RTM 的核心特点是低延时、高可靠、高并发,全球的信令服务。RTM SDK 除了在多人游戏外,已经在在线教育、视频聊天、直播互动连麦、电商直播、会议、IoT、VR、AR 等很多场景中输出了相关解决方案。包括上下麦的控制、弹幕群聊、社交邀请等功能,都是可以做到的,并且能够帮助开发者快速的集成,满足他们的实时场景需求。之前提到的几个痛点,可以通过这些产品的优势来解决,如下图所示。
实时消息 RTM 的架构可以分成两块,一块是边缘的服务器集群,一块是核心服务器集群。在全球,我们会分不同的网络自治区域,区和区域之内,我们保证低延时到达;区和区域之间,我们也通过一些核心网络的技术来保证同步。同时,我们的每一个边缘或者核心内,都通过集群的方法提高了可用性,保证了可用性。
在我们的边缘节点, SDK和边缘服务器之间也采用了双路连接,也就是会同时连接两个服务器,来保证进一步提升整个链路的可靠性和有效性。根据2020 年 Q3 的演示统计,能做到全球端到端 100 毫秒左右的延时,当然这是一个平均值。
提到端到端的延时时,不得不说我们最近做了关于传输信道的优化,那大家可能知道,TCP 本身在弱网对抗算法上有各种各样的限制,所以在弱网情况下,TCP 的表现不是非常好。我们做了基于 UDP 的可靠、有信道,能够保证我们在弱网情况下有更好的表现。在 20%丢包情况下,我们的整个 RTT(往返延时)可以做到 TCP 的1/4甚至1/5更多,来保证 RTM 在各种各样状况情况下都能够带给我们的用户比较好的实时体验。
产品功能这块呢,RTM 支持两类,一块是核心的消息和点对点消息和信令。我们会包含点对点消息、支持频道消息和离线消息缓存。如果对方不在线,我们会帮你把消息缓存好,等对方上线以后,再把这个消息投递给对方。还支持不同的消息格式,比如图片消息,文件消息等。我们还可以支持历史消息,消息可以在我们后台存储。除此之外,我们还支持辅助的频道管理、房间管理能力,比如频道属性、频道人数、成员列表等,也支持 RESTful 相关的请求和功能、安全加密。
在 2020 年,我们做了很多安全加密方面的工作,包括传输的链路加密、存储加密等,这些方面都有非常大的改善。在刚刚提到的这些优势、能力和特点之上,我们给游戏开发者提供了这样的能力:可以用 RTM 来做小队聊天、私聊、公屏聊天等文字聊天能力,或者可以用 RTM 来做指令与状态的同步。比如贪吃蛇类型的游戏,我希望我这边的蛇往前走一步,那么可能会把这个指令或者当前的位置状态同步给其他所有端上的其他玩家,那么他在他的手机上就会做出相应的渲染,这个就是 client to client 之间的指令同步。
另外一种可能是 client to server,就是可能我的游戏比较复杂,我需要把一些状态的业务逻辑、业务判断放在服务端做。这样的情况下,我们有 sever SDK,可以在 client SDK 之上,通过 Unity client SDK 把这个指令上传到对应的 RTM 的 server SDK,做好对应的处理后再下发给所有的端上,这也是我们支持的一个能力。
下面,我再给大家快速的介绍一下我们现在支持的其他场景。语音聊天室,比如聊天互动、房间管理、视频聊天、用户管理、私聊消息、直播聊天室、在线教育白板(我们有现有的白板合作伙伴,但也有客户出于种种原因基于 RTM 做自研),RTM 可以做白板的信令控制等。去年,我们在物联网上也做了适配和增强,包括智能家居控制信令、车载控制信令、手表的收发消息和呼叫,或者 AR、VR的实时标注,也支持视频会议或线上直播这样的场景。
以上是我们支持的部分场景,下面我想跟大家分享一下我们未来一年内计划会做的一些事情,分享的主要目的是希望能够跟开发者一起去共建RTM产品。如果大家有想法、建议,或者觉得你想要的能力没有出现,都可以在 rtcdeveloper.com 发帖提出。
我们近期计划把 Unity SDK 同步发布到 Agora 官网,同时,会在 Unity Asetstore上做对应的支持。在信令方面,我们想做更进一步的探索。Unity 在 networking上没有非常成熟、自由的一个方案,所以我们在思考是否有更多的优化能够帮助开发者更好的去做多人互动引擎。
我们认为未来在物联网上会存在一些客户需求,比如我需要这个消息在10ms或者十几毫秒里就能以非常高的概率到达对端,基于这样的需求,我们在做相关的技术演练,包括极速消息,即时信令消息这样的能力。除此之外,我们会适配更多的第三方框架和语言,比如 flutter、react native,以及 IoT 的适配。状态同步通道会给予频道属性做更多的优化,服务端会做更多的接口优化,让服务端的开发者也能更好的用起来,用他们更熟悉的方式去做响应。
我的内容就分享到这里,接下的时间就交给张涛同学,谢谢大家。
Unity RTM SDK 的使用
我叫张涛,现在是声网跨平台SDK开发负责人,我们的跨平台SDK大家在Agora的官网上应该都看到过:React Native SDK、Flutter SDK、Electron SDK,以及Unity SDK。其实这一类就是我们所说的跨平台SDK,然后这些 SDK 都是由我们团队去负责开发和维护的。然后我们产品经理刚刚介绍了一下那个 RTM 相关的概念。现在呢,我从技术角度去分享一下 Unity RTM SDK 的一些信息。
Unity 的版本目前支持 Unity 2017 及以上的版本,上面这张截图,实际上就是运行在Unity 2018上的实际情况。我做了很多操作,比如说登录、发消息、接收消息、各种显示,以及相关的一些功能的演示。这张是截图,后面会有实际的演练。
目前 SDK 支持 Android、iOS、Windows(Windows 支持 x64 还有 x86),macOS 也是支持的。上面左边的这张截图实际就是 Unity package 打开 RTM SDK 后的情况。这里面主要包含三部分,第一部分里,大家可以看到有一个 Editor 文件夹,这个文件夹实际上做了一些打包前前处理的操作,比如在你自己的实际项目中集成第三方的 SDK 的时候,iOS SDK 或者 macOS SDK 需要去链接比如说系统库之类的,如果没有做这些前处理的脚本动作,之后在导出 iOS 的工程后,你可能需要自己手动链接你需要的一些系统库。在这里,我们帮你去做了这些。链接系统库或者添加权限的操作过后,实际上导入工程,你就可以直接运行,而不用再手动链接每一个依赖的系统库。上图右侧写的是支持的平台包括:Android、iOS、 macOS、x86、x86-64。文件夹中的 RTM-scripts 主要包含用来给使用者在 C# 上进行调用的 API 接口,开发者实际上接触到的也就是 RTM-scripts 这一层。再下面这个文件夹 RTM Demo 实际上包含我们官方的 SDK 调用演示,然后里面会包含各种场景的调用,比如说登录、发消息、加频道、呼叫邀请。
那么要怎么开发一个 Unity 插件呢?
然后我简单的和大家讲解一下 Unity 插件的制作。做 Unity 游戏开发的开发人员可能对于 Unity 插件制作不是特别熟悉。比如说,当你在对接第三方 SDK(Agora RTC SDK),或者说某个第三方的 SDK,假如对方没有 Unity 版本,那就需要自己基于对方的原生 SDK 进行开发,开发成 Unity 的插件后才能在你的 Unity 的工程上去使用。
第二步,可能你的 Unity 项目需要调用一些系统原生的功能,这样的话就需要自己制作插件。在安卓平台里,Unity 安卓插件的制作目前有两套主流方案。第一套实际上是通过 Unity 提供的AndroidJavaClass 在 C# 层通过反射一样的动作去调用原生 java API,Java API 也可以通过 send massage to Unity进行交互,这个插件最终可能会打包成一个 AR 放到 Unity 的 plugins 文件夹下。安卓的另一个插件的制作方式实际上是通过 C# 去调用 C 的 API,最终 C 的 API 可能会被打包成一个 so 动态库,然后你在 C# 上通过 dllImport 将函数导出,然后由 C# 层进行调用。
在 iOS 上使用的方案其实跟安卓的第二套方案比较类似,macOS 也是这样,但 macOS 其实有点特殊,如果你制作的 macOS 插件赖了一些第三方的库,这些第 3 方库和你自己写的中间层会被打包成一个 bundle,最终成为一个 bundle 文件放到 Unity 下面作为一个插件,最后由 Unity 层去进行调用。Windows 实际上也是通过 C# 直接调用 C 的 API,C 的 API 中间层会打包成一个动态库,然后由 C# 层通过 dllImport 进行链接。
考虑到开发和维护的成本,我们的 Unity RTM SDK 实际上是基于 Native 的 C++ API,实际上 RTM Native API 目前有两套,安卓有一套 C++ API 和一套 Java API。iOS 有一套 OC API 和一套 C++ API,macOS 和 iOS 是一样的;Windows 本来就是 C++ API。这些平台的 C++ API 接口实际上是一模一样的。因为 RTM 是基于 C++ API 开发,所以中间层实际上只有一套代码,通过工程化的手段移植到不同的平台,打出对应平台的包进行使用。
插件制作这一块大家有可能会接触到,但大家可能对这一块不是很熟悉,Unity RTM 中这一层目前是开源的,后面会和大家介绍。如果大家后面需要相关资料或者想要学习,可以到官方的开源仓库查看参考。
如上图所示,是 Unity RTM SDK 的一个基本架构组,最上层就是 C# 的 API,也就是使用者接触到的这一层。然后是中间层,我们在中间层写了一套 wrapper,以便调用 Native 统一的 C++ API。然后把这一套通用的代码,通过工程化到不同的平台,打出对应平台的包,再提供给 Unity 使用。
如何高效接入 Unity RTM SDK
接下来我和大家简单讲解一下怎样高效接入Unity RTM SDK,开发一些功能。
Unity RTM SDK 目前是打包出一个 Unity package。做 Unity 开发的人可能对 Unity package 比较熟悉。从 Unity Asset Store 去下载一些插件的时候,插件都是作为Unity package 的形式被下载下来,然后导入到 Unity 工程里。实际上我们目前也打包成了 Unity package,但还没有把 Unity package 上传到 Unity Asset Store,目前放在了我们官方 GitHub release 标签下。实际上,只要下载好 Unity package,然后点击导入,那它就会一键提成到你的项目里面。
接下来是在 Unity Editor 进行集成调试,然后编译移植到全平台。那这句话的意思大家可能不是特别理解,那我简单结合这张图给大家进行讲解。
大家在对接第三方 SDK 的时候可能会出现,你没有办法直接在 Editor 下进行调试,如果你要在安卓上调试,必须打包出安卓的工程,才能调试它的功能,这样的操作在 Unity 开发时会违背跨平台。不能直接在 Editor 里调试的原因是对方的 SDK 不支持 macOS 或者是 x64 这两个平台。如果你在 Windows 上运行 Unity,并且想在 Editor 里进行调试,那么必须有 x64 的插件才可以在 Editor 里直接集成,然后调试每一个功能点,功能点集成完后直接移植到其他各个平台,这样的操作流程是大家最期望的。除了 x64,还有 macOS这个库,如果你在 macOS 平台开发 Unity,并且想在 Editor 里去调试,就必须有 macOS 的插件,如果没有的话就没办法在 Unity Editor 上直接调试。
Unity RTM 开源代码仓库:
UnityPackage 下载地址:
在接下来的环节中,张涛通过实操,演示了 Demo 及 RTM Unity 的功能。感兴趣的开发者,可以扫描下方二维码或点击「阅读原文」观看 Demo 演示回放。
观看回放
扫描下方二维码 ,报名观看
| Tips
-
非会员报名直播需要填写注册信息,我们会根据注册信息查看直播链接(一次注册,终身免费观看直播,下载资料)
-
访问RTC开发者论坛获取技术支持:https://rtcdeveloper.com/
1,我测试unity rtm sdk 使用的是临时token,测试成功。但我希望生产环境的token。
2,有没有生产环境unity客户端配合nodejs服务器示例,golang现在无法实现,网站被和谐了无法下载