我在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渲染 –