Actionscript 3 如何在不使用BitmapData.draw()的情况下快速旋转构成BitmapData的像素?
我一直使用在画布上绘制图形(Actionscript 3 如何在不使用BitmapData.draw()的情况下快速旋转构成BitmapData的像素?,actionscript-3,bitmap,rendering,rotation,Actionscript 3,Bitmap,Rendering,Rotation,我一直使用在画布上绘制图形(位图) 我需要在不使用的情况下旋转生成的图形,因为它的速度要慢得多 如何旋转目标图形?我假设可能有一个公式或库,我可以使用它,首先根据原点(点)和弧度重新组织构成图形的像素 我很确定我没有能力创建这样的逻辑,所以如果有任何已知的库能够做到这一点,那就太棒了 我想实现一些类似于XNA的方法,它接受旋转作为其第五个参数。我将使用矩阵。网上有很多例子,我喜欢这一个,它简短而中肯 有些想法,但速度未经测试: 如果旋转是固定的(例如,每30度),请创建具有不同旋转的精灵图纸,
位图
)
我需要在不使用的情况下旋转生成的图形,因为它的速度要慢得多
如何旋转目标图形?我假设可能有一个公式或库,我可以使用它,首先根据原点(点)和弧度重新组织构成图形的像素
我很确定我没有能力创建这样的逻辑,所以如果有任何已知的库能够做到这一点,那就太棒了
我想实现一些类似于XNA的方法,它接受
旋转
作为其第五个参数。我将使用矩阵。网上有很多例子,我喜欢这一个,它简短而中肯 有些想法,但速度未经测试:
- 如果旋转是固定的(例如,每30度),请创建具有不同旋转的精灵图纸,并使用
copyPixels()
- 将位图数据制作成位图,并在其他图形前面旋转位图。如果要频繁地进行删除/添加,请使用对象池以避免实例化成本。使用cacheAsBitmapMatrix可以加快旋转速度,但会占用更多内存
- 研究如何制作一个进行旋转的着色器李>
- 不要旋转位图数据。围绕它旋转世界李>
- 使动画非常非常慢,所以没有人注意到。这其实是一个很好的建议,如果你能侥幸逃脱。降低帧速率,直到无法察觉光点影响
copyPixels
基本上只是将内存块从一个位图数据对象复制到另一个对象。变换像素(如缩放、旋转、剪切等)需要更多的CPU。事情就是这样,没有神奇的方法可以改变这一点。即使您会找到另一个库来做这些事情,我怀疑它会比本机实现快多少,因为它必须在纯ActionScript中实现,并且不能像本机命令那样优化
如果您正在对场景进行布点(例如,将精灵复制到更大的BitmapData
canvas),并且必须使用大量精灵执行大量旋转,然后,最好的方法是将离散量的渲染步骤渲染到BitmapData
,然后使用copyPixels
复制最接近所需旋转的旋转。这样,您将在初始化时只使用一次慢速绘制
,然后从那时起使用快速复制像素
还有另一种绘制旋转位图的方法,通过使用新的3D API,您可以简单地渲染纹理四边形,您可以在不降低性能的情况下旋转、缩放和移动到任何程度。这将是最接近XNAsdraw
实现的方法,但它需要您完全转储blitting(绘制到位图
)
总的来说,我会使用最简单的方法,只使用BitmapData.draw
。创建一个测试用例,绘制您估计的最大并发精灵,并对其进行分析,以查看性能影响是否太大,是否值得实施上述任何解决方法。我发现了一些类似的解决方法,但它们都使用draw()
,这比copyPixels()
要慢得多。是否有一种方法可以将BitmapData
实例中的像素洗乱,使其显示为旋转,然后使用copyPixels()
静止?因此。您是在将像素复制到新对象之前还是之后尝试旋转位图数据?或者你在乎哪一个?@iND哪一个更快,但我感觉它们都是一样的。copyPixels之所以如此快,是因为它不需要应用任何矩阵乘法,因此不必根据变换的结果推断各种像素的值。copyPixels是直接拷贝。draw()方法是实现所需操作的最快方法。如果您正在努力克服draw()方法的速度减慢,请在各种给定旋转中预绘制位图数据,然后选择最接近的旋转。