Android性能优化 _ 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用

2023-11-03

(ps:粗斜体表示引导方案逐步进化的关键点)

SurfaceView逐帧解析 & 帧复用

简单回顾下上一篇的内容:原生帧动画在播放前解析所有帧,对内存压力大。SurfaceView可以精细地控制帧动画每一帧的绘制,在每一帧绘制前才解析当前帧,且解析后续帧时复用前帧内存空间。遂整个过程在内存只申请了一帧图片大小的空间。下面罗列了一些关键代码:

基类:定义绘制框架
public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

//绘制线程
private HandlerThread handlerThread;
private Handler handler;

@Override
public void surfaceCreated(SurfaceHolder holder) {
startDrawThread();
}

private void startDrawThread() {
handlerThread = new HandlerThread(“SurfaceViewThread”);
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
handler.post(new DrawRunnable());
}

private class DrawRunnable implements Runnable {
@Override
public void run() {
try {
canvas = getHolder().lockCanvas();
//绘制一帧,包括解码+绘制帧
onFrameDraw(canvas);
} catch (Exception e) {
e.printStackTrace();
} finally {
getHolder().unlockCanvasAndPost(canvas);
onFrameDrawFinish();
}
//若onFrameDraw()执行超时,会导致下一帧的绘制被推后,预定的帧时间间隔不生效
handler.postDelayed(this, frameDuration);
}
}

protected abstract void onFrameDraw(Canvas canvas);
}

