2011-04-11 94 views
2

我正在制作一个项目,该项目以帧速率连续绘制圆圈,并在舞台上为它们制作动画,并且遇到性能问题。动作脚本比位图更快吗?

我已经将所有对象转换为静态的bitmapData。我的问题是,一旦他们绘制增加性能将圆形转换为bitmapData?换句话说,是动画说,200位图(透明度)比200矢量圆更快?

这种技术有什么缺点吗? (我想可能是不透明的问题?)

如果他们比圆形更复杂的形状会答案不同?

提高性能的任何其他提示?

非常感谢!

+0

如果您只需要您在那里描述的内容,则可以将DisplayObject的属性'cacheAsBitmap'设置为true。 – 2011-04-11 18:56:30

+0

啊是的!我忘了cacheAsBitmap!多年来没有用过它。它有很多帮助,但仍然存在一些复杂形状的问题。硬件加速怎么样?这会有帮助吗? – cronoklee 2011-04-11 19:05:00

+0

我不知道,但你真的不应该太担心。你能告诉我们你到底想要做什么吗? – 2011-04-11 21:12:58

回答

2

有可能会考虑在这里的几个方法:在矢量渲染

  1. 赌注通过绘制你的线条和圆圈每一帧。他们每次都会重新渲染,但这就是Flash进行了大量优化的原因,所以这可能比替代方案更快。 (请注意,在绘制不同尺寸的对象的每个帧可能比图纸它们各自成Sprite和改变其大小更快。)针对载体渲染

  2. 赌注通过前后移动位图。一个简单的方法来做到这一点(假设你用AS3绘制形状)将绘制形状到Bitmap对象,然后移动这些对象。你可能不满意结果的不协调。启用位图平滑将有助于(但会降低性能)。
    注意:cacheAsBitmap可能不会做你想要的,因为缓存的位图会在对象更改大小(不确定透明度)时被重绘。

  3. 投注硬件加速使用cacheAsBitmapMatrix。这仅在AIR中可用,因此它可能不适用于您。 CABM与cacheAsBitmap类似,但不会在重新调整内容时重新绘制内容。此外,在许多情况下,位图被交给硬件,因此可以在GPU上重新缩放。我相信有些平台虽然不起作用。这通常非常快,特别是在移动设备上。

  4. 在AS3位图处理的投注通过blitting到一个舞台大小的BitmapData的东西。但是请注意,即使你这样做,你仍然需要决定是否将图形绘制到每个帧的大位图中(如选项1),或者将它们绘制到各个位图中,然后将这些(转换后)的图像转换为每个帧中的大位图(如选项2)。

我不认为有什么办法可以知道哪个选项最好没有做实验。我几乎可以肯定,如果您使用AIR,并且硬件加速功能在您的平台上运行,那么选项3将是最好的选择,但这可能并非如此。我的直觉是,选项4不会非常有帮助。当您将大量静态位图绘制到未转换的舞台上时,Blitting速度会非常快,但在这种情况下,您需要生成或变换每个帧的内容,所以我的猜测是blitting的好处不会发生在您的位置瓶颈是。我最好的猜测是选项2会比1快,但你可能不满意视觉效果。

+0

伟大的答案@fenomas。非常感谢。我正在编译到一个exe文件,所以我想我可以使用AIR并让用户安装这个东西。你知道在闪存测试环境中是否启用硬件加速吗?我认为应该使用GPU还是CPU加速? – cronoklee 2011-04-12 11:04:18

+0

我并没有完全掌握细节,但“CPU”应该禁用硬件加速(我总是使用“自动”,我认为这是推荐的设置。)虽然这样说,但经过一点谷歌搜索,我真的不是肯定台式机上HWA的情况。我所说的关于在GPU上缩放的位图可能取决于某些难以测试的神秘事物。 (如果GPU完全不受影响,我认为我们可能希望选项3的表现类似于2 ..?)除表面之外还有其他类型的HWA(由HW处理的位图),这是一个非常神秘的主题。 – fenomas 2011-04-12 13:41:18

+0

非常感谢。我正在用不同的设置进行一些测试。如果我得出任何结论,我可能会报告或写一篇关于它的博客文章。感谢您的帮助fenomas :) – cronoklee 2011-04-12 14:04:31

-1

有几个原因可能会遇到性能问题。听起来你正在使用Event.ENTER_FRAME事件,这会产生受帧频影响的动画速度。使用Timer类和TimerEvent.TIMER一起查看基于计时器的动画。使用一个Timer对象编排您的动画可能会帮助您实现所需的性能。

您还可以尝试在事件处理程序中的事件对象上调用updateAfterEvent()。我不确定Enter_Frame事件是否可以调用updateAfterEvent(),但TIMER事件可以。

如果矢量圆圈本身在舞台周围动画时不会改变形状,颜色,线条宽度等,那么该过程应该非常有效。诀窍是确保每次在舞台上改变位置时不会渲染它们,但只有在其图形的一个或多个属性发生更改时才会重绘。

如果我不得不选择一件事,我会说你是矢量重绘自己在每个屏幕更新。

+0

谢谢@elekwent。你认为哪个过程更有效? bitmapData进程?圆只在大小位置和不透明度方面发生变化 – cronoklee 2011-04-11 18:25:59

+0

我指的是在舞台周围的移动向量是有效的,只要向量的图形不会在每一帧中重绘。 – elekwent 2011-04-11 19:02:37

+0

再次感谢@elekwent。实际上,我使用补间类为圈子设置动画,据我所知,他们不会重新绘制每一帧,而只是四处移动。我可以尝试以较低的帧速率进行动画制作,但喜欢使运动保持平滑柔滑。 – cronoklee 2011-04-11 19:39:46

1

如果您正在寻找性能,您可能需要查看Blitting。这是一种过去在2D游戏中大量使用的技术;在Actionscript中,它通过BitmapData.copyPixels()方法实现。

在很多情况下,显示表现速度明显加快;谷歌术语“在AS3 Blitting”,你会发现很多有价值的数据。 8bitrocket.com也有一些很好的教程。

+0

欢呼@ lunchmeat317 - 我一直在寻找这个好的。事情是我只是使用不同的彩色圆圈,它们必须改变大小并略微移动。 blitting仍然是最好的方法? – cronoklee 2011-04-11 22:23:16

+0

这真的取决于你获得的表现以及你将在舞台上展示哪些类型的物体。不过,一般来说,我会说是。有一个网站有一个我要链接的blit测试,但是我找不到它。如果我这样做,我会让你知道的。 – 2011-04-11 22:47:06

+0

我在答案中扩展了一下,但我对这里的blitting持谨慎态度,因为必须绘制或转换每帧的东西。blitting的好处是可以消除开销,但是我相信这里的开销比绘制或转换形状的开销要小。 – fenomas 2011-04-12 10:14:02