00:00
大家好,我是来自腾讯云渲染团队的陈焕。目前在团队里面负责终端相关的技术的研发工作。今天,我将从终端视角来给大家分享一下云渲染的两个应用场景及其背后的技术。首先是虚拟互动直播。我们先来看一个虚拟互动直播场景的案例。这是一个虚拟互动直播的场景,呃,主播在直播一个云上运行的虚拟空间。主播可以操控这个空间进行布局配置,它有一个自己的虚拟形象,可以在空间里面活动打碟。去主持全场。然后观众这个是观众端,观众进来直播间观看。可以进行传统的弹幕礼物互动。那么观众可以点击这里有个按钮叫加入舞会。
01:01
点击之后,它可以一键跳入虚拟空间里。可以自定义虚拟形象。在空间里面随意的漫游探索,沉浸式的参与这个活动。在虚拟空间里,他也可以跟主播进行现场面对面的互动。那这种玩法比目前。传统的弹幕礼物会更有意思,而且随着虚拟空间内容的变化,我们可以有更多的想象空间。那么我们来看一下这种虚拟互动直播是怎么实现的。它背后其实我们的腾讯云渲染平台。应用运行在云端,然后推流到直播系统。然后用户有三种角色,分别是主播、互动观众跟直播观众。最左边的。主播,通常它是在PC上去操作云端的应用。进行场景的设置,活动的控场,因为主播端会有比较多的一些操作配置,在PC上会方便一些,当然他也可以选择在手机上。
02:07
进行。最右边的是。直播的观众,他是从直播系统去拉流观看。在他点击加入舞会按钮后,直播观众的角色会变为互动观众。这个时候他其实是从直播系统切换到了云渲染平台。从云渲染串流观看。同时他也可以上行指令,去实时操作云端应用里他自己的角色。这里推流跟直播系统,这个大家应该比较熟悉了。我主要给大家剖析一下云渲染这一部分是怎么实现的。首先我们定义一下什么是云线的。云渲染是指在云端渲染3D应用,利用串流技术将画面实时推送到终端显示。
03:07
并且让用户可以通过终端与云端应用进行实时的交互操作。它可以解决终端算力不足。用户需要提前安装配置复杂的软件。终端需要一次性的采购,成本比较高的问题。比如前面的云舞会的案例。如果把云端的应用运行在主播本地电脑上,那主播就需要专门去采购一台高配置的GPU机器。一次性投注的设备成本会比较大。这种虚拟直播是活动形态的,不是每天24小时都在运行。专门去采购设备,它的利用率就不高,会有空闲浪费的成本。互动观众端其实也是类似的。会有。设备成本的问题。如果对终端的要求太高,那就不利于。
04:01
活动的传播。通过云渲染技术。主播互动。观众只需要。浏览器等。新客户端即可以访问。同时,通过云渲染应用的多端互动玩法也更容易开发实现。可以理解,实际上只需要一个单机游戏或者应用就可以做到互动。那要实现云渲染?关键是要做到低延迟的音视频传输和实时的交互操作。首先我们要确定的就是传输协议的选择。常见的流媒体协议有RTMMPHTTPFLV,还有HLS。基于RTP的RTSP和外部RTC。
05:02
前面这里面前面的三个都是基于TCP传输的。延迟会比udp。实时性就那么好。和第四个啊TSP。它主要是在web上不支持,普适性没有那么好。因为我们云渲,云渲染希望能够让用户在各种轻量的客户端上都能访问,特别是浏览器、小程序等是很重要的终端形态。所以最合适的流媒体协议其实就是外包体系。这里显示了三个核心的交互流程。第一个是客户端和云端建立连接。第二个是云端音视频数据如何串流到客户端进行显示。
06:03
第三个是客户端操作指令如何上行给到云端应用。我们先来看一下第一个流程,第一个流程就是外部RTC的建联过程。通过云渲染的调度后台作为信令服务器,双方交换SDP信息,然后建立连接。这里建联的细节就不展开细讲了,可以看一下外把TC的一个。呃,相关的资料。第二个流程。显示了在建联之后,云端应用。经过。渲染画面,然后经过采集、编码传输到web r TC的媒体流轨道传输。终端buffer的接收到解码渲染。最后。客户用户可以看到。云端的画面。
07:01
在这其中,编码这个环节,谷歌的外发VC默认只支持了YVP8 VP9,后来也支持了H264。但还不支持H265,那我们扩展实现支持了H265的编码,提高了视频的压缩率,从而降低了对带宽的要求。在传输环节。我们通过否定应答。和双向冗余纠错来处理丢包的问题。并且在重传上我们进行了分级重传。根据包的优先。及I帧、P帧这些不同的优先级来进行优先的重传。在抖动跟乱序问题上,我们是通过g buffer跟NEEQ去处理网络包的抖动跟乱序。在拥塞问题上。主要是基于。主要是通过基于食盐的带宽评估来。
08:01
调整发送端的控制策略,避免网络拥塞。同时通过动态码率、动态分辨率等动态编码策略来适应带宽。通过胚型平滑发送机制进行发送端的流控,避免拥塞。那第三个流程是客户端的操作指令的上行。通过文本方式描述。再通过web r TC的数据通道传输到云端。由后台服务程序写入到系统的虚拟设备驱动程序里。统合应用就能够响应处理。云端系统上的鼠标、键盘、手柄、触摸屏、麦克风、摄像头,这些设备都是虚拟的,只是有驱动程序可以进行交互。
09:00
在客户端SDK上,我们也提供了这些。虚拟的交互对象的接口。那在呃。操作指令上行上,如果客户端是手机终端,云端的应用也是手机应用,那么我们需要做的就是。把用户在终端屏幕上的点击触摸事件进行坐标系的转换,因为客户端渲染的时候可能进行了本地视图的缩放旋转,所以需要将客户端的视图坐标系转换到。视频流的坐标系,然后再转换到云端桌面的坐标系。如果客户端的应用是手机和云端是PC应用。那一般还需要在手机屏幕上去显示一些虚拟按钮。例如虚拟的鼠标、键盘、手柄来给用户进行交互操作。所以我们提供了手机客户端上的虚拟按键。
10:05
另外,除了这里显示的三个核心的主要流程,其实web r TC它是一个双向的端到端的通信协议,也就是说云端除了下行音视频数据,它也可以通过数据通道主动去下行文本数据,将云端的一些状态事件告知客户端。呃,客户端也可以上行音视频数据。例如通过新建媒体流轨道,把。采集手机上的摄像头、麦克风的数据,上传到云端应用。这在一些应用场景上是很有用的。接下来我们再简单看一下云渲染SDK的一些设计。从前面的交互流程也可以看到,SDK的功能主要包括管理云。绘画的生命周期管理数据通道、音视频流轨道。
11:03
上行发送文本和音视频数据,下行接收文本和音视频数据。实现解码渲染。提供与云端虚拟设备和云端应用交互的上层接口。设备接口。包括。键盘、鼠标、手柄、触摸屏、麦克风、摄像头的。在渲染上,是对渲染视图的本地缩放、旋转操作、本地触摸、滑屏等操作到云端的映射。处理视图、视频云端坐标系的转换。同时,我们还提供了一个可被应用集成的手机端自定义虚拟按键组件。包括鼠标、键盘、手柄的虚拟按键。可以可视化的编辑虚拟按键,并将编辑结果保存为配置文件。在APP动态加载使用。
12:02
从而降低了客户使用云渲染的开发成本。另外,在安卓SDK的设计上,我们充分的考虑了包体积大小的问题,让客户应用的集成毫无压力。我们提供了完整版的SDK,也提供了一个轻量版的SDK加插件的集成方式。客户APP可以选择集成轻量版SDK。这个集成的体积增量只有65KB。在运行的时候再从网络上去下载SDK插件,进行动态加载。那这个轻量版的SDK里面只实现了。渲染视图、屏幕触摸操作这些UI的加逻辑以及插件加载的逻辑。以及定义了完整的SDK接口。真正的实现和外8TC库编解码库,这些都在SDK插件里面。
13:03
在SDK的维护上。SDK源码跟插件源码一起编译,就能生成完整版的SDK,给到不在乎包大小体积的客户去接入。以上就是从终端视角看到的云渲染的实现逻辑。接下来我再分享一下云渲染的另外一个应用场景,游戏微端。再看一下。登录支付云端的登录支付请求会同步到本地,然后由微端来拉起本地的微信。跟支付宝。在用户体验游戏内容的同时。微端会在后台静默下载完整的。
14:15
等下载完成。可以看一下。等下载完成后。用户只要重启微端,或者等下次进入微端,就能够热升级成完整的本地游戏包。不需要进行覆盖安装的过程。具备良好的用户体验。这样就变成了本地游戏包了。用户也就从云游切换到了本地游戏。我们来看看微端背后的实现技术。首先,我们先给微端下个定义。微端是使用云游戏技术构建出来的某款游戏的专属游戏客户端。
15:09
体验接近原生游戏客户端。因为微端的体积很小。所以就很适合用来做游戏的买量。广告投放。方便快速获客。微商的商业模式在于买量,市场的成本高啊。微端小包体能够带来整体投放ROI的提升。下面这个。那你原游戏包有800兆,接入微端之后,它的投放包只有13兆,那C端的用户去下载了这个。微装包进行。游戏的试玩,在边玩边下载,最终转换成本地的游戏。
16:00
我们看一下微端的整体流程。在接入流程上,主要有三个步骤。第一步是基于腾讯云提供的微端DEMO工程。客户开发自己的业务逻辑。比如数据上报。登录支付功能的。从而构建出来微端的APK。用于广告投放。微端的DEMO工程初始化,已经集成好了微端的SDK。微端的通用逻辑都在SDK里面实现。APP模块,留给客户开发使用。第二步是将。工具转换为补丁包。用于给微端APP热升级使用。游戏APK可以是任意有效的安装包。第三步是基于原始的游戏工程。接入云端SDK。
17:00
生成微端,生成云端的APK。用于在微端,用于在云端上运行。作为微端APP试玩的游戏存在。这个接入流程是简单的,我们提供了完备的SDKDEMO工具。客户一次接入可以给多个游戏复用。构建出来的。微端投放包体积也是很小,只有十兆左右,可以提升投放效果,降低买量成本。在运行的时候,用户先是下载安装,使用微端。来试玩游戏。依赖于前面介绍的云渲染技术,游戏的体验接近本地游戏。游戏也能使用本地原生的登录支付体验。同时,在试玩云游戏的过程中,会静默下载补丁包。这里我们也做了智能限速,不会影响游戏的体验。
18:03
在补丁包下载完成并且重启后。微端就自动热更新为本地的游戏包。这个升级过程用户是无感知的。就是。微端的一些相关的模块和他们之间的关系。前面。客户。需要理解的是,上面这部分补补。然后有一个云端的APP,用来做游戏的试玩。呃,下面的这些微端SDK,云端SDK,包括我们的微端云游戏业务后台,云游戏pass后台,还有我们的热更新SDK跟游戏SDK,这些其实都是冰山下的内容就是。客户可以不用去理解,我们都已经把它封装好跟做好。
19:09
那呃。微端里面有两个主要的技术,一个是云渲染,一个是热更新。林县长,我前面已经介绍过了,这里我再讲一下热更新。一般手游的热更新是由游戏开发框架提供的。游戏的控制逻辑是作为脚本资源存在。可以被动态加载。有代码解释器执行解释运行,所以就可以做到。在运行时,把代码作为资源下载到本地,然后进行动态的运行。但是微APP它只是一个轻量云渲染客户端。在它里面并没有任何游戏隐形或者游戏逻辑。如何能够升级成另外一个不相关的游戏APK呢?
20:04
这里就用到了安卓的热更新技术。说白了就是动态加载。动态加载。O。资源。然后对微端APP跟游戏PK里的man会有一些限制要求。以及这里我们也处理了一些特殊的情况。一点动态加载代上面。因为系统启动微端APP,首先会加载微端PK里的第一个desk。调用第一个代里的application类,这也是开发者能够接触到的应用程序的主入口。我们需要在这个入口里。动态加载游戏APK里的所有。并把application类生命周期的调用都反调用到的的。这样我们就可以运行起游戏APK的代码逻辑。
21:04
这里需要注意。存在。但是数组里面。加载的时候会从前往后去查找类,所以我们需要把游戏PK插入到这个数组的最前面。以保证优先加载到游戏APK里的类。这里面由于安卓系统的碎片化比较严重,所以针对不同的安卓版本,还有一些不同的厂商系统会有一些。定制化的处理。第二点,动态加载so就比较简单。我们只需要把游戏PK里解压出来的so的路径添加到系统查找so的路径里即可。第三点,动态加载资源。主要包括resource跟access这两个目录。
22:00
主要是。创建新的manager对象,通过反射调用它的一个l pass方法来加载游戏APK里的资源。再把这个新的对象复制给resource manager管理的resource对象,替换掉旧的指向微端APP里的access manager对象。这样应用就能够通过resource接口访问到游戏APK里的资源。第四点,动态加载后,对于系统而言,运行的仍然是微端的APP。系统里只注册了微端里面的信息,所以文件里的大件需要写到微端APP的maniffa文件里。这样系统去调用四大组件才能够拉起。游戏APK里。的四大组件。第五点,Hack第三方so的行为。这里主要是因为我们发现Unity引擎的so会通过绝对路径去读取APK里的资源和这个绝对路径。
23:12
不是安卓系统设计的预期的那个路径。这里我们提供了两种可选的方式来修复。或者解决这类场景。第一个是我们会去可以让客户选择去修改Unity的这个读取路径值。把它指向游戏APK文件的路径。第二种是我们提供了一种更通用的可以去任意so里的访问文件系统函数的调用。重新定向到新函数后,去修改将要访问的文件路径。其实就是修改了so加载到内存里之后的BF。信息。从而。重定向了系统函数的调用。
24:01
在流程上我们做了很多的一些工作,使得这虽然在逻辑上它是应用的,但是我们可以在SDK内部去闭环。对接的客户来说,做到无感知。也就降低了客户的接入门槛。好,这个就是呃,微端的热更新技术的一个主要原理的一个一个剖析,这里面细节点会其实会会非常的多,然后这里面我只是讲了一些核心的理念,或者核心的一些思。总之就是结合云渲染跟这新,我们可以探索出微端这样一种新的应用形态,那云渲染技术其实还有很多的应用场景,前面的两位同学其实也介绍了我们在做的一些其他的场景。这些每一个产品背后可能涉及到的一些技术都会有不同。这里,呃,以后有机会可以再跟大家去分享其他应用场景背后的技术。
25:07
好,呃,我今天的分享就到这里,谢谢大家。
我来说两句