无线端的弹幕实现方案

简介:


前段时间做了游戏的相关业务,其中弹幕相关的内容自成一块。弹幕已经不只是最初的视频弹幕了,战火已经烧到了评论区,烧到了手机淘宝的首页搜索结果。作为一种近几年迅速燃起的内容呈现形式,有必要适时引入,对于休闲化、娱乐化的业务更是如此。那么,要做出一个较为完整的弹幕效果来,需要哪几个部分呢?尤其是,在集团内部,怎么快速地搭建起一个可用的弹幕框架来?本文分3块来阐述。

  1. 弹幕渲染层
  2. 弹幕数据通道
  3. 弹幕服务逻辑

弹幕渲染层

目前弹幕的呈现载体主要是Web、无线客户端。因为我们的工作主要针对无线端,所以本文主要以无线端为例——包括iOS,Android两类系统。

碰撞检测

弹幕无非是动画,是分布在时间轴上图像的连续运动。自然可以用Native的动画来实现。不过弹幕动画有一个重要的特征,即保持动画元素(sprites)尽可能少地碰撞,以使弹幕承载的信息能够清晰地传达,执行碰撞检测是必须的。但弹幕里的碰撞检测相对简单,因为弹幕的运动轨迹相对简单并且容易预测,所以只需要在一条弹幕将要显示之前,根据已经显示的弹幕(位置、速度、活跃的时间等)来确定他的运动轨迹。以尽最大可能地在其生命周期内不与已有弹幕冲突。

弹幕碰撞检测范例

弹幕的同步问题

弹幕不是超然而独立的,往往相伴业务场景而生,目前可见最多的场景是视频,直播或者录播皆有。到此时则涉及到一个时间同步的问题。比如,一位用户在看一段时间第314s的时候突然有感而发,发出了一条弹幕,自然希望其他观众能够在看到视频此刻看到他的弹幕。所以一条弹幕上屏的时间是需要明确的,想想那些年文不对题的字幕君吧。那么,如何实现呢?一般,可以为一条弹幕提供一个时间点delay,当到了这个时刻,由控制器把这条弹幕播放出去。但仅仅这些是不够的,因为视频还存在暂停,存在快进快退,所以你必须也为弹幕组件提供类似的接口,以期能和视频内容同步。其他的应用场景也是类似的。比如下面的样子(弹幕在向左运动):

弹幕的样式

弹幕的运动样式主要有两种,一种是横向的过场弹幕,一种是纵向的浮动弹幕。弹幕的内容形式不外乎一段文字或者图片,其中以文字为主。对于文字,则有文字的颜色、背景、字体、边框等属性,这一切必须是灵活可配的。当然实际应用中一个APP需要的是风格统一的、优雅美观的弹幕动画。所以弹幕的方向不要太混乱,不要有太多不一样的主题配置。你可以定义几类色调协调但样式不同的弹幕,然后由业务代码决定使用哪一种风格的弹幕。

渲染效率

性能直接关系到用户体验。在绝大多数场景中,锦上添花的弹幕往往伴随着具体的业务逻辑,业务逻辑会占用CPU——甚至很高的CPU,比如视频解码———所以弹幕动画应该尽可能地使用GPU渲染。为应对线上可能的大规模弹幕的情况,本地最好也能测试到大量弹幕的情况。可以使用一个定时器,模拟客户端频繁接受渲染弹幕的情况,看看实际中弹幕的性能究竟如何。

限流

弹幕稀稀疏疏地铺满半屏窗口,朦胧中犹抱琵琶半遮面的感觉,自然是最好的。但万一遇到弹幕决堤,内容疯狂涌来,那当如何应对?渲染内容层层堆叠,既看不清,又降低了系统应用性能,为此可以在业务或者组件中选择限流。

弹幕数据层

若不考虑弹幕在用户间共享,只需下图左侧的模块即可;若需引入弹幕共享、存储功能,则如下图右侧所示。

简要结构图

