Проблема производительности реализации пользовательской краски Java - PullRequest
3 голосов
/ 17 февраля 2010

Я использую Java для создания игры, и я использую TexturePaint для текстурных областей на заднем плане. Производительность в порядке с использованием java.awt.TexturePaint, однако я хочу, чтобы области имели внутреннее вращение, поэтому я попытался реализовать пользовательскую Paint под названием OrientedTexturePaint:

public class OrientableTexturePaint implements Paint {

    private TexturePaint texture;
    private float orientation;

    public OrientableTexturePaint(TexturePaint paint, float orientation)
    {
        texture = paint;
        this.orientation = HelperMethods.clampRadians((float)Math.toRadians(orientation));
    }

    public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) 
    {
        AffineTransform newTransform = (AffineTransform)xform.clone();
        newTransform.rotate(orientation);
        return texture.createContext(cm, deviceBounds, userBounds, newTransform, hints);
    }

    public int getTransparency() 
    {
        return texture.getTransparency();
    }


}

Единственная проблема заключается в огромном падении производительности: частота кадров падает с комфортных (ограниченных) 60 кадров в секунду до примерно 3 кадров в секунду. Более того, если я реализую это как чистую оболочку для TexturePaint - без создания нового преобразования, просто передавая аргументы в методы TexturePaint и возвращая то, что возвращает TexturePaint, я получаю тот же результат.

т.е:.

public class MyTexturePaint implements Paint {

    private TexturePaint texture;

    public OrientableTexturePaint(TexturePaint paint, float orientation)
    {
        texture = paint;
    }

    public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) 
    {
        return texture.createContext(cm, deviceBounds, userBounds, xform, hints);
    }

    public int getTransparency() 
    {
        return texture.getTransparency();
    }
}

работает значительно хуже, чем TexturePaint. Как получилось, и есть ли способ обойти это?

1 Ответ

0 голосов
/ 17 июля 2011

Я бы нарисовал повернутую часть в BufferedImage, а затем нарисовал бы ее на фоне.Тогда вам нужно будет обновить BufferedImage только при изменении повернутых частей.

Если вы не создаете кэш таким образом, если вы каждый раз рисуете с нуля, вы должны учитыватьтрубопровод модели краски и насколько это сложно.Производительность заключается в уменьшении узких мест в конвейере рендеринга, а прохождение всего процесса через текстурную окраску звучит как огромное узкое место.Текстуры должны быть созданы один раз, часто, редко, один раз.

...