9RIA.com天地会 - 论坛

返回列表 发帖

天地培训

9RIA天地会官方培训机构

Adobe官方认证培训中心

[宣传] 迎新年,我们一起来蛋疼之性能优化有钱拿(活动贴)

本帖最后由 猫粮 于 2010-1-1 16:44 编辑

这次优化的代码是AdvancedActionscriptAnimation的随书代码。
代码的下载:
http://sa.xflex.cn/2009/12/30/AdvancEDActionScriptAnimation.zip
因为用的是自己的空间,请大家就别用迅雷下载了..免得我发现流量大的时候把这个链接移掉…

拿到了代码我们要做什么?
选择任意一个可执行的示例,优化cpu占用。

奖励是什么?
优化减少10%的,2威望20纹银
优化减少20%的,4威望40纹银
优化减少30%的,8威望80纹银

(以上规则适用于双核机器,单核的是20%/40%/60%)。
以此类推...
并且送出新年大礼包,cpu占用率是向上取整而不是四舍五入的!即使你优化了1%,也可以拿到2威望,20纹银!
活动结束后,会按照优化的质量评选出排名,排位高者还有Adobe的笔记本(纸),天地会的贴纸等送出,到了天地会生日的时候还有勋章拿

怎么证明我们我们的优化是成功的?

1.打包您的示例代码。优化前和优化后的代码分开两个文件夹叫做before 和 after
2.打开任务管理器用截屏软件截取优化前优化后的FlashPlayer的CPU占用率,以及你的机器的CPU的核心数量,作为附件上传...
3.写明优化经过以及优化原因,越详细越好


有额外奖励吗?
上面所说的只是活动奖励,如果你的优化经过,分析写得足够详尽,还能作为精华帖收藏,各位舵主也不会吝啬给你加银两的,关键是,用心!

怎么证明我没有抄袭别人的创意?
1.先到先得。
2.参加活动的帖子一旦被本人编辑,则被视为无效,所以提交之前请务必仔细检查。如果需要重新提交您的优化,请重新回帖。

下面是一些判定规则:
例如针对同一个DEMO。
A提交了优化算法,优化了15%
B针对同一个程序,优化了20%
A又看了看,也优化到了20%
这样的情况我们认为还是B的优化比A的有效
但是
A提交了优化算法,优化了15%
B针对同一个程序,优化了20%
A又看了看,也优化到了21%
这样的情况,我们认为是A的比B的有效
而且这个时候,A还可以获得额外的4威望,40两,因为他的优化从20%上升到了30%.

参加活动的朋友请直接在此楼回帖.
为了保持活动贴的整洁以及便于大家搜索,与活动无关的一切内容均会被删除

所以,如果需要进行相关讨论,请额外开贴,或者移步讨论帖。
讨论帖的地址在此:
http://flash.9ria.com/thread-42636-1-1.html

更新一下,发现很多兄弟参加活动的时候都没有按照格式来写明优化过程,只能获得参与奖,这是非常可惜的...
看看我是怎么说的..

1.打包您的示例代码。优化前和优化后的代码分开两个文件夹叫做before 和 after
2.打开任务管理器用截屏软件截取优化前优化后的FlashPlayer的CPU占用率,以及你的机器的CPU的核心数量,作为附件上传...
3.写明优化经过以及优化原因,越详细越好
哥们,行行好别拜我了,我还没死

天地人才库
居然是CS4
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 -1  诏曰: 送钱而已

TOP

范围太宽了,建议拿出2,3个程序来优化就可以了,毕竟优化的手段有限
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 -1  诏曰: 送钱而已,有参与就有钱有威望 ...

业精于思 升华于勤

TOP

好兄弟,讲义气!---by eko

踏上天地会荣耀之路!

 

申请舵主

加入掘金队

加入译林军

知识专题整理

 

咨询(QQ):

1442604479(小地)

 

站个位置先。。。
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 -1  诏曰: 我说了,讨论去讨论帖

TOP

可惜没法开源...唉~~~不然就参加了...光说方法和伪代码,不贴代码可以吗?
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 -1  诏曰: 不行。

Mochimedia, Inc.

TOP

