我正在製作一個遊戲,其中爲了這個問題的目的,我有一個擴展JFrame的類,它增加了一個擴展JPanel(GamePanel)的類。在GamePanel中,我有一個運行方法,它有兩個函數update();和repaint();然後是Thread.sleep(20)。更新功能需要約1-2ms。我把所有繪圖的東西放在paintComponent(Graphics g)中,當我使用repaint()時,它似乎正確地被調用,因爲東西出現在屏幕上。在低計算java paintcomponent的低fps
我的問題是,它是難以置信的laggy。當我沒有Thread.sleep(20)時,它像2fps一樣無法播放。我讀到這是因爲repaint()沒有足夠的時間來完成或什麼,所以我在下一個循環前添加了延遲。高於或低於20ms的任何東西似乎都會使其更加遲滯。
我試過使用圖形配置的東西,雙緩衝和更多,但它保持laggy。在我的家用電腦,這是一個英特爾i5,四核,3.2GHz我只能達到100fps,並在學校的計算機上,我得到了15fps左右(好的電腦,就像amd雙核心,我相信)。 paintComponent循環是超輕量級的!只需根據玩家位置使用偏移繪製地圖,然後在屏幕中間繪製玩家!我使用的地圖是2000x2000,0.8mb。嘗試切換到1000x1000 0.4mb並沒有差異。
下面是代碼:
@Override
public void paintComponent(Graphics g) {
//Rendering settings and stuff
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//Draw map gameMap.gameMap is a bufferedImage
g2d.drawImage(gameMap.gameMap, gameMap.x, gameMap.y, null);
//Draw health bar
g2d.setColor(healthBarColor);
g2d.setComposite(alphaHealthBarBackground);
g2d.fillRect(100, 19, 200, 23);
g2d.setFont(font);
g2d.setComposite(alphaNormal);
g2d.setColor(healthBarColor);
g2d.drawString("HP: ", 20, 40);
g2d.fillRect(100, 19, player.health * 2, 23);
//Draw player player.playerImage is a BufferedImage
rotatePlayer.setToRotation(rotation, rotationAnchor.x, rotationAnchor.y);
rotatePlayer.translate(xResolution/2, yResolution/2);
g2d.drawImage(player.playerImage, rotatePlayer, this);
g2d.setColor(Color.white);
}
這導致100FPS相對真棒計算機及15fps血統計算機上!
究竟有多大'這'被繪? *「下降計算機上15fps!」*如果它正在下降到哈迪斯,這將是可以理解的,因爲'它會去地獄'。 ;) – 2012-03-12 18:16:32
那麼,如果我理解你的權利,那麼「這」被繪與屏幕尺寸一樣大。該應用程序是全屏。我使用工具包來獲得屏幕尺寸,所以在家裏它是1920x1080,在學校屏幕是1280x1024我相信... 哈哈,體面;)有趣的笑話...:P – Opfff 2012-03-12 18:47:31
注意:1)最好做FPS測試固定的渲染大小。 2)您可以編輯問題以更改拼寫。我可以,但我會謹慎行事。 :) – 2012-03-12 19:22:01