我有一个电影剪辑,它有一个简单的动作,形状很简单。此电影剪辑被复制多次以创建图形效果。
随着拷贝的数量或电影剪辑的复杂性的增加,CPU使用率也会上升。从90个拷贝开始,当我将鼠标移动到swf电影的圆圈上时,播放停止(挂起)。当鼠标移动停止时,swf会在正确的位置再次继续,就好像计算已继续,但更新显示并未继续。
现在这是一台四核电脑,我们是2010年...我不能相信也不能接受100 mc是可以渲染的电影片段的最大数量……一定有更好的方法。
显而易见的问题是,如何才能优化CPU性能?
我使用的是AS3,flash Player9。Movieclip是一个简单的矩形形状,它沿着一个轴移动。
var myLinkage:Class = Class(getDefinitionByName(getQualifiedClassName(McToRepeat)));
var newMC:MovieClip = new myLinkage();
containerMC.addChild( newMC );
发布于 2010-08-16 23:26:20
swf挂起可能是因为当您移动鼠标时,会在屏幕上的每个MovieClip上触发MOUSE_MOVE
事件等。
你通常可以通过在MovieClip
继承树上再往上走几步,并从那里构建你自己的图形类来优化Flash呈现。MovieClip
有很多很酷的花哨功能,比如时间线、层和内置的鼠标处理。不幸的是,所有这些都占用了内存和CPU时间,而且通常情况下,您不需要所有这些功能。幸运的是,你可以挑选你需要的功能,并摆脱MovieClip
的大量多余脂肪。MovieClip
继承树的布局使得每个特性都被非常简洁地封装在一个父类中。
例如,在您的应用程序中,您假设MovieClip
包含一个遵循简单运动路径的简单形状。我还假设它们不会与鼠标或键盘交互。正因为如此,我们可以在MovieClip
的继承树上走得很远。因为你只移动一个形状,而不是真正的动画部分,你可以用补间来代替时间轴动画(我推荐看Greensock的TweenLite )。就在那里,你可以编写自己的类,它是Sprite
(而不是MovieClip
)的子类,并且可能会获得相当不错的帧率提升。
如果你想进一步优化,你可以更进一步。你也可能不需要层,因为你使用的是一个简单的形状。因此,你可以比DisplayObjectContainer
走得更远。因为你不需要交互性,所以InteractiveObject
也可以去。所以你已经减掉了很多脂肪,现在你在DisplayObject
。由于DisplayObject
可能很难使用,因此您可能希望沿着树向下走一步,要么是Shape
,要么是Bitmap
,具体取决于形状的复杂程度。
同样,当您决定需要从Actionscript的内置图形类中获得多少时,您可能必须从那里构建自己的图形类。由于要向显示对象添加自定义特性,因此需要创建自己的类,该类继承自Sprite
、Shape
或Bitmap
,并在其中添加该功能。
要回答你关于为什么100个MC很慢的问题,请记住,Flash在虚拟机上运行,而该抽象层占用了大量的资源。
https://stackoverflow.com/questions/3493802
复制相似问题