Actionscript 3 AS3粒子虚拟阵列

Actionscript 3 AS3粒子虚拟阵列,actionscript-3,actionscript,particles,Actionscript 3,Actionscript,Particles,不久前,我根据教程制作了一个粒子类。基本上,它使用了某种虚拟列表,取代了数组方法,这使得它成为一个非常快速的解决方案。所以一切都很顺利,除了我真的不明白到底发生了什么。这是相当混乱,所以我试图找到这个东西的逻辑,不幸的是没有成功。如果有人能真正解释这一点,我会很高兴,这样我就能把它变成有用的东西 package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.dis

不久前,我根据教程制作了一个粒子类。基本上,它使用了某种虚拟列表,取代了数组方法,这使得它成为一个非常快速的解决方案。所以一切都很顺利,除了我真的不明白到底发生了什么。这是相当混乱,所以我试图找到这个东西的逻辑,不幸的是没有成功。如果有人能真正解释这一点,我会很高兴,这样我就能把它变成有用的东西

package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import Part;
    import FPSCounter;

    public class Pixels extends Sprite
    {
        private var num:int = 500000;
        private var sw:Number = stage.stageWidth;
        private var sh:Number = stage.stageHeight;
        private var bdata:BitmapData=new BitmapData(sw,sh,false,0x111111);
        private var bmp:Bitmap = new Bitmap(bdata);
        private var firstParticle:Part;
        private var radius:Number;
        private var range:Number;
        private var color:uint = 0xffffff;

        public function Pixels()
        {
            addChild(bmp);
            addChild(new FPSCounter());
            createParticles();
            addEventListener(Event.ENTER_FRAME,anim);
        }

        private function createParticles():void
        {
            var lastParticle:Part;

            for (var i:int = 0; i < num; i++)
            {
                radius = Math.random() * (2 * Math.PI);
                range = Math.random() * (2 * Math.PI);
                var thisP:Part = new Part;
                thisP.x = sw / 2;
                thisP.y = sh / 2;
                thisP.xvel=Math.sin(range) * radius;
                thisP.yvel = Math.cos(range) * radius;

                if (i == 0) 
                {
                    firstParticle = thisP;                      }

                else
                {
                    lastParticle.next = thisP; // ???? 
                }

                lastParticle = thisP; 
            }
        }

        private function anim(event:Event):void
        {
            var p:Part = firstParticle;
            bdata.lock();
            p = firstParticle;
            bdata.fillRect(bdata.rect, 0x111111);

            do 
            {
                p.y += p.xvel;
                p.x += p.yvel;

                bdata.setPixel(p.x, p.y, color);
                p = p.next;
            } 
            while (p != null)

            bdata.unlock();
        }
    }
包
{
导入flash.display.Bitmap;
导入flash.display.BitmapData;
导入flash.display.Sprite;
导入flash.events.Event;
进口部分;
进口柜台;
公共类像素扩展了Sprite
{
私有变量数:int=500000;
专用var sw:编号=stage.stageWidth;
私有变量sh:Number=stage.stageHeight;
私有变量bdata:BitmapData=新的BitmapData(sw、sh、false、0x111111);
私有变量bmp:Bitmap=新位图(bdata);
私人物品:第二部分;
私有变量半径:数字;
私有var范围:数字;
私有变量颜色:uint=0xffffff;
公共功能像素()
{
addChild(bmp);
addChild(新的FPSCounter());
创建粒子();
addEventListener(事件输入帧,动画);
}
私有函数createParticles():void
{
粒子:部分;
for(变量i:int=0;i
这称为链表。请参阅

此应用程序的更好结构可能是向量。这是AS3中的一种数组数据类型,与您现在所做的一样,针对顺序访问进行了优化。因为您有固定数量的粒子,所以您不必担心调整向量大小的成本。在需要添加或删除不在当前位置的元素的情况下,链表非常有用e列表的末尾,或者当您需要高度可变的元素数时

使用如下向量:

// This is a member variable
private var particles : Vector.<Part> = new Vector.<Part>(num);

// This fills the particle list
for(var ii : int = 0; ii < num; ++ii) {
    var part : Part = new Part();
    // Initialize the particle here
    particles.push_back(part);
}

// This iterates through the particles
for each(var part : Part in particles) {
    // Draw part
}
//这是一个成员变量
私有变量粒子:向量=新向量(num);
//这将填充粒子列表
对于(变量ii:int=0;ii
谢谢你的回答。我认为vector在这里不是一个好的选择,因为我在示例中有50万个粒子。在所有粒子之间循环将花费很多时间。在任何情况下都会花费很多时间,vector非常适合索引访问。但一般来说,如果粒子繁殖和销毁,人们会为它们编写列表这是因为ActionScript缺少默认值链表比表快vector@Patrick链表比矢量快,但性能与矢量相同。请参阅。对于粒子引擎,粒子不断被破坏和创建,粒子的每个属性(而不是对象)的矢量通常最快。(例如,粒子_x[],粒子_y[])