猫粮自己写了一篇优化的实例http://www.xflex.cn/blog/archives/612.html
但是他仍在蛋疼中,暂定完毕!
(不要生气哈,开玩笑的,新年快乐)
PS:这样的活动参加麻烦度太大,可参与性太小
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 + 2  诏曰: 你看思伟的,一行就把分给赚到了.. ...

业精于思 升华于勤

TOP

乱搞的。
优化之前没满帧率没法对比。

把所有getter/setter换成直接访问
for循环比较使用相同类型的变量,缓存每次需要检查的循环条件
使用另一种方法代替了Math.floor();
使用bitmap代理矢量图……仔细看会发现有点问题……不管了
说不定还有其他顺手改的地方……忘记了……

其实我没改他的算法……
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 + 10  诏曰: 先发参与奖..

TOP


说句话还被罚了一两银子。。。
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 -1  诏曰: 为了保持活动贴的整洁以及便于大家搜索,与 ...

TOP

下班了,直接在Ball类中加了句cacheAsBitmap=true;少了10%左右。这样蛋疼的做法算吗?
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 + 10  诏曰: 先发参与奖.. 没图没真相...

TOP

研究下,不知道我行不行
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 -1  诏曰: 为了保持活动贴的整洁以及便于大家搜索,与 ...

正式开始疯狂学习

TOP

SDK4.0有些写法真的是不习惯.
但是我看了看程序的原理.
发现一个问题.
用每个格子里面的小球来判断.
有时一个格子会引起周边的格子的计算.

我把画格子的代码,写死在主类.

                       
                        graphics.lineStyle(0, .5);
                        for(var i:int = 0; i <= stage.stageWidth; i += 80)
                        {
                                graphics.moveTo(i, 0);
                                graphics.lineTo(i, stage.stageHeight);
                        }
                        for(i = 0; i <= stage.stageHeight; i += 80)
                        {
                                graphics.moveTo(0, i);
                                graphics.lineTo(stage.stageWidth, i);
                        }                       
                       
                       
然后,private const GRID_SIZE:Number = 500;
这样做法,就少了一些,应该有10%了
但是我的CPU是四核.
不知道这样的优化,算数不??

另外,发现,重复判断的次数太多.
甚至我认为,这种判断,可能都不比画格子之前,
就是一个.n-1 * n 的判断来的快速.
对源文件的4.0的函数不熟,
没有去试.
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 + 2  诏曰: 先发参与奖.. 我下您的swf和原来的对比没有 ...

TOP

对上面优化的思路.
每个圆,半径为50, 直径就是100
判断,两个圆相交,至少是两圆距离为100.
而原来的格子为80

在不分格子之前,
每次判断为.
n-1 * n 无最坏最好.

而分了格子之后,
每次,最好,是格子数.* 格子内洛的圆.
最坏为,格子数.*格子内洛圆*2

但是如果分了格子反而不如不分格子.
那么,这种分而置之的思路又有何优点了呢???


另外,判断两圆相交,也可以改改.
if (x1-x2) < -100 || x1-x2 > 100 为了效率,把math.abs 也省省.
同时Y也一样.
这样,当他们远的时候,
不需要计算.
平方,和开方了.

TOP

优化的误区.

我这回真的把判断,改成了双for 来做了.
function onEnterFrame(event:Event):void
                {
                        updateBalls();
                       
                        for (var i:int =0; i < _numBalls ; i++)
                        {
                                for (var j:int =0 ; j< _numBalls ;j++)
                                {
                                        if (i!=j){
                                         if (checkCollision(_balls[j] as Ball, _balls[i] as Ball))
                                         break;
                                        }
                                       
                                }
                        }
                }

为了避免当有球"碰撞"的时候,再判断其它球.
直接break 了.
然后,发现CPU其实并没有下降多少,当然,按书上的道理来讲,其实应该是上升的.

为了探寻究竟.
我把.代码改为.
function onEnterFrame(event:Event):void
                {
                        updateBalls();
                       
                       
                        //for (var i:int =0; i < _numBalls ; i++)
//                        {
//                                for (var j:int =0 ; j< _numBalls ;j++)
//                                {
//                                        if (i!=j){
//                                         if (checkCollision(_balls[j] as Ball, _balls[i] as Ball))
//                                         break;
//                                        }
//                                       
//                                }
//                               
//                               
//                        }
                }

