Algorithm Actionscript-扩展循环-性能问题

Algorithm Actionscript-扩展循环-性能问题,algorithm,actionscript-3,drawing,graphics2d,Algorithm,Actionscript 3,Drawing,Graphics2d,我试图创建一个不断扩大的循环,原因有几个。对于测试床,我使用actionscript来开发它的起点 这是我目前掌握的代码: 编辑 更新代码13.39 GMT+1-再次更新代码 更新代码14.54 GMT+1-更新代码,现在运行非常流畅,感谢Vesper的帮助 梅因 package { import flash.display.MovieClip; import flash.events.Event; import Wavelet; import flash.geom.Point; impor

我试图创建一个不断扩大的循环,原因有几个。对于测试床,我使用actionscript来开发它的起点

这是我目前掌握的代码:

编辑

更新代码13.39 GMT+1-再次更新代码

更新代码14.54 GMT+1-更新代码,现在运行非常流畅,感谢Vesper的帮助

梅因

package  
{
import flash.display.MovieClip;
import flash.events.Event;
import Wavelet;
import flash.geom.Point;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.getTimer;

public class Main extends MovieClip
{

    var startColor:Number = 0x00AA00;
    var particleBitmapdata:BitmapData;
    var m_temptimer:int;

    private var myVector:Vector.<Wavelet> = new Vector.<Wavelet>();
    public function Main() 
    {
        // constructor code         
        addEventListener(Event.ADDED_TO_STAGE, init);
        addEventListener(Event.ENTER_FRAME, update);
    }

    public function init(evt:Event)
    {
        particleBitmapdata = new BitmapData(3,3,false, startColor);

        var myTimer:Timer = new Timer(100, 0);
        myTimer.addEventListener(TimerEvent.TIMER, run);
        myTimer.start();
    }

    public function run(tevt:TimerEvent)
    {
        for(var i:int=0; i < 360; i+=1)
        {
            myVector.push(new Wavelet(3, 1, i, startColor,particleBitmapdata));
            myVector[myVector.length-1].x = stage.stageWidth/2;
            myVector[myVector.length-1].y = stage.stageHeight/2;
            addChild(myVector[myVector.length-1]);
        }

    }

    public function update(evt:Event)
    {
        var time:int = getTimer();
        var dt:Number = (time - m_temptimer) * 0.001;
        m_temptimer = time;

        for(var i:int=0; i < myVector.length-1; i++)
        {
            var w:Wavelet = myVector[i];

            if(w.x > stage.stageWidth || w.x < 0  )
            {
                removeChild(myVector[i]);
                myVector[i] = null;
                myVector.splice(i,1);
            }
            if(w.y > stage.stageHeight || w.y < 0 )
            {
                removeChild(myVector[i]);
                myVector[i] = null;
                myVector.splice(i,1);
            }

        }

        for(var j:int=0; j < myVector.length; j++)
        {
            myVector[j].update(dt);
        }
    }
}

}
不管怎样,我从中得到的表现实在是太慢了。 我不想作为一个整体创建一个扩展的圆,我需要像素来计算它们何时与墙和对象碰撞,使它们改变方向


您是否可以制作一个性能更好的考试圈?

由于代码更新而编辑

首先,您可以将所有小波移动例程放入
wavelet
类中,并将
Math.sin(angle)
Math.cos(angle)
预缓存到类中的
vx
vy
变量中。这将为每次循环运行节省720个
Math.sin()
Math.cos()
调用

第二,您正在前向循环上拼接一个粒子-在这种情况下,向量中的下一个粒子将不会移动,而之前的粒子将被拼接。这是一个常见的bug,但如果通过
splice()
查询第i个元素,从而得到null异常,那么结果会更糟


第三,您在循环中请求了十几次
myVector[i]
——这个请求没有缓存在代码中,所以您可以这样做:
var w:Wavelet=myVector[i]并通过
w
指针解决所有问题,这会略微提高性能,因为Flash不需要经常检查越界问题或检索列表元素。

自己做了第一个修复,在每个小波对象中不使用内部更新侦听器,而是处理Main.as中的位置更新,但是性能仍然很差。谢谢你的帮助,但是当我将更新例程从Wavelet对象移到Main时,这些都被删除了(请参见上面的注释)那么请更新问题中的代码。也许还有另一个性能提示被重新分配BDs所掩盖了。@Hiam好的,编辑了答案。也许这会提高性能。是的,你的建议是有道理的。我已经用你的建议更新了代码。仍然不能流利地运行“那个”。。。我想知道这里是否还有其他问题。您不需要
w
成为类范围内的变量,因为您只在
update()
函数中使用它。在那里声明它,它是临时变量的适当位置。
package 
{
import flash.display.*;
import flash.events.*;
import flash.geom.Point;
import flash.filters.*;
import flash.geom.*;

public class Wavelet extends Bitmap
{
    private var m_velocity:Number;
    private var m_angle:Number;
    private var m_radius:Number;
    private var m_bmd:BitmapData;
    private var m_color=0x0000FF;
    private var m_angleX,m_angleY;

    public function getAngle():Number
    {
        return m_angle;
    }


    public function getVelocity():Number
    {
        return m_velocity;
    }

    public function setVelocity(input:Number)
    {
        m_velocity = input;
    }

    public function Wavelet(radius:int, velocity:Number, angle:Number, color:Number, bitmapData:BitmapData)
    {
        // constructor code
        m_radius = radius;
        m_angle = angle * Math.PI / 180 ;
        m_velocity = velocity;
        m_angleX = Math.cos(angle);
        m_angleY = Math.sin(angle);
        m_color = color;
        m_bmd = bitmapData;
        this.bitmapData = m_bmd;
    }

    public function update(dt:Number)
    {
        this.x+= m_angleX * m_velocity;
        this.y+= m_angleY * m_velocity;
        m_velocity+=dt;
    }
}

}