【问题标题】:How can I quickly rotate the pixels that make up BitmapData without using BitmapData.draw()?如何在不使用 BitmapData.draw() 的情况下快速旋转构成 BitmapData 的像素?
【发布时间】:2012-01-29 16:02:30
【问题描述】:

我一直在使用 BitmapData.copyPixels() 在画布上绘制图形 (Bitmap)。

我需要在不使用draw() 的情况下旋转生成的图形,因为它要慢得多。

如何旋转目标图形?我假设可能有一个公式或库可供我使用,它将首先根据原点(点)和弧度重新组织构成图形的像素。

我很确定我无法创建这样的逻辑,所以如果有任何已知的库可以做到这一点,那就太棒了。

我想实现类似于 XNA 的 SpriteBatch.Draw() 方法的东西,它接受 rotation 作为它的第 5 个参数。

【问题讨论】:

  • 所以。 . .您是在将像素复制到新对象之前还是之后尝试旋转 BitmapData?还是你在乎哪个?
  • @iND 哪个更快,但我感觉它们会是一样的,所以要么。
  • copyPixels 之所以这么快,是因为它不需要应用任何矩阵乘法,因此不必推断各种像素的值作为转换的结果。 copyPixels 是直接复制。 draw() 方法是您需要的操作的最快可用方法。如果您正在为 draw() 方法的减速而苦苦挣扎,请在各种给定的旋转中预先绘制 BitmapData,然后选择最接近的旋转。

标签: actionscript-3 bitmap rendering rotation


【解决方案1】:

我会使用矩阵。网上有很多例子,我喜欢这个,简短而中肯。 http://www.psyked.co.uk/actionscript/rotating-bitmapdata.htm

【讨论】:

  • 我发现了一些类似的,但他们都使用draw(),这比copyPixels()慢得多。有没有办法将BitmapData 实例中的像素洗牌以显示旋转,然后仍然使用copyPixels()
【解决方案2】:

一些想法,但速度未经测试:

  • 如果旋转是固定的(例如,每 30 度),请创建具有不同旋转的精灵表,并使用 copyPixels()
  • 将位图数据制作成位图,并将位图旋转到其他图形的前面。如果要频繁删除/添加,请使用对象池来避免实例化成本。使用 cacheAsBitmapMatrix 可以加快旋转速度,但会占用更多内存。
  • 考虑制作一个进行旋转的着色器。
  • 不要旋转位图数据。 . .围绕它旋转世界。
  • 让动画变得非常非常慢,所以没有人注意到。如果您能侥幸逃脱,这实际上是一个很好的建议。 . .降低帧速率,直到 blitting 影响不明显。

【讨论】:

    【解决方案3】:

    copyPixels 基本上只是将内存块从一个BitmapData 对象复制到另一个对象。转换像素(例如,缩放、旋转、剪切等)方式更多地占用 CPU。事情就是这样,没有什么神奇的方法可以改变它。即使你会找到另一个库来做这些事情,我怀疑它会比原生实现更快,因为它必须在纯 ActionScript 中实现,并且不能像原生命令那样进行优化。

    如果您正在对场景进行 blitting(例如,将精灵复制到更大的 BitmapData 画布)并且您必须使用大量精灵执行大量旋转,那么最好的方法是渲染离散量的渲染步骤到BitmapData,然后使用copyPixels 复制最接近所需旋转的旋转。这样,您将在初始化时只使用一次慢速 draw,然后从那里开始使用快速 copyPixels

    还有另一种绘制旋转位图的方法,通过使用新的 3D API,您可以简单地渲染带纹理的四边形,您可以旋转、缩放和移动到任何程度而不会降低性能。这将是最接近 XNA 的 draw 实现,但它需要您完全转储 blitting(绘制到 Bitmap)。

    总的来说,我会采用最简单的方法,只使用BitmapData.draw。创建一个测试用例,绘制您估计的最大并发精灵并对其进行分析,以查看性能影响是否如此之大以至于值得实施任何上述解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多