我正在开展一个项目,该项目以帧速率连续绘制圆圈,并在舞台周围激活它们,我遇到了性能问题。
我已经将所有对象一旦变为静态就将其转换为bitmapData。我的问题是,一旦它们被绘制,将圈子转换为bitmapData会提高性能吗?换句话说,动画说200个位图(透明度)比200个矢量圆快吗?
这种技术有什么缺点吗? (我认为不透明问题可能?)
如果形状比圆形更复杂,答案会有所不同吗?
有关改善表现的其他提示吗?
非常感谢!
答案 0 :(得分:2)
您可以在此处考虑几种方法:
通过在每个帧上绘制线条和圆圈来投注矢量渲染器。它们每次都会被重新渲染,但那就是Flash经过大量优化的原因,所以这可能比其他选择更快。 (请注意,每帧绘制不同大小的对象可能比将每个对象绘制到Sprite
并更改其大小更快。)
通过移动位图来投注矢量渲染器。一个简单的方法(假设您使用AS3绘制形状)是将形状绘制到Bitmap
个对象中然后移动它们。你可能不满意结果的唠叨。启用位图平滑将有所帮助(但会花费一些性能)
注意: cacheAsBitmap
可能无法在此处执行您想要的操作,因为当对象更改大小(不确定透明度)时,缓存的位图会重新绘制。
使用cacheAsBitmapMatrix投注硬件加速。这仅适用于AIR,因此可能对您无效。 CABM类似于cacheAsBitmap,但它不会在重新缩放时重绘内容。此外,在许多情况下,位图被传递给硬件,因此可以在GPU上重新缩放。我相信有些平台虽然不起作用。这通常非常快,特别是在移动设备上。
通过将内容放入舞台大小的BitmapData来投注AS3位图处理。但请注意,即使你这样做,你仍然需要决定是否每帧都将形状绘制到你的大位图(如选项1),或者将它们绘制成单独的位图,并将每个帧中的那些(转换)blit成大位图(如选项2)。
我认为没有任何方法可以在没有试验的情况下知道哪个选项最好。我几乎可以肯定,如果您使用AIR并且如果硬件加速在您的平台上运行,那么选项3将是最好的,但这些可能不是真的。我的直觉是选项4不会非常有用。当您在未转换的舞台上绘制大量静态位图时,Blitting可以非常快,但在这种情况下,您需要生成或转换每帧的内容,所以我的猜测是blitting的好处不会发生在你的瓶颈是。我最好的猜测是选项2会比1快,但你可能对视觉效果不满意。
答案 1 :(得分:1)
如果您正在寻找表演,可能需要调查Blitting。这是一种过去常用于2D游戏的技术;在Actionscript中,它是通过BitmapData.copyPixels()方法实现的。
在很多情况下,置换列表的速度要快得多;谷歌术语“在AS3中Blitting”,你会发现很多有价值的数据。 8bitrocket.com也有一些很好的教程。
答案 2 :(得分:-1)
您可能遇到性能问题的原因有很多。听起来你正在使用Event.ENTER_FRAME
事件,它会根据帧速率产生动画速度。使用Timer
类和TimerEvent.TIMER
查看基于计时器的动画。使用单个Timer
对象来编排动画可能有助于您获得所需的性能。
您还可以尝试在事件处理程序中的事件对象上调用updateAfterEvent()
。我不确定Enter_Frame事件是否可以调用updateAfterEvent()
,但TIMER
事件可以。
如果矢量圆圈本身在它们围绕舞台动画时不会改变形状,颜色,线宽等,那么该过程应该非常有效。诀窍是确保每次改变舞台上的位置时都不会渲染它们,但只有当它们的一个或多个图形的属性发生变化时才会重绘它们。
如果我必须选择一件事,我会说你的矢量正在重新绘制每个屏幕更新。