但实际情况往往比这复杂。弹幕很多时候是实时的,最好使用长连接来传输数据。业务导向的项目,很少从零开始开发专门的弹幕服务通道,而是尽可能地应用已有的服务组件。淘宝在长连通道上有多个选择,但其功能又是不尽相同的。这种不同也会带来弹幕实现方案的不同。比如通道A支持订阅功能,消息会根据订阅关系分发;而通道B是单纯的通道,订阅关系由业务方维护,凡是发送到客户端的消息都会接收,所以流量需要业务服务端来控制。

经过服务端的必要性

仅仅使用长连接通道是不够的,还需引入业务服务器,其原因如下:

  • 如果长连通道不支持客户端发送消息,那么弹幕的发送要走其它的接口
  • 因业务原因,需要统一多个长连接通道,以便更好地做 多端同步,故引入中间服务器做协调
  • 一些业务相关的需求,不适合在长连接服务器上做,比如内容过滤、弹幕存储、服务端限流等

整体的数据流如下图所示:

详细结构图

消息格式制定

通过长连接传输的弹幕消息会有一些附加数据需要考虑,比如弹幕的样式、出现的时间,随着业务的扩展,可能需要更多的辅助字段。所以弹幕消息必须能够向后兼容,一般可设置为message,version两个字段,message为纯粹的json字符串,version表示消息的版本号。先解析version,根据判断得到的version选择响应的解析样式。太多的附加信息会降低数据的利用率,此是需要权衡的地方。当然,如果针对的是在线视频业务,弹幕的流量相比于视频流而言,就显得不那么重要了。

自发的弹幕消息

主要有两种:

  1. 用户发送了弹幕消息后,通过网络发送消息的同时直接将弹幕数据上屏,以提升用户所见即所得的体验;当收到相同的弹幕消息后,将消息抛弃。
  2. 用户发送了弹幕消息后,通过正常的网络接收消息然后渲染呈现,这样会因延时损失一定的用户体验,但逻辑简单,并且可以控制所有弹幕数据。

弹幕服务层

主题维护

主题代表弹幕消息围绕的中心。在不同的业务场景中,主题的呈现方式可能是不同的。在视频直播业务中,主题代表了一个个直播房间,弹幕围绕着视频展开;在新闻咨询业务中,主题代表了一则则新闻,弹幕围绕着新闻展开。客户端与主题存在多对一的关系,如下图所示:

主题房间维护

用户U1、U2订阅了主题T1,用户U3、U4订阅了主题T2。由于处于不同的语境中,U1、U2发送的弹幕U3、U4应该是不能接收到的,反之亦然。很自然服务端需要维护一个用户到主题的映射表简单的实现是,客户端监测到用户进入特定主题之后,发送一条网络请求登记这样一条订阅;用户离开特定主题时发送网络请求注销登记。但由于实际客户端运行场景复杂,离开特定主题不一定来得及发送网络请求。补充方案是,由客户端每隔特定时间心跳一次,用以告知服务端维护映射表。一旦服务端一段时间没有监听到心跳信息,就取消映射表中的一条订阅。这里需要注意的是,服务端需要防止心跳的伪造,否则可能映射表可能会因攻击而混乱掉。一旦映射表正确建立,用户发送的弹幕消息就可以准确传达到相同主题的用户客户端了。

弹幕存储

对于直播等即时性业务,弹幕数据一般没有重播的必要;但是对于录播,则需要持久化弹幕,如是方能在其他用户看视频的时候看到其他人发出过的弹幕消息。持久化这类弹幕数据,必须在存储弹幕的时候带上弹幕对应的时间点。在用户进入了某一主题之后,批量返回给客户端对应的弹幕数据,由客户端将弹幕数据对应到视频业务响应的时间点上;如果此主题对应的弹幕数据很多,服务端可能实现做一定的筛选;对于录播同时新发送的弹幕,则由服务端记录并添加到对应的弹幕数据列表中。

