我在java中创建了一个2D游戏,并试图以1920x1080像素的分辨率将其变为60 fps。我的游戏逻辑在不到1毫秒内表现良好。但绘图需要超过10毫秒。这在我的相当强大的台式电脑(intel i5-4670K @ 3.40 Ghz)上可能就足够了,但在我的笔记本电脑(intel i5-6300HQ @ 2.30 Ghz)上,游戏速度已经放慢了很多。该图分为两个主要步骤:Java 2D游戏绘图性能
绘制游戏的每一个组件到一个BufferedImage
绘制的BufferedImage在我的扩展JPanel类
的相应的代码是这个:
@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毫秒。 里面的绘制方法,最慢的部分是绘制背景图像(1920x1080图像)和绘制水平(由几个135x135图像组成),这些都需要几毫秒。
现在我有两个问题:对于像这样的大图像,这个绘制速度是否正常?如果不是,我可能会在这里做错什么,或者我该如何提高绘图性能?
Graphics2D extemds图形。你在init()中保存Graphics2D。为什么不使用g2d而不是在drawToScreen()中创建另一个Graphics? – Dakoda
如果您正在寻找能够高效呈现的2D游戏,那么您应该查看诸如libGDX(或其他扩展了Java OpenGL实现(LWJGL))的库。 OpenGL使用高效的图形管道以2D和3D渲染 –