0

以下の問題を解決するプログラムを作成しました。

シードがランダムに作成され、粒子がランダムに移動するトロイド平面に拡散制限凝集シミュレーションを実装します。パーティクルがシードまたはパーティクルの近くに着地しない場合、それらは移動します。ここで、ユーザーはシード (赤のピクセル)、粒子 (黒のピクセル)、ステップ (いいえまたは反復)、平面サイズを入力します。

私のコードは非常に遅いです。どうすれば速くなりますか?

x 座標と y 座標をランダムに作成し、赤のピクセル (シード) を描画してから、黒のピクセル (粒子) の x と y をランダムに作成しました。粒子がなくなるまで。ピクセルが x > border のように境界の外にある場合、x=0; x <1 の場合、x= ボーダー。y についても同様です。

これは、境界線に着地した場合、反対側の境界線に移動することを意味します。次に、隣接するピクセルを再度チェックします。シードを作成する外側のループと、パーティクルの内側のループがあります。内側のループで、x、y 位置を確認します。

//Place, move, and "stick" the particles; stop if either steps or particles = 0
for (int p = 0; p < particles; p++) {

    for (int s = 0; s < steps; s++) {
        if (xPos > image.getWidth() ) {
                       do something
                    } 
        else if (xPos < 1) {
                        do something
                    }
        if (yPos > image.getHeight() - 2) {
                         do something
                    } 
        else if (yPos < 1) {
                         do something
                    } 
        else if (xPos > image.getWidth() && yPos > image.getHeight()) {
                         do something
                    } 
        else if (xPos < 1 && yPos < 1) {
                         do something
                    }

     //If the surrounding pixels' color is not white, make that particle stick.
            if (moveValid()) {
                image.setRGB(xPos, yPos, 0xFF000000);
            } 


            //Otherwise, move in a random direction
            else {
                if(xPos == 1 && image.getRGB(size - 2, yPos) != 0xFFFFFFFF){
                   draw(xPos,yPos);
                }
                else if(xPos == size - 2 && image.getRGB(1,yPos) != 0xFFFFFFFF){
                    draw(xPos,yPos);
                }
                if(yPos == 1 && image.getRGB(xPos, size - 2) != 0xFFFFFFFF){
                   draw(xPos,yPos);
                }
                else if(yPos == size - 2 && image.getRGB(xPos,1) != 0xFFFFFFFF){
                    draw(xPos,yPos);
                }
                else {
                    move();

                }


            }
        }

        //Regenerate random x and y positions for the next particle   
        xPos = random.nextInt(size);
        yPos = random.nextInt(size);
    }
4

1 に答える 1

2

の実装draw()は示されていませんが、を更新しBufferedImageてからレンダリングしているようです。

  1. 最初のステップは、常に既存のコードのプロファイルを作成し、簡単に実装できる最適化を探すことです。

  2. 2番目のステップは、既存のコードを脇に置いて、別のアプローチを試すことです。

ここで概説され、ここで説明されているMode-View-Controllerパターンを活用できる場合があります。特に、より持続可能な速度でビューを更新しながら、DLA モデルをバックグラウンドスレッド上でフルスピードで進化させます。この記事では、同期へのいくつかのアプローチを提案し、更新のペースを調整するために使用する関連する例を示します。javax.swing.Timer

于 2012-09-15T01:18:58.633 に答える