【问题标题】:Compressing BitmapData压缩位图数据
【发布时间】:2011-06-22 06:36:06
【问题描述】:

情况是这样的:

我编写了一个简单的 MovieClip 替换,将现有的导入 MovieClip 转换为 BitmapData 序列。这消除了 Flash 在每帧上渲染 MovieClip 中的矢量数据的要求。

但是 BitmapData 具有巨大的内存占用。我尝试将 BitmapData 转换为 ByteArray 并使用 compress() 方法。这导致显着更小的内存占用。但事实证明这是不切实际的。对于每次重绘,我尝试解压缩()字节数组,然后使用 SetPixels 将数据传送到屏幕上,然后重新压缩()帧。这可行,但速度非常慢。

所以我想知道是否有其他人有我可以尝试的方法。在Flash中,是否可以在内存中压缩位图数据并快速blit到屏幕上?

我想知道原生动画 GIF 在 Flash 中是如何工作的。它是在后台将它们解压缩为 BitmapData,还是在运行中完成帧解压缩?

也许有一个 Alchemy 项目试图对压缩图像进行 blit 处理?

感谢您提供的任何建议:)

【问题讨论】:

    标签: actionscript compression bitmapdata


    【解决方案1】:

    @thienhaflash 的反应很好,但已经老化了一年,从那时起 Flash Player 和 AIR Runtime 扩展了它们的功能。今天我偶然发现了来自Adobe's AS3 Guide 的这个小消息。从播放器 11.3 开始,可以使用本机图像压缩技术。这是一个sn-p:

    // Compress a BitmapData object as a JPEG file. 
    var bitmapData:BitmapData = new BitmapData(640,480,false,0x00FF00); 
    var byteArray:ByteArray = new ByteArray(); 
    bitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray);
    

    不确定 blitting 的实用性,但它可以在本地完成。

    【讨论】:

      【解决方案2】:

      对于内存保留,您需要在将 MovieClip 转换为位图序列之前三思而后行。真的有这个需要吗?你能把事情分解一下,因为有几件事情(比如背景)是静态的(或者只是四处移动)为什么不为每个元素缓存位图而不是一个大的位图序列?

      我通常只将 AnimatedBitmap(位图序列替代影片剪辑的名称)用于小尺寸动画图标和其他繁重的计算内容(如火焰/烟雾效果......)。尽可能多地分解事物!

      据我所知,没有办法压缩位于内存中的 BitmapData 使用的内存,并且没有任何与 Alchemy 相关的内容可以帮助改善在这种情况下使用的内存。

      动画 GIF 本身无法在 Flash 中运行,您需要一些库来做到这一点。从 bytearray.com 搜索 AnimatedGIF as3 库,实际上该库只是读取原始 byteArray 中的 gif 文件并像您所做的那样转换为动画位图。

      【讨论】:

        【解决方案3】:

        这是一个老问题,但最近有关于此的信息:jackson Dunstan 已经使用 bitmapdatas 运行过,结果证明从压缩源获得的位图数据在一段时间未使用后会“缩小”。 这里是文章:http://jacksondunstan.com/articles/2112,以及文章开头提到的两个。

        所以你绝对可以做这样的事情:

        var byteArray:ByteArray = new ByteArray(); 
        myBitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray);
        var loader = new Loader();
        loader.addEventListener(Event.COMPLETE, function(_e:Event):void{
          if(loader.content is Bitmap){
            myBitmapData.dispose()
            myBitmapData= Bitmap(loader.content).bitmapData;
          }
        });
        loader.loadBytes(byteArray);
        

        我不确定它是否会按原样工作,您肯定希望更好地处理您的记忆。但是现在,myBitmapData 会在您尝试读取时解压缩,然后在您大约十秒钟不使用时重新压缩。

        【讨论】:

        • 了解这一点非常有用。我想知道这种行为是否也出现在移动设备上
        • 我真的不知道,但我不明白为什么会有任何不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多