Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
Flash actionscript位图是否比矢量更快?_Flash_Actionscript 3_Actionscript - Fatal编程技术网

Flash actionscript位图是否比矢量更快?

Flash actionscript位图是否比矢量更快?,flash,actionscript-3,actionscript,Flash,Actionscript 3,Actionscript,我正在做一个项目,它以帧速率连续绘制圆圈,并在舞台上制作动画,我遇到了性能问题 我已经在将所有对象变为静态后立即转换为位图数据。我的问题是,绘制圆后立即将其转换为位图数据会提高性能吗?换句话说,动画是不是说,200个位图(具有透明度)比200个矢量圆快 这种技术有什么缺点吗?(我想可能会有不透明的问题?) 如果它们是比圆更复杂的形状,答案会不同吗 还有其他关于提高绩效的建议吗 非常感谢 出现性能问题的原因有很多。听起来像是在使用事件。输入_FRAME事件,它根据帧速率生成动画速度。使用timer

我正在做一个项目,它以帧速率连续绘制圆圈,并在舞台上制作动画,我遇到了性能问题

我已经在将所有对象变为静态后立即转换为位图数据。我的问题是,绘制圆后立即将其转换为位图数据会提高性能吗?换句话说,动画是不是说,200个位图(具有透明度)比200个矢量圆快

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

如果它们是比圆更复杂的形状,答案会不同吗

还有其他关于提高绩效的建议吗


非常感谢

出现性能问题的原因有很多。听起来像是在使用
事件。输入_FRAME
事件,它根据帧速率生成动画速度。使用
timer
类和
TimerEvent.timer
查看基于计时器的动画。使用一个
计时器
对象编排动画可能有助于实现所需的性能

您还可以尝试在事件处理程序中的事件对象上调用
updateAfterEvent()
。我不确定Enter\u Frame事件是否可以调用
updateAfterEvent()
,但
计时器
事件可以

如果在舞台周围设置动画时,矢量圆本身不改变形状、颜色、线宽等,则该过程应该相当有效。诀窍是确保它们不会每次在舞台上改变位置时都被渲染,而只是在一个或多个图形属性改变时才被重新绘制


如果我必须选择一件事,我会说你的向量在每次屏幕更新时都会重新绘制自己。

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


在许多情况下,显示列表的速度要快得多;在谷歌上搜索“在AS3中进行Blitting”,你会发现很多有价值的数据。也有一些很好的教程。

这里有几种方法可以考虑:

  • 在矢量渲染器上下注,在每个帧上画线和圆。它们每次都会被重新渲染,但这正是Flash经过大量优化的目的,所以这并不可能比其他方法更快。(请注意,以不同的大小绘制每个帧的对象可能比将每个对象绘制到
    精灵中并更改其大小要快。)

  • 通过移动位图对矢量渲染器下注。一种简单的方法是(假设您正在使用AS3绘制形状)将形状绘制到
    位图
    对象中,然后移动这些对象。你可能对结果的参差不齐感到不满意。启用位图平滑将有所帮助(但会降低一些性能)。
    注意:
    cacheAsBitmap
    可能不会满足您的要求,因为当对象改变大小时(不确定透明度),缓存的位图会被重新绘制

  • 通过使用来押注硬件加速。这只在空中可用,因此可能不适用于您。CABM类似于cacheAsBitmap,但它不会在内容重新缩放时重新绘制内容。此外,在许多情况下,位图会交给硬件,因此可以在GPU上重新缩放。我相信有些平台是不起作用的。这通常非常快,尤其是在移动设备上

  • 押注AS3位图处理,通过将内容分插到舞台大小的位图数据中。但请注意,即使这样做,您仍然需要决定是将形状绘制到每一帧的大位图中(如选项1),还是将它们绘制到单独的位图中,并将它们(转换)到每一帧的大位图中(如选项2)


  • 我认为没有任何方法可以不经过实验就知道哪个选项是最好的。我几乎可以肯定,如果您使用AIR,并且硬件加速在您的平台上工作,那么选项3将是最好的,但这些可能不是真的。我的直觉是,选择4不会有太大帮助。当您在未转换的舞台上绘制大量静态位图时,Blitting可以非常快,但在这种情况下,您需要生成或转换每帧的内容,因此我猜Blitting的好处不会出现在瓶颈所在的位置。我的最佳猜测是,选项2将比1快,但您可能对视觉效果不满意。

    谢谢@elekwent。你认为哪个流程更有效?bitmapData进程?圆圈的大小、位置和不透明性都会发生变化。我指的是,只要向量的图形不是每一帧都重新绘制,在舞台上移动向量是有效的。再次感谢@elekwent。实际上,我正在使用tween类来设置圆的动画,据我所知,它们不是每一帧都重新绘制,而是四处移动。我可以尝试在较低的帧速率下制作动画,但我想保持动作流畅。一个修正:视觉效果应该始终由输入帧事件驱动,而不是计时器。原因是您希望代码在每次屏幕刷新时执行一次。更多的时候,你会浪费CPU在用户看不到的更新上,更少的时候,Flash会浪费CPU重新绘制屏幕,即使没有任何改变。调用
    updateAfterEvent
    只会让事情变得更糟-它会迫使flash每秒进行更多的重画。如果您只需要此处描述的内容,您可以将DisplayObject的属性
    cacheAsBitmap
    设置为true。啊,是的!我忘了缓存位图!好几年没用了。它帮助了很多,但是对于更复杂的形状仍然存在一些问题。Wh