0

いくつかの理由から、拡大するサークルを作成しようとしています。テストベッドの場合、アクションスクリプトを使用して開始を開発しています。

これは私がこれまで持っているコードです:

編集

UPDATED CODE 13.39 GMT+1 - コードを再度更新

UPDATED CODE 14.54 GMT+1 - Vesper の助けのおかげで、更新されたコードはかなり流暢に動作するようになりました

Main.as

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.as

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;
    }
}

}

とにかく、私が得ているパフォーマンスはひどく遅いです。全体として拡大する円を作成したくありません。壁やオブジェクトと衝突するタイミングを計算して方向を変えるには、ピクセルが必要です。

とにかく、より良いパフォーマンスで拡張サークルを作成できる方法はありますか?

4

1 に答える 1

0

更新されたコードのために編集されました。

まず、すべてのウェーブレット移動ルーチンをクラスに入れ、プレキャッシュWaveletMath.sin(angle)クラスの変数に入れることができます。これにより、720回の通話が節約され、サークルごとの通話が節約されます。Math.cos(angle)vxvyMath.sin()Math.cos()

第 2 に、フォワード ループでパーティクルをスプライスしています。この場合、ベクトル内のすぐ隣のパーティクルは、前のパーティクルがスプライスされても移動しません。これは一般的なバグですが、i 番目の要素が を超えてクエリされた場合、ほとんどの場合、最終的にはさらに悪化し、splice()null 例外が発生します。

そして 3 番目に、myVector[i]ループ内で何十回もリクエストしています。このリクエストはコードにキャッシュされていないため、代わりに次のようにします。var w:Wavelet=myVector[i];すべてをwポインター経由でアドレス指定すると、Flash が常にチェックする必要がないため、パフォーマンスがわずかに向上します。範囲外の問題の場合、またはリスト要素を取得します。

于 2013-03-20T09:54:57.113 に答える