![](/img/trans.png)
[英]Optimizing painting of a JFrame with a large number of components in Java
[英]Java optimizing painting a background image for a game
我正在努力重新創作“塞爾達傳說與過去的聯系”作為任務的一部分。
我有以下問題,游戲世界是一個BufferedImage,其中我subImage()我需要的部分為播放器的當前位置。 該游戲有效但占用了80%/ 110%的CPU。 一份資料顯示,罪魁禍首是圖像的繪制。
所以我想我把背景放在一個單獨的JPanel中,來自Player,敵人等JPanel。 將它們放在彼此頂部(JLayeredPane)並重新繪制背景面板的頻率要低得多。
但是我該如何做到這一點如何告訴swing將一個面板繪制一次x次,另一次y? 如果您有更好的優化方式讓我知道。
這就是我現在所擁有的:
public class Main extends JFrame
{
private ZeldaGame game = new ZeldaGame();
private View view = new View(game);
private BackgroundView bckView = new BackgroundView(game);
private Controller ctl = new Controller(game, view, bckView, this);
public Main()
{
setLayout(null);
view.setBounds(0, 0, game.getWidth(), game.getHeight());
bckView.setBounds(0, 0, game.getWidth(), game.getHeight());
JLayeredPane pane = new JLayeredPane();
pane.add(bckView, 1);
pane.add(view, 0);
setLayeredPane(pane);
setSize(game.getWidth(), game.getHeight());
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args)
{
new Main();
}
}
謝謝。
由於幀緩沖的工作方式,實際上不可能有不同的渲染時間 - 結果是令人討厭的閃爍。 您需要做的是使用Canvas
而不是JPanel
和JLayeredPane
,您可以覆蓋畫布的paint()
方法或使用bi.getGraphics()
並使用以下任一方法在循環上blit背景和字符正確的順序。 我建議使用像GTGE這樣的瘦引擎,它將從優化的所有混亂細節中抽象出來。 您認真使用的這些高級組件並非專為游戲而設計,您根本不應該使用它們。
好的,我發現了我的方式錯誤。 我使用被動渲染,而我應該使用主動渲染 。 主動渲染基本上通過調用setIgnoreRepaint(true)來關閉自動重繪; 在框架上,自己做循環。
作為額外的獎勵,我不需要使用JPanels。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.