企鹅电竞VAP动画组件停留最后一帧画面
一、 简介
VAP(Video Animation Player)是企鹅电竞开发的一款用于播放视频动画的组件库,其开源于:
- 腾讯工蜂:https://git.code.tencent.com/Tencent_Open_Source/vap
- Github:https://github.com/Tencent/vap
二、 问题现状
VAP播放动画采用的TextureView方式来提供Surface展示画面,在播放视频结束后,会清空动画画面,如果我们有需求需要让动画停留在画面最后一帧,当前是不支持的,跟VAP相关开发同事沟通,其解释是:播放动画期间,通过Home键或手势回到桌面,即应用在后台时,在部分机型上,TextureView会被移除,导致应用回到前台后会显示黑屏或空内容,在该兼容性问题解决之前,不对外提供停留最后一帧画面的能力。
因此,对于有该需求的使用者,需要自行改造源码,使其支持这样的能力。
三、 问题分析
对于采用GLSurfaceView+自定义Renderer+播放器的方案,每一帧画面纹理数据回调时,通过GLSurfaceView#requestRender
来主动通知OpenGL进行渲染,渲染时先进行清屏操作,然后才是GL变换操作,这种方案下,最后一帧画面渲染结束后,如果不主动清屏,画面会停留在最后一帧。
受此启发,推测VAP在动画回调结束前后,主动执行了清屏操作。
VAP动画回调结束的方法是:IAnimListener#onVideoComplete
,倒推其调用的地方:
clearFrame
的具体实现为:
在解码完成时,会执行该方法,在渲染线程中:
- 清空GPU缓存画面
- 释放解码器资源
- 释放纹理资源
- GL环境解绑纹理
- 回调动画结束
而回调动画结束最后在AnimView中:
会去移除TextureView:
在TextureView中,当自身从窗口移除时:
会去销毁窗口,释放纹理等。
因此,要解决这个问题,需要同时处理两个地方:
- GL清屏的操作
- 移除TextureView的操作
四、 解决方案
这里不罗列具体的代码,大致思路分为四点:
- AnimView增加api:
setAutoDismiss
,内部维护变量autoDismiss
,以便在动画结束时判断是走原始逻辑销毁画面还是保留最后一帧画面。 - 在AnimView中,如果
autoDismiss
为false,则在onVideoComplete
回调中不执行hide
操作。 - 在HardDecoder#release中,如果
autoDismiss
为false,则不执行GL的清屏操作clearFrame
。 - 主动销毁时,移除相关的TextureView,执行GL的清屏操作,需要注意的是,后者需要在渲染线程,要确保执行清屏时线程仍存活。这样一来纹理数据才能得到及时释放,避免内存泄漏,引发GPU OOM。
企鹅电竞VAP动画组件停留最后一帧画面相关推荐
- 【开源公告】企鹅电竞多渠道打包组件VasDolly正式开源
VasDolly VasDolly是一个极速多渠道打包组件,同时支持基于V1和V2签名进行渠道打包.组件本身会自动检测Apk使用的签名类别,并选择合适的多渠道打包方式,对使用者来说完全透明. V1.1 ...
- 企鹅电竞weex实践之UI篇
随着电竞业务的不断发展,页面功能越来越多,交互逻辑更加复杂,类似无限滚动.上拉刷新.横竖切换滚动等形式在业务中已是标配,经过重重优化后在H5中的体验一直达不到理想状态,没错,种种卡,H5的性能太差! ...
- 企鹅电竞weex实践——UI开发篇
腾讯DeepOcean原创文章:dopro.io/egame-weex-- 随着电竞业务的不断发展,页面功能越来越多,交互逻辑更加复杂,类似无限滚动.上拉刷新.横竖切换滚动等形式在业务中已是标配,经过 ...
- mfc程序转化为qt_以“企鹅电竞小程序”改版为例,讲解如何将用户核心路径转化为设计语言...
前言 用户路径是指用户达到目标时一系列的操作.我们可以将用户在产品中由开始到结束的整个过程划分成很多节点,用户从一个节点到另一个节点的过程可以被视为是一条路径.用户路径主要分为两种:一种是用户找寻信息 ...
- weex android 性能,跨越适配性能那道坎,企鹅电竞Android weex优化
作者:龙泉,腾讯企鹅电竞工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 企鹅电竞从17年6月接入weex,到现在已经有一年半的时间,这段时间里面,针对遇到的 ...
- Flutter 布局之企鹅电竞
本人主要在知乎上发布相关Flutter文章,知乎了解下: https://www.zhihu.com/people/qiang-fu-5-67/activities 我们来实战剖析下"企鹅电 ...
- Weex实战分享|企鹅电竞Weex实践和性能优化
渠宏伟 企鹅电竞前端团队Leader H5页面存在的问题 H5页面对比终端的不足,第一,加载慢:第二,交互差. 加载耗时比较长,因为它受限于Webview,Webview在Android上启动就比较慢 ...
- 企鹅电竞宣布将于6月7日终止运营
4月7日消息,企鹅电竞官网今日发布退市公告,称由于业务发展策略的变更 ,<企鹅电竞>(包括其网页端.App端.PC端.TV端.H5.微信小程序)以及<企鹅电竞直播助手>(包括其 ...
- python 发送企鹅电竞弹幕(简单版)
相信大家在看过小编上次的获取弹幕,也一定想要知道怎么发送弹幕.那么今天小编也来介绍一下怎么发送弹幕. 但是事先声明,小编也不喜欢水军.希望大家能不破坏弹幕界的和谐和安宁.如果你玩啥水军,官方把规则改了 ...
最新文章
- mcDropdown使用方法
- docker学习笔记(四)——Dockerfile创建自定义镜像
- 【NLP】Doc2vec原理解析及代码实践
- 关于报表中汇率转换的问题
- 你们觉得生一个孩子好,还是生两个孩子好?
- 012.成型版回声服务器
- windows客户端连接linux服务器上的postmaster
- python graphviz_Python中Graphviz的输出问题
- arcgis伪节点检查_ARCGIS 拓扑检查步骤与修正拓扑错误技巧
- access数据库应用系统客观题_Access数据库程序设计模拟题
- 80题题目+AC代码汇总 ~ 南阳 NYOJ
- php 方差函数,PHP应用:PHP基于方差和标准差计算学生成绩的稳定性示例
- 比尔盖茨的十条“金玉良言”
- 【未解决】pyrit:Scapy 2.x is required to use Pyrit‘s analyze/attack functions but seems to be unavailab
- ADG备库mrp和rfs进程
- 【IPv6】NS,NA 报文学习
- 电脑怎么搜索重复文件?如何快速找到重复文件?
- 9patch / NinePatch 详解及使用
- 【ceph】Ceph 存储中 PGMap、OSDMap 和xxMap
- var 与 varp