簡體   English   中英

低計算java paintcomponent中的低fps

[英]Low fps in low computation java paintcomponent

我正在制作一個游戲,為了這個問題的目的,我有一個擴展JFrame的類,它增加了一個擴展JPanel(GamePanel)的類。 在GamePanel中我有一個run方法,它有兩個函數update(); 和重繪(); 然后是Thread.sleep(20)。 更新功能大約需要1-2ms。 我在paintComponent(Graphics g)中擁有所有繪圖內容,當我使用repaint()時,它似乎正確地被調用,因為東西出現在屏幕上。

我的問題是,這是不可思議的遲滯。 當我沒有Thread.sleep(20)時,它就像2fps一樣無法播放。 我讀到這是因為repaint()沒有足夠的時間來完成或者其他什么所以我在下一個循環之前添加了一個延遲。 任何高於或低於20毫秒的東西似乎都會讓它變得更加遲鈍。

我嘗試過使用圖形配置的東西,雙緩沖等等,但它仍然是滯后的。 在我的家用電腦,這是一個英特爾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!

不是假裝是最終的解決方案,只是一些提示:

  1. 確保您的緩沖圖像與其繪制的GraphicsDevice默認顏色模型具有相同的顏色模型。 GraphicsConfiguration.createCompatibleImage方法可以創建此類圖像。

  2. 如果可能,嘗試將整個巨大的地圖拆分為切片並跳過渲染屏幕外(游戲視圖外)部分。

  3. 您似乎使用被動渲染,正如您提到的調用repaint() 事件調度線程用於Swing和AWT中的許多事情,並且它不能保證主動渲染游戲的可接受時間。 也許值得重新設計渲染部分游戲以使用Active Rendering。 可以在此處找到教程和示例。

我也正在開發一個Java游戲並做了很多與你相同的事情(擴展JPanel並調用repaint())。 一個區別是我使用javax.swing.Timer來調用ActionPerformed(ActionEvent e)方法來每5ms更新一次我的游戲。 在方法結束時,它調用repaint()來進行渲染。

此外,如果您使用Graphics2D進行渲染,您可以使用RenderingHints來指導計算機如何渲染您的游戲(例如,速度或質量,類似的東西)。

我沒有完全測量FPS,但是我的Ubuntu 12.10系統沒有延遲,而且在Windows 8上只是慢了一點。

如果我的回答不完全符合您的要求,我深表歉意,但到目前為止,這對我來說沒有任何問題。

好吧,對於游戲開發我不認為在Swing paint中繪制一個巨大的圖像組件將永遠贏得任何速度記錄。 100 FPS仍然令人驚嘆(比大多數LCD顯示器的刷新率高出約40 FPS)。

為了提高速度,必須加速使用的繪圖基元。 在你的學校電腦上,他們可能只是缺少一個像樣的顯卡來提供所需的2D加速(這些PC在瀏覽器和繪畫程序中如何做普通的2D操作?)

您可能希望查看使用OpenGL的框架,例如JOGL。 另一種選擇是試用JavaFX 2 - 它可能有更好的渲染管道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM