gpt4 book ai didi

Java自定义Paint实现性能问题

转载 作者:行者123 更新时间:2023-12-02 13:49:17 26 4
gpt4 key购买 nike

我正在使用 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。

如果不这样创建缓存,如果每次都从头开始绘制,就必须考虑绘制模型的管道以及其复杂程度。性能是为了减少渲染管道中的瓶颈,而通过纹理绘制过程传递所有内容听起来像是一个巨大的瓶颈。纹理应创建一次,经常使用,不经常创建,使用一次。

关于Java自定义Paint实现性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2281815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com