导读
快手科技旗下 AcFun 宣布:开源 Android 平台弹幕引擎 AkDanmaku。该引擎主要针对移动平台短视频播放中的弹幕场景提供包含弹幕流程与数据处理、弹幕展现以及特效处理等功能的全场景解决方案,具备功能全面、高性能、易扩展和维护等特性。
文 / ChangyiZ、Xana
编辑 / finn
本文共2286字,预计阅读时间8分钟。
#
AkDanmaku
#
核心特色
游戏引擎架构的跨界应用
高性能
功能特点
扩展与维护
#
总结与展望
快手科技旗下 AcFun 宣布:开源 Android 平台弹幕引擎 AkDanmaku。该引擎主要针对移动平台视频(直播)播放中的弹幕场景提供包含弹幕流程与数据处理、弹幕展现以及特效处理等功能的全场景解决方案。
AkDanmaku 采用了游戏引擎开发理念,基于 ECS 架构打造底层图形处理框架,并结合原生平台特性,提供上层的弹幕 UI 和动效处理等能力。
游戏引擎架构的跨界应用
libGDX 游戏开发框架的应用
该引擎基于 libGDX - Java[1] 跨平台游戏开发框架打造出 Android Native 图形处理框架。
作为一个成熟的 Java 跨平台游戏开发框架,libGDX 不仅基于 OpenGL(ES)封装了图形处理能力,且通过提供扩展协议,经过多年积累形成了愈发完备的生态圈。
在本项目中:
我们可以使用 OpenGL API 封装直接进行复杂的图像化处理和动效展现,也可以基于 libGDX 标准内核扩展实现基于原生平台(canvas API)的绘制流程。
可以使用 libGDX Extension 中的 ECS 封装 ashley[2] 便捷地管理和封装 ECS 框架。
可以使用 libGDX-box2d[3] 物理引擎实现弹幕的特殊运动特效。
ECS
Entity Component System(ECS)开发框架广泛应用于游戏引擎和应用开发,基于数据驱动,尤其适用于围绕终端展现流程处理。其核心思想是通过 Composite 模式解决传统继承模式的适用性问题,以及模块之间解耦。
Problem:
Resolved:
如上图所示,在传统继承模式下,类似 EvilTree 的结构很难被归纳和抽象。但如果采用 ECS 架构,只需针对所需属性,挑选 Components 形成切面便能组合形成对应的抽象概念。
在下文的弹幕处理流程和结果图中也能看出,引擎内部各个运算系统面向各个环节所需的 Components 组合切面筛选出对应的 Entities(实体集)依次进行逻辑处理和运算。
弹幕处理流程
如下图所示,引擎内的各个 System 都专注于某个具体环节中的专项运算,依据代表不同特征的 Components 属性集形成切面并处理得出对应的结果产物。由弹幕数据流驱动,并最终形成直接用于绘制的 RenderObject List (渲染对象列表)。
Engine 基本结构
如下图所示,整个引擎在结构上分为面向开发者的 SDK 模块和底层内核。
SDK 层中 DanmakuView 与 DanmakuPlayer 的设计参考了 Android 原生平台的视频播放场景(VideoView & MediaPlayer)的 API 设计,具有通俗易懂、调用方便的特性,且将 UI 展现与 API 调用分离,有利于应用场景中的共享和复用。
底层内核 DanmakuEngine 包含基于 libGDX 框架实现的 ECS 管理器,负责建立、维护 ECS 系统,并作为弹幕 API 的内部调用实现。其中,act() 与 draw() 方法分别为弹幕运算与绘制的入口。
高性能
1.结合原生平台特性,设计与实现多线程调度模型,将渲染、逻辑处理分离,保证性能。
运算流程:ActionThread 负责流程中的数据处理和逻辑运算,最终的处理结果转化为可用于显示环节直接使用的 RenderObject List,并通知系统进行下一帧的刷新。
绘制流程:RenderThread 专注于弹幕绘制,通过拿到运算流程的结果数据 - RenderObject List 直接调用原生平台的绘制 API 进行弹幕绘制,并通知引擎准备下一帧的结果运算。
缓存流程:CacheThread 专注于整个流程中的缓存处理。
2.具备缓存机制,提升性能和空间利用率。
缓存流程就像一个「来料加工」工厂,接受 Act 线程发送来的物料,在已废弃的位图池中寻找一块大小适中的画布,或重新申请,在缓存线程将弹幕绘制到上面。
位图缓存池
这是一个独立实现的、有空间上限的缓存池,其特点是 acquire 方法附带尺寸,在获取池中位图时,须满足这一尺寸,不可超出阈值。release 时,按照大小释放空间。
对象缓存
由于渲染流程中存在大量的对象渲染,JVM 下会造成频繁的 GC,弹幕库对频繁创建的对象进行了池化,分别是:
1.ECS 系统中的对象如 Entity、Component等,以及较为复杂的对象如 RenderObject,使用 ECS 中自带的 Poolable,配合 PoolableEngine 自动池化。
2.其他如 Size、Point、Matrix 等,使用 Android 原生的 Pool 进行池化。
功能特点
支持基本的弹幕处理和显示、倍速播放等
支持弹幕悬停等交互响应操作
支持丰富的弹幕文本样式,以及自定义样式扩展
支持丰富的运动动画效果
扩展与维护
AkDanmaku 引擎不仅实现了完备的弹幕处理和展现功能,还针对数据源(DataSource)、布局器(DanmakuLayouter)、渲染器(DanmakuRenderer)以及动画系统(ActionSystem)提供便捷的自定义和扩展能力。其自身 ECS 架构也便于后续进一步完善功能和扩展二次开发。
AkDanmaku 弹幕引擎结合了移动平台原生渲染流程和游戏引擎的架构理念,在提供完备功能和高性能保障的前提下,提升了扩展性,降低了维护成本,使得开发高级弹幕特效功能变得更容易。
在项目前期,技术团队采用基于开源游戏引擎技术的实现方案,利用游戏引擎体系,简化特效处理和功能开发,同时实现跨平台、三端(Android/iOS/Web)同步开发。但在集成过程中,技术团队发现存在包大小、性能和跨端调用开销等问题。受平台限制和维护成本等因素影响,团队最终确定基于 Android、iOS 各自 native 平台打造自研图形处理框架,并对弹幕场景进行统一处理和封装。
未来,我们希望这套依托游戏引擎的架构应用于更广阔的功能和特效场景,为移动平台应用和游戏混合开发模式提供新思路。
GitHub 地址:https://github.com/KwaiAppTeam/AkDanmaku
欢迎加入
快手主站技术部客户端团队由业界资深的移动端技术专家组成,通过领先的移动技术深耕工程架构、研发工具、动态化、数据治理等多个垂直领域,积极探索创新技术,为亿万用户打造极致体验。团队自2011年成立以来全面赋能快手生态,已经建立起业内领先的大前端技术体系,支撑快手在国内外的亿万用户。
在这里你可以获得:
提升架构设计能力和代码质量
通过大数据解决用户痛点的能力
持续优化业务架构、挑战高效研发效能
和行业大牛并肩作战
我们期待你的加入!请发简历到:
app-eng-hr@kuaishou.com
点击“阅读原文”