//帧动画绘制类:将绘制内容具体化为一张Bitmap
public class FrameSurfaceView extends BaseSurfaceView {

private BitmapFactory.Options options;

@Override
protected void onFrameDraw(Canvas canvas) {
clearCanvas(canvas);
if (!isStart()) {
return;
}
if (!isFinish()) {
//绘制一帧
drawOneFrame(canvas);
} else {
onFrameAnimationEnd();
}
}

private void drawOneFrame(Canvas canvas) {
//解析帧
frameBitmap = BitmapFactory.decodeResource(getResources(), bitmaps.get(bitmapIndex), options);
//复用帧
options.inBitmap = frameBitmap;
//绘制帧
canvas.drawBitmap(frameBitmap, srcRect, dstRect, pai

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android性能优化 _ 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用 的相关文章

随机推荐

  • 说说对npm的开发模式和生产模式的理解

    nodejs这些年的发展非常快 相信没有哪个前端不知道的了 npm也成为了前端开发中经常用到了的一个命令 那么npm不是只用一个 npm install xxx 命令就够了吗 实际上并不是这样 发现有些团队在使用npm的时候没有认真去搞懂n
  • Web自动化测试11:Selenium之frame切换、多窗口切换

    更多功能测试以及全套学习路线图均在专栏 戳进去领取 Web自动化测试01 认识web自动化在什么项目中适用 Web自动化测试02 Web自动化测试工具选择大全 Web自动化测试03 Selenium安装配置 详细教程 Web自动化测试04
  • Java 后端工程师的书单推荐

    拒绝盗版 从你我做起 源码圈 众胖友协作完成 希望书单能在你想要进一步打怪升级的路上 给予些许帮助 建议先收藏本书单 认真啃完一本再买下一本 扎实走完每一步 部分书籍关联相关博客和微信公众号 让你更嗨皮 如果对你略有帮助 烦请分享给你的基友
  • Linux 内存管理

    文章目录 前言 连续分配 单一连续分配 分区式分配 固定分区分配 动态分区分配 可重定位分区分配 离散分配 分段 分页 多级页表 快表 TLB 段页式 Linux 前言 Linux 内存管理 虚拟内存管理 虚拟内存空间 虚拟内存分配 Lin
  • SpringBoot如何使用WebSocket+jsch实现前后端交互获取服务器log并返回前端?

    一 导入依赖
  • [阶段4 企业开发进阶] 5. Netty新编

    文章目录 1 NIO 基础 1 1 NIO 三大组件 Channel Buffer Selector 1 2 ByteBuffer 总结ByteBuffer用法 ByteBuffer结构 调试工具类 常见方法 分散读取 集中写入 粘包半包
  • 解决element-ui的tab栏切换样式的问题

    1 出现如上情况 用element ui同样也可以实现 2 实现难度在于 用css画出来的三角可以实现 三十由于父盒子宽度不够 会被默认隐藏 此时我们需要抬高下划线和三角形 如何用伪类让后面的线也抬高 代码如下 v deep thing t
  • 在linux上强制停止进程应该用哪个命令,如何在Linux系统中使用命令终止无响应进程...

    有多种工具可用于从命令行终止无响应或挂起的进程 包括kill pkill和killall 这些命令通过向这些无响应的进程发送特定信号来工作 您将需要进程ID或PID信息 以便可以向他们发送所需的终止信号 您可以使用命令来检索无响应进程的PP
  • java两个jsonobject对象合并_Java:将两个json对象与主键合并在一起

    假设我在内存中有两个 JSONObject数组 每个对象都有一个在两个数组中相似的键 数组1 name Big Melons Co location Inner City Dubai id 1A name Pear Flavored Jui
  • CGI与FastCGI

    当我们在谈到cgi的时候 我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求 并将存储在服务器上的HTML文件返回给浏览器 也就是静态html 事物总是不 断发展 网站也越来越复杂 所以出现动态技术 但是服务器并不能直接运
  • [激光原理与应用-48]:《焊接质量检测》-5-德擎先进激光过程诊断系统ALPAS分析

    目录 第1章 概述 第2章 产品特性与功能 2 1 传感器 2 2 主机数据分析系统 第3章 工作原理 第4章 系统组成 第5章 案例分析 第1章 概述 先进激光过程诊断系统 ALPAS Advanced Laser Process Ass
  • 高德地图key验证失败:[INVALID_USER_SCODE]

    高德地图key验证失败 INVALID USER SCODE key错误 错误出现原因 如果是在非打包情况下 电脑直接安装 调试 调试版安全码SHA1 一定要填写 否则会报key错误 不填只能打包成apk文件再安装 如果修改了依然报错 那么
  • 解决垃圾回收难题,提升Android应用性能的技巧

    Android应用程序在运行过程中可能会遇到内存溢出 Memory Out of Bounds 和内存泄漏 Memory Leak 的问题 这些问题会导致应用程序性能下降 响应变慢甚至崩溃 内存溢出 Memory Out of Bounds
  • springboot部署到服务器遇到的SSL证书问题

    错误 javax net ssl SSLException java lang RuntimeException Unexpected error java security InvalidAlgorithmParameterExcepti
  • Pycharm使用教程 (非常实用)

    一 PyChram下载 官网 http www jetbrains com pycharm Windows http www jetbrains com pycharm download section windows Linux http
  • 【STL】模板概念+STL介绍

    模板 Template 模板就是C 实现代码重用机制的一种工具 它可以实现类型参数化 即把类型定义为参数 从而实现了真正的代码可重用性 可以使用模板来定义函数和类 当你定义一个如下函数 想要计算一个数的平方 int square int x
  • sql中用什么替代in

    IN和EXISTS 有时候会将一列和一系列值相比较 最简单的办法就是在where子句中使用子查询 在where子句中可以使用两种格式的子查询 第一种格式是使用IN操作符 where column in select from where 第
  • CVE-2019-0708 远程桌面代码执行漏洞复现

    0X00 靶机 漏洞环境 我当时就是虚拟机装了Windows7 SP1的系统 一下就ojbk 你们没有 就下载装吧 使用VM安装Windows7 SP1模拟受害机 Windows7 SP1下载链接 这里的靶机是使用清水表哥提供的win7sp
  • SOA:原理•方法•实践,第 1 部分: SOA 的基本概念

    SOA 原理方法实践 的第 1 章从概念上对 SOA 给出一个全面而精炼的总体描述 首先说明 SOA 的特点 以及使用 SOA 对系统进行架构决策和设计的必要性 然后介绍了 SOA 的参考体系结构 设计原则及相关技术的简介 查看本系列更多内
  • Android性能优化 _ 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用

    ps 粗斜体表示引导方案逐步进化的关键点 SurfaceView逐帧解析 帧复用 简单回顾下上一篇的内容 原生帧动画在播放前解析所有帧 对内存压力大 SurfaceView可以精细地控制帧动画每一帧的绘制 在每一帧绘制前才解析当前帧 且解析