我正在使用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进程听起来像是一个巨大的瓶颈。纹理只能创建一次,经常使用,而不是经常创建,一次使用。