【问题标题】:AS3 bitmapData.Draw is very inefficientAS3 bitmapData.Draw 效率很低
【发布时间】:2013-11-03 11:57:57
【问题描述】:

我在 Flash CS6 中使用 ActionScript 3 和 Adob​​e AIR 3.4

我正在尝试将文件系统中的图像加载到位图中。

我当前的代码是:

var loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
loader.load(new URLRequest("assets\\" + filename));

private function loadComplete(e:Event):void
{
    //add to bitmap
    bitmap = new Bitmap();
    bitmap.bitmapData = new BitmapData(loader.width, loader.height, true, 0x000000);

    bitmap.bitmapData.draw(loader);
}

但是,bitmapData.draw 的性能非常低效(图像为 2048x1536)。 我试过了:

bitmap.bitmapData = e.target.content.bitmapData;

但不影响性能。而且还是很慢。

如何将加载器中的图像加载到位图中而不会出现如此缓慢的性能。

【问题讨论】:

  • 使用 drawWithQuality 和使用 StageQuality.LOW 对提高性能没有任何帮助
  • 是绘制慢还是文件加载慢?您区分这两个过程之间的时间了吗?此外,慢是相当模糊的,用秒或毫秒等实时单位表示延迟会很有帮助。
  • 绘制很慢,加载很快。我不知道绘制的确切时间,但它是 1-2 秒(这不好,因为我正在编写游戏)
  • 你是如何区分绘制时间和加载时间的?您多久加载/绘制此位图?
  • 我注释掉了抽奖代码,没有等待时间

标签: performance actionscript-3 flash air bitmap


【解决方案1】:

当您加载带有Loader 的图像时,您已经获得了Bitmap。那你为什么要draw() 变成另一个呢?

这样做:

private function loadComplete(event:Event):void
{
    bitmap = loader.contentLoaderInfo.content as Bitmap;
}

【讨论】:

  • 我希望它就这么简单,但它并不能解决性能问题。
  • 你对你原来的问题发表评论,如果你不draw(),就没有延迟。您还在将位图绘制到另一个中吗?如果您确实需要这样做,请查看copyPixels (help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…)
  • 有非常轻微的延迟(因为我在这段代码执行后调用copyPixels 48 次。我正在使用一个精灵表,首先我加载加载器,将它放在位图中(问题在这个问题),然后将 48 个单独的图像复制到一个数组中。
  • 但是您应该跳过将加载的图像放入位图中的步骤,因为它已经是位图