加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash性能相关知识

发布时间:2020-12-15 07:03:06 所属栏目:百科 来源:网络整理
导读:? 原文:http://bbs.9ria.com/blog-73243-19559.html 嗯。。。。这篇文章其实是接着之前的一篇文章的,属于一系列,但是由于本人很懒很懒(懒到什么程度,看前一篇日志的时间就知道袅。。。),所以到现在才开始写第二篇。其实最近事情也蛮多,除了工作时间

?原文:http://bbs.9ria.com/blog-73243-19559.html

嗯。。。。这篇文章其实是接着之前的一篇文章的,属于一系列,但是由于本人很懒很懒(懒到什么程度,看前一篇日志的时间就知道袅。。。),所以到现在才开始写第二篇。其实最近事情也蛮多,除了工作时间之外没有多少精力认真学习(借口)。

之前做项目的时候,经常会碰到一些性能上的瓶颈,有时候flash会卡到爆,后来搜索了些其他人遇到的问题以及解决办法,再加上自己开发的经验,总算是平安度过了。这篇文章就说说如何优化flash。

优化这个事,其实也没什么很高深的东西,只要在平时写代码的时候多注意点就行,多释放释放内存,少创建点对象,少使用点复杂的矢量图,一帧上少运算点东西,性能也就上来了。一些结构上的优化,不建议在项目早期进行,如果过早的优化结构,累死累伤不说,项目也会变得很难设计和维护,严重影响了开发进度,这种吃力不讨好的事情最好别做。当然前提是结构要说的过去,至少要条理清晰,一团糟的结构这个事情除了坑别人,最终也会害了自己。另外不要一味的关注改进性能,一个项目要综合考虑各方面的利弊,比如说代码的结构性、健壮性、扩展性、执行效率等等。

不知道大家有没有遇到过这样一个问题,明明我的资源什么的都优化的很好了,为什么还是会卡帧呢?其实这里面涉及到一个代码执行的问题,Flash Player是异步单线程机制(当然现在也加了多线程进去,但是一般我们在开发的时候基本都是用的单线程),从跑道模型(关于跑道模型的相关知识,可以看下这个链接上的内容http://blogs.adobe.com/xwlin/2010/04/flash_player_101_-_adobe_max_2009_1.html)上可以看出,flash在每帧是会先运行一些代码,然后再执行渲染的。如果需要执行的代码太多,耗时过长的话,势必会造成这一帧所需要的时间增长,从而导致了帧频的降低,帧频一低到某个值,就自然会觉得卡了。

private function onEnterFrame(evt:Event):void
{
trace(flash.utils.getTimer());

for (var i:uint = 0; i < 1000000; i ++)?
{
var s:Sprite = new Sprite();
addChild(s);
}
}

这段代码,就说明了问题。所以,千万别在一帧里面做太多的事情,可以把一些不是必须的事情放到后面处理,采用分时段执行的方法来规避这种问题。

另外在选择对象类型上,选择一些 占内存最小的适当对象类型。比如int和Number,分别消耗4个和8个字节,在可用范围的情况下,尽量选用int。显示对象上Sprite、MovieClip、Shape的差别相信大家也都知道了,还有Vector和Array,这些都要根据实际情况来选择合适的使用。关于Vector,可能有人在需要用数组存储Object类型的数据时会这样子用:Vector.,其实这样子是不科学的,因为Object是顶级类,所有的类型都是这个类型的子类,所以还是会导致类型不明,这里还是用Array的好。在这里提个建议,如果有需要用到Object来存储数据的时候,最好是用一个专门的类来处理,比如要存储人物信息,还是要建一个PersonInfo类来代替直接实例化Object,这样子会方便很多的。
在用TextField的时候,在适当的时候可以考虑把它转化成位图来使用。
数组的长度放在一个常量里缓存起来。
减少事件的处理函数。

对象池是个不错的东西,在初始化的时候就创建若干个对象进去,等要用的时候就取出来,用完了再放回去,会省很多性能的。另外不要创建很多对象,比如在循环中,尽量将对象创建在循环体外,在循环体内重复的利用。比如这段代码
private function creatImage():void
{
var image:Image;
var imageList:Vector. = new Vector.;
var len:uint = 10;
for(var i:uint = 0;i
{
image = new Image();
imageList.push(image);
}
}

对象用完之后,要释放掉,关于如何释放一个对象,可以参考这样几步:
1、要删除掉对象所有的引用,包括所有子对象的引用。
2、去除掉所有事件侦听。
3、如果有Bitmapdata,需要调用dispose()方法来清掉像素信息。
4、其他的还有stop()方法的实例,最好是先调用stop方法。


在显示上,尽量少用滤镜、不需要鼠标交互的,最好是禁掉鼠标,因为 检测鼠标交互可能会占用大量 CPU 资源,尤其是当显示对象重叠的时候。避免使用alpha,这个玩意也很耗CPU。能用位图的时候用位图,且要多缓存位图。

还有就是写完代码之后,一定要回过头来仔细检查下自己的代码是否有问题,内存是否及时释放,不定期的整理下之前写的内容。还有多看看别人的代码。

关于代码层面的优化,论坛里有很多这方面的详细资料,大家可以去搜来看看,我这里也只是简单的阐述一些我平时在做项目的时候使用的方法。

还有还有还有,非常重要的一点,千万不要用flex。。。这套组件有多坑人,谁用谁知道,里面各种庞大各种臃肿。尽量少用一些现有的框架,能够自己写的就自己写, 专用的东西永远比通用的东西要更高效。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读