Java 在可能改变分辨率的情况下,渲染2D游戏最有效的方法是什么?

Java 在可能改变分辨率的情况下,渲染2D游戏最有效的方法是什么?,java,awt,resolution,Java,Awt,Resolution,我试过: 1.创建一个称为“factor”的单独变量,并用它乘以或除以所有变量:实体速度、对象大小、字体、分辨率等。。 (该因子始终与分辨率相关,因此对象将正确缩放) 通过使用这个因子将所有内容相乘,有时代码会变得非常混乱和难以阅读 2.渲染到BuffereImage并缩放BuffereImage以适合JFrame void render() { //Render the game to a new BufferedImage BufferedImage renderedFram

我试过:

1.创建一个称为“factor”的单独变量,并用它乘以或除以所有变量:实体速度、对象大小、字体、分辨率等。。 (该因子始终与分辨率相关,因此对象将正确缩放)

通过使用这个因子将所有内容相乘,有时代码会变得非常混乱和难以阅读

2.渲染到BuffereImage并缩放BuffereImage以适合JFrame

void render() {
    //Render the game to a new BufferedImage
    BufferedImage renderedFrame = new BufferedImage(1920, 1080, BufferedImage.TYPE_RGB);
    renderedFrame.createGraphics();
    Graphics g = renderedFrame.getGraphics();

    //Render the game ....

    //Scale the BufferedImage to fit the current resolution and render it to the Canvas
    BufferStrategy bs = getBufferStrategy();
    Graphics f = bs.getDrawGraphics();
    f.drawImage(renderedFrame.getScaledInstance(1280, 720, Image.SCALE_FAST), 0, 0, null);

    f.dispose();
    bs.show();
}
这使得代码更具可读性,但随后出现了两个问题:

鼠标输入问题和调整BuffereImage的大小占用了太多的资源,这使得游戏变得滞后

3.我基本上可以尝试为游戏制作一个单独的单元系统。。但是还有同样的问题,当涉及到渲染字符串或矩形时,我必须将所有内容与因子相乘,然后代码就很糟糕了

有没有更好的2D游戏渲染方法?如果没有,那么我将考虑转到OpenGL


提前感谢。

我最成功的方法是缩放图形对象。您最终会得到如下结果:

final int gameUnitsPerScreenDim = 32;

void render(JPanel panel, Graphics2D g2) {
    double pixelHeight = panel.getHeight();
    double pixelsPerGameUnit = pixelHeight / gameUnitsPerScreenDim;

    g2.scale(pixelsPerGameUnit, pixelsPerGameUnit);

    ...
}
然后在模拟中,使用游戏单位。一个游戏单元的实际大小有点随意,尽管如果你制作一个平铺游戏,它可能有一些明显的价值

除了使用,您还可以创建一个可供重用的:

if (this.tf == null || /* image size changed since the last frame */) {
    ...
    this.tf = AffineTransform.getScaleInstance(pxPerGu, pxPerGu);
}
g2.setTransform(this.tf);
(每次调用
scale
都会创建一个新的
AffineTransform
。)

这甚至更有效一点,尽管可能不会太多

(如果需要,还可以使用变换反转y轴并进行平移,使原点位于图像的中心。这会使许多三角函数和内容感觉更自然。不过,反转y轴会让处理文本变得很痛苦。)


另外,使用OpenGL可能更好。使用Swing for Fund编写了两个简单的游戏,我看不出这样做的理由。

您是否看过:后续渲染将根据指定的缩放因子调整大小,您正在使用
BufferStrategy
绘制
buffereImage
,您以前在当前渲染过程中将状态绘制到该图像中。。。您知道
BufferStrategy
旨在提供双缓冲,对吗
createGraphics
getGraphics
基本上都在做相同的事情,
createGraphics
返回
Graphics2D
上下文,因此不需要强制转换
getGraphics
的结果。使用
仿射变换和适当的缩放可以更好地解决整个问题以抽象单位执行所有模型计算,表示所需的最小空间和时间增量。仅在渲染时缩放到显示。世界被划分为块,块大小为10*10,对象是网格中的块。如果我使用网格作为单位系统,那么实体速度必须是双值。目前我正在使用类Rectangle进行碰撞检测,它需要整数。这意味着我必须创建自己的intersects()方法。当我有更多的时间时,我会研究这个问题,因为我必须重写整个引擎。谢谢你的回答。还有。
if (this.tf == null || /* image size changed since the last frame */) {
    ...
    this.tf = AffineTransform.getScaleInstance(pxPerGu, pxPerGu);
}
g2.setTransform(this.tf);