转载自:http://taobaofed.org/blog/2016/05/13/barrage-in-mobile/

作者:拂铭

目录
相关文章
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
594 1
|
监控 Java Shell
基于python+uiautomator2,2020.12月最新库的使用方法,更新watcher使用方法(三)
WatchContext,目前的这个watch_context是用threading启动的,每2s检查一次 目前还只有click这一种触发操作
1898 0
|
SpringCloudAlibaba 应用服务中间件 Nacos
SpringCloud Alibaba系列(二) Nacos高可用和持久化
  测试环境可以使用单机版,但是上了生产环境,为了保证系统的高可用,必须要做好相应的数据持久化和高可用,nacos默认采用了apache的内置数据库derby,但是不方便观察数据存储的情况,所以需要配置数据库,目前支持mysql,为了保证Nacos单节点故障,我们为采用集群部署,通过nginx分发到nacos,保证了nacos高可用。
357 1
|
3月前
|
存储 人工智能 JSON
构建AI智能体:五十四、智能投资顾问的两种实现:反应式与深思式实践策略对比
反应式与深思熟虑式智能投资顾问架构代表了AI在投资咨询领域应用的两种不同哲学和实践路径。反应式架构以其快速响应、高可扩展性的特点,适合标准化、高并发的咨询场景;而深思熟虑式架构通过深度推理、个性化服务为复杂投资决策提供专业支持。未来智能投顾的发展方向不是二选一,而是通过混合架构实现优势互补。金融机构应根据自身业务特点、客户群体和技术能力,选择合适的架构组合策略。对于追求极致用户体验的机构,可以优先部署反应式架构快速获客;对于服务高净值客户的机构,则应重点建设深思熟虑式架构提供深度服务。
396 8
|
6月前
|
SQL 存储 关系型数据库
MySQL为什么被广泛使用
MySQL凭借其卓越的技术特性、成熟的开源生态和持续创新,成为数据库领域领军者。它以高性能、高可用性和广泛的社区支持,赢得从初创公司到世界500强企业的广泛采用。本文深入解析MySQL持续成功的背后原因。
|
安全
全息技术有哪些应用?
【6月更文挑战第27天】全息技术有哪些应用?
1038 4
|
数据管理 数据处理 数据库管理
数据管理DMS上线托管Dify免费邀测中
数据管理DMS支持托管Dify,提供从Notebook开发、数据处理、模型构建到大模型应用开发的一站式Data+AI集成解决方案。借助Dify平台,简化企业智能化落地流程,了解更多详情,请访问[官方文档](https://help.aliyun.com/zh/dms/dify-invited-test/)。
|
云安全 人工智能 安全
|
弹性计算 运维 数据安全/隐私保护
【雾锁王国开服】阿里云一键部署雾锁王国联机服务器详细教程
阿里云提供雾锁王国服务器搭建教程,借助计算巢服务,用户可在3分钟内创建Enshrouded游戏服务器。8核32G服务器1个月109元,3个月327元;4核16G10M带宽1个月30元,3个月90元。需先注册并实名认证阿里云账号,然后通过傻瓜式一键部署入口进行购买和设置,包括地域、购买时长、服务器参数等。部署完成后,分享服务器信息给游戏伙伴,即可开始游戏。详细教程和更多配置信息可在阿里云ECS产品页查看。
542 0
|
安全
猿大师办公助手在线编辑微软Office/金山wps网页组件COM加载项启用说明
猿大师办公助手是一款独特的在线编辑Office插件,不同于其他厂商的弹窗模式,它真正实现了网页内嵌本机Office。其COM加载项可在Office主菜单栏增加PageHi子菜单,提供文件保存、打印等功能,并能控制文档操作权限。安装后,默认自动启动COM加载项,但需注意可能被禁用或拦截,必要时需手动启用。对于WPS和微软Office,均有详细的启用步骤。
584 5
猿大师办公助手在线编辑微软Office/金山wps网页组件COM加载项启用说明

热门文章

最新文章