最近协助同事对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) {
}
分享到:
相关推荐
本篇文章将详细探讨“24位图转16位图工具”所涉及的知识点。 首先,我们来了解24位BMP(BITMAP24)图像。24位BMP图像提供了8位红、8位绿和8位蓝通道,总共24位,能够显示约1670万种颜色,这被称为真彩色。这种格式...
将24位位图转换为16位位图的过程涉及色彩空间的压缩和优化,目的是减少文件大小,提高处理效率,尤其是在内存有限或者需要快速显示图像的场合。以下是这个过程中的关键步骤和知识点: 1. **读取24位位图**: 首先,...
1. **内存优化**:处理大尺寸位图时,内存消耗是个关键问题。为了减少内存占用,可以考虑分块处理或者使用内存映射文件等技术。 2. **性能优化**:位图旋转通常涉及大量的浮点运算,对CPU性能有一定要求。可以通过...
在给定的描述中提到了一个自定义的DIB(Device Independent Bitmap)类,这个类可能包含了处理位图数据的核心功能。DIB是一种Windows系统中广泛使用的位图格式,它允许位图在不同的设备上保持一致的显示效果。在DIB...
Oracle数据库的内存优化是提升系统性能的关键环节。内存主要分为两个部分:系统全局域(SGA)和程序全局域(PGA)。 SGA是Oracle数据库实例的核心组成部分,它是一组共享的内存结构,用于存储数据库实例的数据和控制...
位图数据会被缓存在GPU内存中,当内存达到饱和,系统可能需要将部分数据回滚到CPU内存,这会导致显著的性能降低。博主进行的实测可能包括创建不同大小的位图、加载多个位图、位图的复用和释放等,以测量它们对内存的...
1. **读取图像数据**:程序首先需要读取输入位图的像素数据,包括颜色深度、宽度和高度等信息。 2. **解析颜色模式**:对于不同颜色深度的位图,需要根据其颜色表(对于16色和256色位图)或RGB值(对于24位色位图)...
LCD 24位图转565格式的数据转换是针对这种需求的一种技术处理。转换过程主要包括以下步骤: 1. **读取BMP文件**:BMP是Windows操作系统中常用的位图文件格式,它以未经压缩的原始像素数据存储图像。24位BMP文件的每...
- **文件头**:包含文件类型、文件大小、保留字段和位图数据起始位置。 - **位图信息头**:包括位图的宽度和高度、颜色平面数、位每像素、压缩方法、图像大小、水平分辨率、垂直分辨率以及使用的颜色数和重要的颜色...
综上所述,J2ME开发中的代码优化和内存优化涉及到多个方面,包括代码结构、数据结构选择、资源管理等。通过阅读压缩包中的文档和教程,开发者可以深入了解这些技术,提升J2ME应用的性能和用户体验。
这个"Bitmap位图旋转范例"工程可能还包含了优化旋转性能的策略,比如使用`BitmapShader`进行位图的内存优化,或者在特定情况下使用`BitmapRegionDecoder`来解码部分图像,避免一次性加载大图导致内存溢出。...
在Android平台上,电池和内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨一系列针对Android设备电池寿命和内存管理的优化策略、工具以及方法。 一、电池优化 1. **减少唤醒源(Wakelocks)**:...
8. **内存管理与性能优化**:处理大量图像文件时,需要注意内存管理和计算效率。例如,可以批量读取和处理图像,而不是一次性加载所有文件,以防止内存溢出。 9. **错误处理和兼容性**:编写转换程序时,需要考虑到...
内存优化是计算机科学中一个关键的领域,尤其是在现代高性能计算和大数据分析中,对内存的高效利用至关重要。内存优化的目标是提高系统性能,减少程序运行时间,降低内存占用,以及优化内存访问模式,以实现更流畅的...
3. **内存管理**:由于旋转可能导致位图尺寸变化(例如,从方形变为矩形),因此可能需要分配新的内存来存储旋转后的DIB。这涉及到动态内存分配,使用如`malloc`或`VirtualAlloc`等函数,并确保在操作完成后正确释放...
位图转换程序是一种工具,主要用于将图像数据在不同的位深度之间进行转换。在这个特定的案例中,我们关注的是从16位565格式的位图转换为24位位图,然后再进一步转换为8位256色的位图。这种转换在图形处理和图像显示...
同时,对于大尺寸的位图,可能需要分块处理,避免一次性处理大量数据导致内存溢出。 7. **错误处理**:在编写程序时,不要忘记添加适当的错误处理代码,如检查位图文件是否成功加载,处理可能的除零错误等。 8. **...
开发者可以通过指定文件路径,将位图数据加载到内存中,或者将内存中的位图数据保存到文件。 2. **图像显示**:库可能包含用于在窗口或控制台上显示位图的功能,这对于用户界面或游戏开发来说非常实用。 3. **裁剪...
4. **内存管理**:为了优化性能,位图数据可能需要缓存在内存中。同时,要注意内存限制,因为老款NOKIA手机的内存资源相对有限。 5. **动画和交互**:在动态应用中,可能需要更新位图以实现动画效果或响应用户输入...