【发布时间】:2018-01-07 05:17:52
【问题描述】:
我在 Java 中创建了一个 2D 游戏,并试图将其设置为 60 fps,分辨率为 1920x1080 像素。我的游戏逻辑在不到 1 毫秒的时间内表现良好。但绘图需要超过 10 毫秒。这在我相当强大的台式机(intel i5-4670K @ 3.40 Ghz)上可能就足够了,但在我的笔记本电脑(intel i5-6300HQ @2.30 Ghz)上,游戏已经慢了很多。绘图分为两个主要步骤:
将游戏的每个组件绘制到 BufferedImage 上
在我的扩展 JPanel 类中绘制 BufferedImage
对应的代码是这样的:
@Override
public void run() {
init();
long startTime;
long elapsedTime;
long waitTime;
while(running) {
startTime = System.nanoTime();
update();
long updateTime = (System.nanoTime() - startTime) / 1000000;
draw();
long drawTime = (System.nanoTime() - startTime) / 1000000;
drawToScreen();
long drawscreenTime = (System.nanoTime() - startTime) / 1000000;
elapsedTime = System.nanoTime() - startTime;
waitTime = targetTime - elapsedTime / 1000000;
if(waitTime < 0) {
waitTime = 0;
}
try {
Thread.sleep(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void init() {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
GraphicsConfiguration config = device.getDefaultConfiguration();
image = config.createCompatibleImage(1920, 1080, Transparency.TRANSLUCENT);
g2d = (Graphics2D) image.getGraphics();
running = true;
gsm = new GameStateManager(this);
}
public void update() {
gsm.update();
Keys.update();
}
public void draw() {
gsm.draw(g2d);
}
public void drawToScreen() {
Graphics g = getGraphics();
g.drawImage(image, 0, startDrawY, scaledWidth, scaledHeight, null);
g.dispose();
}
draw 和 drawToScreen 方法最多需要 5 毫秒。 在 draw 方法中,最慢的部分是绘制背景图像(1920x1080 图像)和绘制关卡(由几个 135x135 图像组成),两者都需要几毫秒。
现在我有两个问题:这样的大图像的绘制速度是否正常?如果不是,我可能在这里做错了什么,或者如何提高绘图性能?
【问题讨论】:
-
Graphics2D 扩展图形。您将 Graphics2D 保存在 init() 中。为什么不使用 g2d 而不是在 drawToScreen() 中创建另一个图形?
-
如果您希望构建一个高效渲染的 2D 游戏,您应该研究 libGDX 等库(或任何其他扩展 java OpenGL 实现 (LWJGL) 的库)。 OpenGL 使用高效的图形管道以 2D 和 3D 进行渲染
标签: java performance