qzmjef 发表于 2024-10-10 05:08:32

作业帮直播间前端架构优化实践


    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0FpvDsMhiaKibEaVE9gKjdAKbZRARG3EP0KOga0NO0dlR1prrjJdvb6mRTPw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    作者 |&nbsp;作业帮技术团队
    编辑 | 闫园园
    <span style="color: black;">背景介绍</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">作业帮的直播间以信令为<span style="color: black;">基本</span>做教师端,学生端的同步渲染。<span style="color: black;">全部</span>直播间<span style="color: black;">包含</span>推拉流,流<span style="color: black;">媒介</span>渲染,聊天区,课件区,连麦, 通用互动等功能,其中课件区<span style="color: black;">包含</span> H5 课件、Cocos 课件、白板、互动题、小游戏等。整体课件区内容的呈现是在 Webview 里,Webview 运行时聚合了多个<span style="color: black;">区别</span>种类的内容。下图为作业帮直播间功能简图。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0FpvcFdf1oHMNedQXAwrk6sIO5rEoJrf1ibX0WH506libGIfKicPpHDGic0zIw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <span style="color: black;">技术难点</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">终端碎片化带来多种内容渲染的稳定性;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">直播间性能<span style="color: black;">保准</span>,整<span style="color: black;">身体</span>存 /CPU&nbsp;<span style="color: black;">掌控</span>,子功能模块内存 /<span style="color: black;">CP</span><span style="color: black;">U</span> 分配;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">信令到达<span style="color: black;">保准</span>及各个环节的有序执行;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">容错,任一内容环节出问题,<span style="color: black;">怎样</span><span style="color: black;">保准</span>不影响后续运行;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">区别</span>技术栈内容的<span style="color: black;">连续</span>性接入。</p>
    <span style="color: black;"><span style="color: black;">状况</span></span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">前面介绍了<span style="color: black;">全部</span>直播间多背景知识以及前端的<span style="color: black;">有些</span>技术挑战,前端的<span style="color: black;">重点</span>功能区在课件区,<span style="color: black;">能够</span>看下优化之前的老架构,对整体有个粗略的认识。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0FpvqIWU70swjOLXoyeyneyibGsUNziaJ5I2kdGJRLVJiaKcWpj6UMSPy6JjQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">所有的业务层代码聚合在<span style="color: black;">叫作</span>之为 zb 的模块,从图中<span style="color: black;">能够</span>粗略看出 zb 模块是一个比较庞大的模块,承载了众多<span style="color: black;">区别</span>技术体系的内容渲染和调度,<span style="color: black;">亦</span>是反馈问题的重灾区,运行在一个常驻的浏览器之上。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">随着用户规模的<span style="color: black;">持续</span>增大,<span style="color: black;">区别</span>的用户机型设备的<span style="color: black;">增加</span>以及内容的丰富度和效果的<span style="color: black;">提高</span>,<span style="color: black;">咱们</span>的 zb 稳定性以及性能遇到了很大的挑战,线上的工单反馈<span style="color: black;">亦</span>有<span style="color: black;">提升</span>趋势。来自用户侧反馈的问题大概为以下几类:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">课件区黑屏,白屏,花屏;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">卡在某一个<span style="color: black;">详细</span>的页面,中断了同步;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">卡顿;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">互动题做不了;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">看不到老师笔记。</p>
    <span style="color: black;">问题分析</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">经过</span><span style="color: black;">海量</span>的测试以及问题排查列举出<span style="color: black;">咱们</span>的架构存在以下问题:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Webview 内存占用<span style="color: black;">连续</span><span style="color: black;">提升</span>,<span style="color: black;">没法</span><span style="color: black;">即时</span> GC,内存不足是<span style="color: black;">引起</span>黑白屏的<span style="color: black;">基本</span><span style="color: black;">原由</span>,Webview 的回收机制对<span style="color: black;">咱们</span><span style="color: black;">来讲</span>是黑盒,尤其是基于 DOM 方式的渲染,<span style="color: black;">开发</span><span style="color: black;">没法</span><span style="color: black;">经过</span>代码触发 GC;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">卡顿的<span style="color: black;">原由</span><span style="color: black;">源自</span>于<span style="color: black;">有些</span>动画<span style="color: black;">导致</span> CPU, 内存瞬间增长;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">信令全链路到达有丢失,服务 -&gt; NA -&gt; Webview ,NA -&gt; Webview 通信<span style="color: black;">无</span>机制<span style="color: black;">保证</span>,兜底<span style="color: black;">保准</span>通信代码较多,即使信令到达,执行的<span style="color: black;">机会</span>以及完成<span style="color: black;">机会</span>都有<span style="color: black;">必定</span>程度业务的耦合;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">渲染<span style="color: black;">区别</span>内容的调度<span style="color: black;">规律</span>耦合较多业务<span style="color: black;">规律</span>,<span style="color: black;">规律</span>链路较深,排查问题较难;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">任一内容的<span style="color: black;">规律</span>出错<span style="color: black;">或</span>报错有可能影响后续信令处理和调度<span style="color: black;">规律</span>;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">统一运行在同一个 Webview,<span style="color: black;">区别</span>内容的消耗很难<span style="color: black;">经过</span>指标进行量化;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">课件区内部分层不清晰,耦合较重;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">排查问题与<span style="color: black;">区别</span>角色的技术,边界不清晰,沟通成本高,排查效率低。</p>
    <span style="color: black;">设计<span style="color: black;">目的</span></span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">按照</span>直播间的面临的技术难点以及结合<span style="color: black;">咱们</span><span style="color: black;">日前</span>架构所面临的问题,<span style="color: black;">咱们</span><span style="color: black;">期盼</span>新架构能够实现以下几个<span style="color: black;">目的</span>:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">底层<span style="color: black;">保准</span>内存<span style="color: black;">即时</span>回收;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">底层渲染 Runtime 可切换;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">通信<span style="color: black;">靠谱</span>性<span style="color: black;">保准</span>(NA/FE);</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">内容隔离;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">调度<span style="color: black;">规律</span>与<span style="color: black;">区别</span>内容解藕;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">单个内容针对性降低内存 /CPU&nbsp;并且可量化</p><span style="color: black;">实践 &amp; 探索</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0FpvvlH8AP9G3D5Y5p1iaorK9BrlmJtBjNfXdicIjKAibFHJxrYbCwjnnbRbQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">作业帮直播间的前端架构</span></p>
    <span style="color: black;">容器及 SDK 设计</span>

    容器设计 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">容器的定义</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">容器是直播间任何内容的载体,容器<span style="color: black;">能够</span>是 Native 容器,里面运行着 Native 的组件,<span style="color: black;">能够</span>是一个 Webview 容器,<span style="color: black;">能够</span>是一个 Cocos 容器。容器有以下几个特点:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">载体;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">独立无依赖;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">生命周期;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">独立<span style="color: black;">研发</span>,独立<span style="color: black;">安排</span>。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">有了容器之后,<span style="color: black;">咱们</span><span style="color: black;">能够</span>把调度<span style="color: black;">规律</span>独立出来,下沉到端,这一层<span style="color: black;">能够</span>更专注任务的调度以及信令的处理,与内容解耦。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">容器的状态</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0Fpv41ohvzKKfVxHAk6laPNG1IQFIwibHkUhXefciaHwjMUwZoOSrErD6vMQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    容器 SDK 设计 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">有了容器的抽象,各个内容<span style="color: black;">怎样</span>集成到容器内以及<span style="color: black;">怎样</span>感知容器的<span style="color: black;">区别</span>的状态切换,需要一个标准 SDK 去<span style="color: black;">帮忙</span>封装所有的底层细节,对业务无感。SDK 需要具备以下能力:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">生命周期钩子;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">支持自定义调试;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">支持后续的扩展;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">基本</span>工具库。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">能够</span><span style="color: black;">经过</span>下面这张图,简单<span style="color: black;">认识</span> <span style="color: black;">SDK</span> 的容器周期和实现<span style="color: black;">规律</span>:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0Fpvb5K3hktkhiaYDGlC0CIt0L2DgwU7q8cD9jZ7rnYgQ3ibOEo3dh0t5bWA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    内容播放器 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">有了容器以及调度,作为内容的业务<span style="color: black;">研发</span>,<span style="color: black;">能够</span>更专注于某一个内容本身,为了<span style="color: black;">保准</span>后续内容的可<span style="color: black;">连续</span>规范性接入,<span style="color: black;">咱们</span>针对<span style="color: black;">区别</span>的内容做了一层抽象,定义为内容播放器。<span style="color: black;">咱们</span>的<span style="color: black;">重点</span>播放器有 H5 PPT 播放器,<span style="color: black;">H</span>5 互动题播放器,Cocos 课件及互动播放器,画版播放器等,下面会重点介绍下 H5 PPT 播放器以及<span style="color: black;">仔细</span>介绍下 Cocos 播放器架构层面的<span style="color: black;">有些</span>优化<span style="color: black;">方法</span>。</p>&nbsp;H5 PPT&nbsp;播放器 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">这儿</span><span style="color: black;">咱们</span>以 <span style="color: black;">H</span><span style="color: black;">5 PPT</span> 为例来介绍基于新架构播放器的分层,<span style="color: black;">H</span><span style="color: black;">5 PPT</span> <span style="color: black;">是由于</span>编辑器生产出一份数据 + 资源去驱动内容及动画的展示,参考下图,自底往上分别为:&nbsp;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">1. 容器层,负责播放器运行时;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2. 前端的<span style="color: black;">基本</span>库;&nbsp;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">3. 适配层, 播放器纯渲染层和直播间的适配,<span style="color: black;">包含</span>容器生命周期的桥接,信令的注册与处理 ;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">4. 播放器的渲染层。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0Fpv5vPibcfJBzkDkyWbicibUsfQOBaL5Wv7McI1vgVXknk3ZbibYXn0yQlZjA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>&nbsp;Cocos 内容播放器设计与优化 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Cocos 内容播放器是比较<span style="color: black;">繁杂</span>的一个播放器,代码量非常庞大,接下来会重点介绍下<span style="color: black;">咱们</span>针对 Cocos 播放器结合新架构做的一系列优化。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">当前问题</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">信令恢复不稳定容易出问题;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">加载和恢复性能差,耗时久;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">线上问题排查困难,<span style="color: black;">很难</span>锁定;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">问题分析</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">依赖过程的同步同步<span style="color: black;">规律</span>,<span style="color: black;">倘若</span><span style="color: black;">显现</span>信令丢失<span style="color: black;">或</span>信令<span style="color: black;">次序</span>错误,则会<span style="color: black;">导致</span><span style="color: black;">规律</span>错误,并且后续的所有操作和渲染<span style="color: black;">规律</span>都会受到影响;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">每次加载 Cocos 引擎、Framework、互动内容都会消耗<span style="color: black;">海量</span>的加载时间,<span style="color: black;">同期</span>依赖过程的恢复<span style="color: black;">规律</span>类似于帧同步,决定了断线恢复的时候要恢复之前的所有<span style="color: black;">规律</span>,耗时较长,CPU 占用较高;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">同步<span style="color: black;">规律</span>是同步的 Touch 事件派发,<span style="color: black;">因此</span>数据中的事件<span style="color: black;">暗示</span>不出业务<span style="color: black;">规律</span>,<span style="color: black;">仅有</span>客户端响应后才<span style="color: black;">晓得</span>触发了何种<span style="color: black;">规律</span>。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;"><span style="color: black;">处理</span><span style="color: black;">方法</span>及技术难点</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">重构信令恢复机制,改为状态同步,状态同步<span style="color: black;">能够</span><span style="color: black;">处理</span>数据错乱和丢包<span style="color: black;">导致</span>的结果不正确问题,以及恢复时耗时的性能问题,<span style="color: black;">同期</span>排查线上问题<span style="color: black;">亦</span>能有明确数据内容来锁定问题。但状态同步有两个问题需要<span style="color: black;">处理</span>:与业务解耦和同步的数据量;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">加载性能和内存问题,一个<span style="color: black;">经过</span>采用 Runtime 提前初始化,另一个采用生产时对内容进行标准化限制。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">状态同步设计</strong></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">设计思路:底层<span style="color: black;">捕捉</span>输入事件以及渲染数据变化,避免业务感知同步<span style="color: black;">规律</span>,状态数据的同步与业务<span style="color: black;">规律</span>解耦,降低<span style="color: black;">开发</span>成本,<span style="color: black;">同期</span><span style="color: black;">增多</span>增量状态和全量状态两种数据,来<span style="color: black;">处理</span>数据量大的问题。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">下面这张图是节点状态变化的<span style="color: black;">捕捉</span>和分发流程,这个机制在多个端之间<span style="color: black;">亦</span><span style="color: black;">能够</span>正常运作,<span style="color: black;">例如</span>从 A 端<span style="color: black;">捕捉</span>的状态派发给 B 端,这就满足的主讲的操作<span style="color: black;">能够</span>同步到学生端的诉求。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/0s7vnrefY8LXj3NV6iaicIfibOkOcwQ0iaPdp77ttKfSkEIhgnRJz5IiaI8FtcTFLHDe0vL5U1iaGT721RibdH6pVFhkA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">下面是状态数据量的优化策略,虽然<span style="color: black;">所有</span>数据<span style="color: black;">已然</span><span style="color: black;">经过</span>上面的<span style="color: black;">规律</span><span style="color: black;">掌控</span>的比较低了,<span style="color: black;">然则</span>为了更<span style="color: black;">有效</span>,并不是每帧都同步<span style="color: black;">所有</span>数据,是在关键帧把数据同步,其它帧只同步增量,<span style="color: black;">这般</span>既<span style="color: black;">保准</span>了数据量<span style="color: black;">亦</span><span style="color: black;">保准</span>了准确性,即使有丢失错乱,<span style="color: black;">然则</span>在下次全量数据是<span style="color: black;">亦</span><span style="color: black;">必定</span>能够恢复正确状态。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0Fpvnbqe72NCDGdN21ic6BVZSFLzcp6XMH3xqorKtctGp3PDBzpFWEkarVQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <span style="color: black;">内存和 cpu 优化</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">上一部分容器的抽象,容器<span style="color: black;">能够</span>被调度,<span style="color: black;">能够</span>被销毁,在<span style="color: black;">必定</span>程度<span style="color: black;">能够</span><span style="color: black;">保准</span>渲染内容的<span style="color: black;">即时</span>回收,接下来这部分针对<span style="color: black;">区别</span>内容做的<span style="color: black;">有些</span>优化手段。内存 /CPU 优化在<span style="color: black;">咱们</span>场景中有<span style="color: black;">非常多</span>的优化动作,<span style="color: black;">包含</span>客户端独立进程,Cocos 方向等,下面的环节重点介绍基于 Webview 运行时的内容的优化。</p>
    浏览器渲染过程<img src="https://mmbiz.qpic.cn/mmbiz_png/XIibZ0YbvibkVGdVIHHIulM7fSzxJU0Fpv5f1OuVz0j8BfX0xiamPTAyau38SSYS1tCjE0Yas8GmHbuoYaW2EYt2Q/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;">
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">上面是浏览器渲染<span style="color: black;">关联</span>比较核心的一张图,<span style="color: black;">倘若</span>你深入理解了浏览器<span style="color: black;">全部</span>渲染流程,就很清楚浏览器会在<span style="color: black;">那些</span><span style="color: black;">周期</span>会有 CPU 以及内存的消耗,<span style="color: black;">咱们</span><span style="color: black;">能够</span>大概列举如下:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">JS&nbsp;代码<span style="color: black;">繁杂</span>度及运行频率,会<span style="color: black;">引起</span> <span style="color: black;">CPU</span> 消耗,操作 DOM <span style="color: black;">亦</span>会消耗内存;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">JS</span> 代码内存泄漏;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">DOM</span> 会被解析 LayoutObject,<span style="color: black;">因此</span><span style="color: black;">繁杂</span><span style="color: black;">海量</span>的 <span style="color: black;">DOM</span> 嵌套,会<span style="color: black;">引起</span> CPU 和内存的消耗;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">CSS&nbsp;<span style="color: black;">一样</span>会被解析 Object,<span style="color: black;">繁杂</span>的 CSS&nbsp;规则会<span style="color: black;">引起</span> <span style="color: black;">CPU</span>,CSS 规则<span style="color: black;">亦</span>可能<span style="color: black;">引起</span> GPU 内存的消耗;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">照片</span>资源,解码 <span style="color: black;">CPU</span> 消耗,渲染是高内存消耗;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">回流、重绘会<span style="color: black;">引起</span> <span style="color: black;">CPU</span>&nbsp;内存增长;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">巧用合成层会减少 GPU 内存消耗,要避免层爆炸。</p>
    <span style="color: black;">照片</span>渲染过程 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">IO;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">解码(CPU 解码,位图 -&gt; GPU);</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">渲染管线 (顶点计算 / 光栅化 / 片元着色 / 帧缓冲渲染到屏幕)。</p><span style="color: black;">照片</span>内存<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">位深 (color depth (32 /24 …)。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">尺寸 (<span style="color: black;">照片</span>分辨率)。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">体积 (磁盘存储所需<span style="color: black;">体积</span>)。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">照片</span>占用显存的计算方式如下:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">width * height * (colorDepth/8) /(1024 * 1024)= X (M)</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">1024 * 1024 * (32/8)/(1024 * 1024) = 4M</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">能够</span>看出<span style="color: black;">照片</span>尺寸<span style="color: black;">针对</span>内存的影响<span style="color: black;">很强</span>。</p>
    优化手段 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">照片</span>压缩 / <span style="color: black;">照片</span>裁剪;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">GIF&nbsp;抽帧,<span style="color: black;">GIF</span> <span style="color: black;">根据</span> 12fps 抽帧;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">动画降帧,Lottie <span style="color: black;">根据</span>设计帧率运行,并降低至 12fps;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">互动题题版,运行时按需加载;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">GIF</span> <span style="color: black;">做为</span>合成层渲染,GPU 降低较<span style="color: black;">显著</span>;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">信令发送频率及数据量降低;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">白板<span style="color: black;">关联</span>优化<span style="color: black;">触及</span>内容较多,不在<span style="color: black;">这儿</span>阐述;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Cocos 框架优化,在上一部分内容播放器优化里有介绍。</p>
    总结 <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">黑白屏降至千分位;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">追查问题<span style="color: black;">有效</span>;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">繁杂</span>度降低,迭代成本降低;</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">单一内容问题,不影响后续播放。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><strong style="color: blue;"><span style="color: black;">作者介绍:</span></strong></span></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">张士标,作业帮直播课堂前端团队负责人,致力于课件、互动系统的<span style="color: black;">连续</span>性能优化和探索。</span></p>




wrjc1hod 发表于 2024-10-30 15:07:30

感谢你的精彩评论,为我的思绪打开了新的窗口。
页: [1]
查看完整版本: 作业帮直播间前端架构优化实践