Я использую 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. Как получилось, и есть ли способ обойти это?