如何在不使用BitmapData.draw()的情况下快速旋转构成BitmapData的像素?

时间:2011-12-29 05:45:09

标签: actionscript-3 bitmap rendering rotation

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

copyPixels基本上只是将内存块从一个BitmapData对象复制到另一个BitmapData对象。转换像素(例如,缩放,旋转,剪切等)方式更加CPU密集。事情就是这样,并没有什么神奇的方法可以改变这一点。即使您会找到另外一个执行这些操作的库,我怀疑它会比原始实现更快,因为它必须在纯ActionScript中实现,并且无法像本机命令那样进行优化。

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

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

总的来说,我会采用最简单的方式,只使用{{1}}。创建一个测试用例,用于绘制估计的最大并发精灵数,并对其进行分析,以查看性能影响是否过大,以至于值得实施上述任何变通方法。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

  • 如果旋转是固定的(例如,每30度),则创建一个具有不同旋转的精灵表,并使用copyPixels()
  • 将位图数据转换为位图,并在其他图形前面旋转位图。如果要经常删除/添加,请使用对象池以避免实例化成本。尽管内存使用量较大,但使用cacheAsBitmapMatrix可以更快地进行旋转。
  • 查看制作旋转的着色器。
  • 不要旋转bitmapdata。 。 。围绕它旋转世界。
  • 让动画真的很慢,所以没有人注意到。如果你可以逃脱它,这实际上是一个很好的建议。 。 。降低帧速率直到blitting影响不明显。