2014-05-23 41 views
0

这里是我的代码节约影片剪辑需要较长的时间在AS3

var bitmapData:BitmapData = new BitmapData(1080,1920); 
bitmapData.draw(zoomall_mc); 
trace("after draw"); 

var jpgEncoder:JPGEncoder = new JPGEncoder(80); 
var byteArray:ByteArray = jpgEncoder.encode(bitmapData); 
trace("in save 2"); 

var fileReference: FileReference = new FileReference(); 
fileReference.save(byteArray, "imageno.jpg"); 
trace("after save"); 

这个代码需要很长的时间之间的“平局之后”和“节省2” 执行,使我的应用程序没有响应的那个时候。 我不知道为什么会发生这种情况。

是否有任何其他方式来保存设备中的动画片段。

你的帮助表示赞赏。 thanx。

+2

对ByteArray进行编码是一项冗长的操作。 /线程 – Vesper

+1

特别是在使用AS实现时。 [**'BitmapData.encode()'**](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#encode())应该更快,但仍然[**阻止**](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/Worker.html)... – ndm

回答

2

问题是,你试图让我们说它将你的视觉表示'转换'为数据(ByteArray)。这需要时间,因为它正在检查每个像素(再次表示基本)。

而在你的情况下,你甚至会应用压缩,这会让事情变得更糟。

首先,在操作之前和之后使用getTimer,以便您可以检查实际需要多少时间。

其次 - 这是一个全高清位图,这是肯定的。当您知道压缩时间时,您可以尝试通过降低图像质量或缩小图像来优化压缩时间。

三,最有可能的工作 - 你应该使这个操作异步。通常的编码是同步的,这意味着除非此操作结束,否则不会执行其他代码。所以你会想将这个操作分成块并让其他代码也执行。你不想要那种蹩脚的冰冻,对吧?异步编码器每帧将对少量图像进行编码,并且在一段时间后,整个图像将准备就绪。

这里的缺点是它比平时慢。几乎所有我见过的编码器都比内置和优化的编码器慢几次。上次我使用它时,对于普通的高清图像,它花费了3到4秒,而内置的功能却是100ms。

但无论如何,它会做你的工作没有冻结。只需试一试,然后用getTimer再次检查时间。

这里有几样: