Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何在不使用BitmapData.draw()的情况下快速旋转构成BitmapData的像素?_Actionscript 3_Bitmap_Rendering_Rotation - Fatal编程技术网

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,您可以简单地渲染纹理四边形,您可以在不降低性能的情况下旋转、缩放和移动到任何程度。这将是最接近XNAs
draw
实现的方法,但它需要您完全转储blitting(绘制到
位图


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

我发现了一些类似的解决方法,但它们都使用
draw()
,这比
copyPixels()
要慢得多。是否有一种方法可以将
BitmapData
实例中的像素洗乱,使其显示为旋转,然后使用
copyPixels()
静止?因此。您是在将像素复制到新对象之前还是之后尝试旋转位图数据?或者你在乎哪一个?@iND哪一个更快,但我感觉它们都是一样的。copyPixels之所以如此快,是因为它不需要应用任何矩阵乘法,因此不必根据变换的结果推断各种像素的值。copyPixels是直接拷贝。draw()方法是实现所需操作的最快方法。如果您正在努力克服draw()方法的速度减慢,请在各种给定旋转中预绘制位图数据,然后选择最接近的旋转。