注意看,
每一祯,我只保留圆形动的脚本,
把判断,改变色彩的全关掉.

大家是不是感觉这次CPU会一下子降下去很多了???

事实上,CPU一点没有降.
至少从我这里看是这样.
也就是说,书中的这个例子.
根本上看不出,分格子判断相碰,还是用原始的循环方式来判断相碰,
均在CPU占有率上看不出效果.

因为事实上,显示那100个小圆占了90%以上的成份.

用代码证明一下.
构造函数中只加小球.
public function GridCollision3()
                {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                       
                        _grid = new CollisionGrid(stage.stageWidth, stage.stageHeight, GRID_SIZE);
                       
                       
                       
                        graphics.lineStyle(0, .5);
                        for(var i:int = 0; i <= stage.stageWidth; i += 80)
                        {
                                graphics.moveTo(i, 0);
                                graphics.lineTo(i, stage.stageHeight);
                        }
                        for(i = 0; i <= stage.stageHeight; i += 80)
                        {
                                graphics.moveTo(0, i);
                                graphics.lineTo(stage.stageWidth, i);
                        }                       
                       
                       
                        makeBalls();
                        //addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }

小球代码.
public class Ball extends Sprite
        {
                private var _color:uint;
                private var _radius:Number;
                private var _vx:Number = 0;
                private var _vy:Number = 0;
                public var _moveRect :Rectangle ;
               
                private var _whitecircle:Sprite = new Sprite();
                private var _redcircle : Sprite= new Sprite();
               
               
                public function Ball(radius:Number, color:uint = 0xffffff)
                {
                        _radius = radius;
                        _color = color;
                       
                        drawWhiteCircle();
                        drawRedCircle();
                       
                        this.addEventListener(Event.ENTER_FRAME , onFrame);
                }
               
                private function onFrame(ee:Event)
                {
                        update();
                }
               
       function  drawWhiteCircle()
                {
                        _whitecircle = new Sprite();
                        with (_whitecircle){
                        graphics.lineStyle(0);
                        graphics.beginFill(0xff0000, 1);
                        graphics.drawCircle(0, 0, _radius);
                        graphics.endFill();
                        graphics.drawCircle(0, 0, 1);
                        }
                        this.addChild(_whitecircle);
                }
               
                function         drawRedCircle()
                {
                        _redcircle = new Sprite();
                        with (_redcircle){
                        graphics.lineStyle(0);
                        graphics.beginFill(0xffffff, 1);
                        graphics.drawCircle(0, 0, _radius);
                        graphics.endFill();
                        graphics.drawCircle(0, 0, 1);
                        }
                        this.addChild(_redcircle);
                       
                }

               
                public function setRED(red :int)
                {
                        if (red==1)
                        {
                                if (this.getChildIndex(_whitecircle)==0)
                                swapChildren(_whitecircle,_redcircle )
                               
                        }else
                        {
                                if (this.getChildIndex(_whitecircle)==1)
                                swapChildren(_whitecircle,_redcircle )
                               
                        }
                }
               
               
                public function update():void
                {
                        // add velocity to position
                       
                        if(this.x < _moveRect.left )
                                {
                                       
                                        _vx *= -1;
                                }
                                else if(this.x >_moveRect.right)
                                {
                                        _vx *= -1;
                                }
                                if(this.y < _moveRect.top)
                                {
                                       
                                        _vy *= -1;
                                }
                                else if(this.y >_moveRect.bottom)
                                {
                                       
                                        _vy*= -1;
                                }
                               
                        x += _vx;
                        y += _vy;
                       
                }

小球只是随每祯移动.
CPU基本上和书中的例子 相差无几.

所以如果真的把这个实例的CPU优化下来了.
那一定是优化小球,显示..
比如,把小球换成死元件.等...这样一来,
优化的方向和书中的本意就相差很远了.

TOP

注意到小球,
最后形成了一个版本.

不过仍然不是很满意...
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
1

评分人数

  • 猫粮

猫粮 赐本贴 银子 + 2  诏曰: 有截图么..我这里对比两个都是爆cpu的,60+ ...

TOP

原来大家的CPU有些不是很好. 竟然看不出分别.
主要原因还是都是100%


我上传一下,效果图,其实,确实改了之后,也没怎么样.
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

返回列表