我正在使用Java创建游戏,并且正在使用TexturePaint在背景中纹理区域。使用java.awt.TexturePaint可以达到很好的性能,但是,我希望区域具有固有的旋转度,因此我尝试实现了一个名为OrientedTexturePaint的自定义Paint:

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


}


唯一的问题是,性能受到了巨大的影响:帧速率从舒适的(上限)60fps下降到约3fps。此外,如果我将其实现为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差很多。怎么来的,有什么办法可以解决这个问题?

最佳答案

我将旋转的部分绘制为BufferedImage,然后将其绘制为背景。然后,只有在旋转部分发生更改时,才需要更新BufferedImage。

如果不以这种方式创建缓存,则每次都从头开始绘制时,就必须考虑绘制模型的管线以及它的复杂程度。性能是要减少渲染管道中的瓶颈,并使所有内容通过Texturepaint进程听起来像是一个巨大的瓶颈。纹理只能创建一次,经常使用,而不是经常创建,一次使用。

10-04 19:06