javafx中gif 内存优化

news2024/11/18 15:36:46

1.背景

桌面程序对内存消耗要求很高,基本的要求是整个程序控制在500M以内。
这就要求每个功能点的内存消耗尽可能地少,大于50M的内存消耗就要想办法优化。

2.现状

gif的显示会导致程序的内存激增。以数字大脑用的雷达图动画为例进行说明,下面这个图片的尺寸为4.45M。

在这里插入图片描述

2.1. 使用Image组件显示

在javafx中,使用如下代码进行显示:
在这里插入图片描述
未显示gif的内存如下:
在这里插入图片描述
显示gif时的内存如下:
在这里插入图片描述
小结:未显示gif前的内存为15M,显示了gif之后的内存为125M,大约占用内存110M。

2.2. 对比Chrome

而这张图片放到chrome中显示的话,仅占用24M。
在这里插入图片描述

3.目标

以chrome的内存占用作为标杆。目标是将内存占用控制在25M以内。

4.分析

先看一下是否是javafx的bug。通过google,发现 javafx 2 在显示gif的时候存在内存泄露的bug,但 javafx 8 中这个bug已经被修复了,当前用的是 javafx 8,故而没有内存泄露。

通过阅读源码发现,gif图片在加载的时候,会将所有的帧都加载到内存中,如下图所示:
在这里插入图片描述
示例的gif图片总共有185帧,尺寸为370370,每个像素点占用空间为4B(RGBA),占用内存:185 370 370 4 ≈ 97M。

原因小结:Image组件会将gif的所有的帧都加载至内存中,这直接导致了内存占用过高。

5.对策

5.1. Gif图像有损处理

  • 方案一,减少gif图片的尺寸和帧数。比如:将长和宽都减少为原来的1/2,则占用的内存将只有原来的1/4。比如:减少帧的数量为原来的1/2,则内存占用将只有原来的1/2。

5.2. Image组件改造

 针对image组件进行改造。
  • 方案二,Image组件或者其依赖的类中,有无参数可以配置为不加载所有帧至内存中。
  • 方案三,github等平台上有无其它Image组件,不加载所有帧至内存中的。

5.3. 其它加载动画的方式

我们的目的是显示动画,动画显示方式有多种,可以是gif,也可以视频、javafx动画、svg等。

  • 方案四,将gif转换为mp4,然后调用MediaPlayer来播放mp4。
  • 方案五,使用javafx 的动画api来编写动画。
  • 方案六,将gif转换为svg,然后播放。

6.计划

从方案一至方案六依次尝试。

7.跟进

方案一,缺点:减少尺寸,可能图片会变模糊,尤其在高分屏下面。减少帧数量,可能会使动画变得不流畅。如果其它方案都不行了,再用这种方案。
方案二,找不到相关的配置参数。
方案三,找不到相关的组件。
方案四,将gif转成mp4后再播放,效果非常好,占用内存约为2M。下面详细介绍这种方法。

7.1. gif转换成mp4

使用在线转换器来将gif转换为mp4,链接如下:
https://convertio.co/zh/gif-mp4/

7.2. 代码
在这里插入图片描述

7.3. 效果
未播放mp4之前的内存如下:
在这里插入图片描述

播放mp4时的内存如下:
在这里插入图片描述

通过对比,可以发现内存占用大约为2M。
7.4. 小结
使用mp4来播放动画内存占用较少,效果很好,超出了之前设定的目标。
剩下的2个方案,方案四和方案五,以后有时间的话,再去尝试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TypeScript 学习笔记总结(一)

ts学习笔记总结。 文章目录一、什么是TypeScript?二、TypeScript 环境搭建三、TS 类型声明四、TS 类型详解五、TS 类型总结六、TS 编译选项1. tsconfig.json的 作用2. tsconfig.json的 配置选项013. tsconfig.json的 配置选项02七、Webpack 打包ts代码一、什么是Typ…

Bayanay:一款基于Python开发的无线网络安全研究工具

关于Bayanay Bayanay是一款基于纯Python开发的无线网络安全研究工具,在该工具的帮助下,无论你身处何地,都可以轻松地对周围地区的无线网络安全状况进行研究与分析。 该工具可以通过使用HTML5的地理位置定位功能并结合Scapy获取到的SSID信息…

LeetCode刷题系列 -- 25. K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值&…

zabbix6,0创建监控项与触发器

zabbix_server IP : 172.31.0.5:10051 zabbix_client IP : 172.31.0.9:10050 zabbix_client已经运行了zabbix-agent,这里我用的是版本2 一、 创建监控项 1、 在客户端创建监控脚本 /etc/zabbix/zabbix_agent2.d #默认配置文件路径 2、 创建配置文件,编写监控脚本…

绿光GOQDs-SA氧化石墨烯量子点CdTe-FA-CS修饰CdTe-PEG-CS的制备

绿光GOQDs-SA氧化石墨烯量子点CdTe-FA-CS修饰CdTe-PEG-CS的制备今天小编分享制备GOQDs改性SA复合杂化膜,一起看看吧:GOQDs改性SA复合杂化膜的制备过程:将一系列不同分子量的CS及接枝壳聚糖用少量乙酸-乙酸钠溶液溶解后,加水稀释到一定浓度,用…

