[转]位图数据内存优化
来源:互联网 发布:网络教育在职教育 编辑:程序博客网 时间:2024/06/06 09:08
最近协助同事对Flash相册项目做了程序优化,觉得每个优化步骤的试验结果都挺有价值,所以在这里做一个记录分享。
项目现状
Flash相册程序,在播放60张图片后(60是相册图片数量上限),内存占用接近1G。
当前技术实现
使用Loader加载图片文件,然后新建BitmapData对Loader进行draw*作保存位图数据,随后loader.unload()释放原始图片资源。播放某一张图片时,取出对应的位图数据,根据当前播放窗口大小进行平滑缩放,随后生成Bitmap对象,展现。
优化思考1:所有已加载的图片都保存其位图数据,导致内存占用过大。那么可以考虑**位图数据对内存的占用总量,如果位图数据内存占用超出一个设定值(比如200MB)后销毁离当前播放index最远的图片位图数据。
问题:由于已加载数据可能会被销毁,所以会经常发生图片需要再次加载的情况,影响相册观看流畅度。另外,通过测试发现,即使设定一个比较宽松的上限值(比如200MB),也只能容纳几张图片的位图数据。
该方法损失了用户体验,但问题仍然没有得到较好解决。
优化思考2:BitmapData位图数据占用内存过大,如果Loader加载图片文件后不转化为位图数据,而直接保存loader对象,会不会减小内存占用?
经过试验发现,一个1280*800的jpg(130K),通过Loader加载进舞台并显示,不做任何处理,内存占用高达4MB。将loader对象从舞台上remove掉,只保留引用,内存占用仍不见减少。同时此做法会带来一个问题,loader对象的直接缩放会产生锯齿,这对相册程序而言是不可以接受的。
此路不通。
优化思考3:既然直接保存BitmapData对象很吃内存,那么我通过JPGEncoder将其转化为ByteArray再进行保存,势必会减少开销。需要使用图片时,再通过loader.loadBytes来加载ByteArray数据。
经过试验发现,经过JPGEncoder转化后的ByteArray数据很小,只占用几十KB内存,效果明显。使用loader.loadBytes加载ByteArray显示也很顺利很流程。但一个致命的问题出现了,JPGEncoder执行效率非常低下,即使只是宽高1280*800的BitmapData,转化过程也会长达6秒之久(我的机器配置不低),更糟糕的是,由于Flash是单线程运行环境,所以此*作会导致整个界面卡住,程序陷入假死状态。
(延伸阅读:使用Vector优化JPGEncoder执行效率 异步JPGEncoder)
优化思考4:经Laan提醒,想到ByteArray不需要通过对BitmapData数据JPGEncode来做,通过URLLoader指定BINARY方式读取图片文件,其data属*就是JPG或者其它压缩格式的ByteArray数据。
试验通过,问题终于得到顺利解决。
优化效果
经过上述优化,60张图片播放后,内存占用仍然不到100M,优化效果显著。
最后,说一下如何强制Player进行垃圾回收
如果只想在Debug Player中使用,则可以使用System.gc();
如果想在所有运行环境都能运行,则可以使用下面这一段垃圾回收触发代*(查看原帖):
try {
new LocalConnection().connect(“gcHacker”);
new LocalConnection().connect(“gcHacker”);
} catch (e:Error) {
}
- [转]位图数据内存优化
- 位图数据内存优化
- 内存块中的数据转存入位图
- 如何根据内存数据生成位图
- AcstionScript位图保存技术及相关内存优化
- 如何将内存中的位图数据绘制在DC上
- 如何将内存中的位图数据绘制在DC上
- Delphi下16进制位图数据转位图
- 绘制内存位图
- 位图内存管理方法
- 管理位图内存
- 创建彩色内存位图
- 位图内存溢出
- [转]由内存对齐讨论想到位图旋转
- Android加载数据ListView优化内存实现
- 【转】Java内存优化
- 位图法存数据
- BMP位图数据
- 网管必备 网络DOS命令实例
- NYOJ-138 找球号2【Hash】
- 备份恢复4.2——rman恢复基础概念
- 3.3 类之间的关系 UML, 类图
- jqgrid客户端排序
- [转]位图数据内存优化
- 第十三周实验报告(任务一)【虚函数、多态性、抽象类】
- autoconf/automake 使用笔记
- Asp.net日期字符串格式化显示
- 第十三周任务二(抽象类的应用)
- svn服务器、客户端安装配置及eclipse的svn插件安装
- 定时创建用户群标签索引
- 修改eclipse debug的代码源文件
- 探测路由地址