
动效作为产品与用户沟通的重要形式,不断演进发展。本文依据业务需求,全面对比常用Web动效格式的差异,调研优秀特效播放方案,经改造实现功能升级,以满足如直播间及语聊房礼物特效等多样化业务场景需求。
在直播间及语聊房等场景中,礼物特效作为常见增值玩法,用户对其多样性需求持续增长。近期业务期望参照抖音实现定制跑车特效,通过用户个性化选配送出多样礼物,满足用户独特及炫耀心理。
最初看到定制跑车特效需求时,考虑通过游戏引擎实现,提出以下两种方案及面临的问题:
鉴于上述方案的局限性,需重新寻找更优解决方案。
Web动效有多种格式,各有利弊,从业务需求出发选取相对较优方案至关重要。以下是常见动效格式的详细分析:
GIF87a和GIF89a两个版本。GIF89a版本支持透明。<img src="http:xxx.gif" />
.png。<img src="xxx.png" />
<img src="xxx.webp" />
npm install lottie-webimport lottie from 'lottie-web'
lottie.loadAnimation({
container: xxxElement,
renderer: 'svg',
loop: true,
autoplay: true,
path: 'xxx.json'
});
Lottie相似且性能表现更佳。Lottie。npm i svgaimport { Parser, Player } from 'svga'
const parser = new Parser()
const svga = await parser.load('xxx.svga')
const player = new Player(document.getElementById('canvas'))
await player.mount(svga)
player.start()
<video src='xxx.mp4' />MP4格式虽有诸多优点,但不支持透明度这一缺点明显。为此,提出视频融合方案解决该问题:
将MP4看作由数帧图片组成,利用AE导出同步的Alpha视频并拼接,使视频包含完整RGB和Alpha信息。Web开发者提取相关信息融合为新的RGBA值,渲染到屏幕实现半透明效果。
介绍了获取视频每帧、解析及重新渲染的相关原理及涉及的代码操作等内容,同时分析了在实现过程中遇到的问题及应对思路。
参考优秀案例实现原理,开发AlphaVideoPlayerJs,以下是其相关介绍:
Canvas2D对每帧图片遍历解析,但存在CPU计算频率高、浏览器表现不佳甚至页面崩溃等问题。Canvas2D的问题,尝试使用WebGL进行图形化渲染,经测试有效降低了CPU使用率。devicePixelRatio恢复canvas尺寸,保证渲染效果。webgl-render,兼容降级采用canvas2d-render。遵循最小化配置、开箱即用原则,默认配置渲染DOM和视频地址即可使用,展示了实际使用效果动图。
介绍多视频融合的原理,通过多纹理渲染,根据要渲染的video个数动态生成片元着色器代码,将多个纹理颜色叠加混合得到最终要渲染的颜色,并展示了最终效果及单部件视频效果动图。
对比了4个单独的mp4播放器与一个多纹理视频播放器播放4个mp4视频时的CPU占用情况,多纹理视频播放器性能提升约30%。
Alpha MP4虽有优势,但长时间或无间断重复性播放可能带来性能问题。动效实现方式多样,应分析各动效格式优缺点,结合业务需求选择最佳实践方式。
欢迎大家在评论区留言讨论,分享更多关于Web动效实现的想法和经验。