经典文献阅读之--FlowFormer(Transformer结构光流估计)

0. 简介 对于视觉SLAM而言,除了使用特征点法来完成VIO以外,还可以使用光流法来完成VIO的估计。而传统的光流法受环境,光照变化严重,所以有时候会出现光流偏差等问题。所以现在有越来越多的工作朝着深度学习的方向扩展&#xff0c…

卷积神经网络中的Conv层和BN层融合细节

BN层 批归一化层(Batch Normallization)是一种在卷积神经网络模型中大量使用,为了加速模型收敛的技术。为什么CNN 中引入 BN 层可以加速网络的收敛呢?因为将输入的样本数据或特征图,归一化后,改善了输入数…

智云通CRM:如何在初次见面识别客户机会?

有一次,我给一家公司做CRM系统培训之后,他们公司的老总请我吃饭。那是我们第一次见面,在饭桌上,我和他聊天,说:“洛老师,你们的CRM系统功能真的很不错,帮我我解决了很多销售管理上的…

设计模式面试题 一

第一题:阐述设计模式的责任链? 责任链模式定义: 使多个对象都有机会处理请求,从而避免请求的发送 者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一 个对象处理它为止。 …

Ruoyi-Cloud框架学习-【03 后端启动 + 前端启动】

打开运行基础模块(启动没有先后顺序) 记得在后台先启动Redis,不然会报错 RuoYiGatewayApplication (网关模块 必须) : 即前端所有访问需要通过网关而不是直接访问具体接口、网关会对后台的微服务进行转发 RuoYiAuth…

虹科回顾 | 虹科云科技2022年深度好文

2022年,我们一起学习了很多技术文章、优秀案例 我们的关键词是 数据库、BI、文件存储、高性能计算、数据管理、IT 下面一起来回顾虹科云科技过去一年的深度好文吧! 2022虹科云科技深度好文回顾 点击文字均可跳转到相关文章 数据库系列 ● 虹科产品 | 一文详解…

springboot1

让我们快速构建项目并且运行,他就是搭建程序的脚手架 尽可能减少一切xml的相关配置 快速创建一个spring boot的启动项目 在pom.xml中导入父类的启动器 引入父类的依赖 下面我们写一个web的启动器 这个启动器导入了之后 整个web项目需要的依赖也就导入了 并且把版…

【MIUI刷机】旧机降级记录

欢迎来到 Claffic 的博客 💞💞💞 前言: 小米MAX2是我的第一部小米手机,这款发布于2017年5月25日的小米手机已伴随我5年了,现在再次拿起这部手机,依然能勾起我对当时手机圈的记忆。 当时的我对手…

顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-群集方案

群集方案 群集介绍 在大规模的外呼或者呼入系统,比如整个系统需要1万并发,单机最高也就3000-5000并发,这时候就需要多机群集了。顶顶通呼叫中心中间件使用redis数据库,多个FreeSWITCH(mod_cti)连接同一个redis就可以很容易的配置…

基于乾元通多卡聚合智能通信系统的典型应用场景分析

紧急事态处置 城市公共安全包含自然灾害事故灾难、公共卫生事件、社会安全事件、事故灾难,在城镇化快速发展的今天,作为维护公共安全的职能部门,带来了新的挑战。 乾元通科技使用多径混传、多路聚合技术,开发出的智能融合通信设备…

五款非常轻便的实用小工具

大伙们,开工大吉! 1.系统清理——WiseCare365 WiseCare365是由WiseCleaner开发的一款用来管理,维护,配置以及解决电脑故障的适用于Windows操作系统的电脑的免费软件。其实Wise Care 365就是把这个公司之前推出的所有优化工具整合…

Redmi GPro游戏本升级系统失败无法启动怎么办?

Redmi GPro游戏本升级系统失败无法启动怎么办?有用户使用Redmi GPro电脑去进行电脑系统的升级时,出现了系统升级错误。在电脑关机重新启动之后,电脑出现了蓝屏的情况。那么遇到这个问题要怎么去进行解决呢?来看看具体的解决方法吧…

美颜滤镜sdk常用的图形处理算法、代码分析

美颜滤镜sdk目前在视频、图文社交平台中的使用率是非常高的,特别是短视频平台和直播平台。今天小编就为大家讲解一下美颜滤镜sdk经常用到的算法和代码。 一、预处理算法、检测算法 在采集完图像后,首先会对图像进行预处理操作。保证图像的对比度清晰&…

c:out标签怎么是使用?

在JSP页面中&#xff0c;最常见的操作就是向页面输出一段文本信息&#xff0c;为此&#xff0c;Core标签库提供了一个<c:out>标签&#xff0c;该标签可以将一段文本内容或表达式的结果输出到客户端。如果<c:out>标签输出的文本内容中包含了需要进行转义的特殊字符&…

css字体、文本

无衬线字体(sans-serif) 特点: 1.文字笔画粗细均匀&#xff0c;并且首尾无装饰 2.场景:网页中大多采用无衬线字体 3.常见该系列字体:黑体、Arial3 衬线字体(serif) 特点: 1.文字笔画粗细不均&#xff0c;并且首尾有笔锋装饰 2.场景:报刊书籍中应用广泛 3.常见该系列字体:宋体、…