0

私のメソッドの 1 つが非常に遅いことに気付きました。プロファイリングでは、合計実行時間の 95% を占めていることに気付きました。

クラス:

package gui;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

/**
 *
 * @author Frank
 */
public abstract class CustomRectangle {
    protected final BufferedImage bufferedImage;
    protected final int width;
    protected final int height;
    protected final int xOffset;
    protected final int yOffset;
    protected final int borderSize;
    protected final boolean defaultOrientation;

    protected Color color;

    public CustomRectangle(final BufferedImage bufferedImage, final int width, final int height, final int xOffset, final int yOffset, final int borderSize, final boolean defaultOrientation) {
        this.bufferedImage = bufferedImage;
        this.width = width;
        this.height = height;
        if (defaultOrientation) {
            this.xOffset = xOffset;
            this.yOffset = yOffset;
        }
        else {
            this.xOffset = bufferedImage.getWidth() - 1 - xOffset;
            this.yOffset = bufferedImage.getHeight() - 1 - yOffset;
        }
        this.borderSize = borderSize;
        this.defaultOrientation = defaultOrientation;
    }

    abstract public void inBorder(final int dx, final int dy);

    abstract public void outBorder(final int dx, final int dy);

    public void draw() {
        if (defaultOrientation) {
            drawDefaultOrientation();
        }
        else {
            drawOppositeOrientation();
        }
    }

    private void drawDefaultOrientation() {
        int[] pixelArray = ((DataBufferInt)bufferedImage.getRaster().getDataBuffer()).getData();
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int dx = Math.min(x, width - 1 - x);
                int dy = Math.min(y, height - 1 - y);
                if (dx < borderSize || dy < borderSize) {
                    inBorder(dx, dy);
                }
                else {
                    outBorder(dx, dy);
                }
                pixelArray[(xOffset + x) + ((yOffset + y) * bufferedImage.getWidth())] = color.getRGB();
            }
        }
    }    

    private void drawOppositeOrientation() {
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int dx = Math.min(x, width - 1 - x);
                int dy = Math.min(y, height - 1 - y);
                if (dx < borderSize || dy < borderSize) {
                    inBorder(dx, dy);
                }
                else {
                    outBorder(dx, dy);
                }
                bufferedImage.setRGB(xOffset - x, yOffset - y, color.getRGB());              
            }
        }
    }  

    public void setColor(final Color color) {
        this.color = color;
    }
}

遅いメソッドは drawDefaultOrientation() メソッドです。ただし、恐ろしいのは、画像を変更するコードをすべて省略したとしても、それでも遅いということです。

呼び出し先コード:

    new CustomRectangle(bufferedImage, 440, 180, 30, 490, 10, defaultOrientation) {
        @Override
        public void inBorder(final int dx, final int dy) {
            setColor(new Color(red, green, blue, 255 - (int)Math.round(0.5 * Math.min(dx, dy))));
        }

        @Override
        public void outBorder(final int dx, final int dy) {
            setColor(new Color(red, green, blue, 128 - (int)Math.round(0.5 * Math.min(dx, dy))));
        }
    }.draw(); 

x 座標と y 座標をループする場合でも、このコードにそれほど時間がかからないように、何かが起こっているに違いありません。

私が持っていたいくつかの考えは、匿名の内部クラス+オーバーライドに関係している可能性があるということでした...

しかし、うまくいけば、より多くの知識を持つ誰かが質問に答えることができます.

4

1 に答える 1