簡體   English   中英

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而不是JPanelJLayeredPane ,您可以覆蓋畫布的paint()方法或使用bi.getGraphics()並使用以下任一方法在循環上blit背景和字符正確的順序。 我建議使用像GTGE這樣的瘦引擎,它將從優化的所有混亂細節中抽象出來。 您認真使用的這些高級組件並非專為游戲而設計,您根本不應該使用它們。

好的,我發現了我的方式錯誤。 我使用被動渲染,而我應該使用主動渲染 主動渲染基本上通過調用setIgnoreRepaint(true)來關閉自動重繪; 在框架上,自己做循環。

作為額外的獎勵,我不需要使用JPanels。

暫無
暫無

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

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