2017-06-09 101 views
0

我正在嘗試使用Swing製作遊戲,並且需要在遊戲板上製作一個玩家板,所以我使用了JLayeredPane。在第0層,我畫了棋盤,然後在第一層繪製了球員。 這個效果很好,但問題在於當我重繪第1層(例如更改給定播放器的位置)時,性能非常糟糕。我的假設是它正在重新繪製背景板,這是造成這個問題的原因。 下面的代碼:Swing JLayeredPane停止重新繪製所有圖層

JLayeredPane layeredPane = new JLayeredPane(); 
layeredPane.add(boardView, new Integer(0)); 
layeredPane.add(creepsView, new Integer(1)); 

creepsViewboardView覆蓋paint方法,當改變毛骨悚然的狀態發生,它調用了creepsView.repaint()方法,但隨後的boardview.paint()由JLayeredPane的叫,我不理解爲什麼。我怎樣才能避免它? (我不想重繪那些沒有改變的東西)。

回答

2

我想這是因爲它重新繪製背景板。

我懷疑這是問題,因爲繪製加載到內存中的圖像非常有效。

,它調用了creepsView.repaint()方法,並通過JLayeredPane的

那麼boardview.paint叫做爲了讓你一看就知道是指含有玩家必須在面板背景透明。這意味着當您重新繪製播放器面板時,背景面板也必須重新繪製以確保沒有繪畫工件。例如,玩家必須從舊位置移開並在新位置上繪畫。

您可以嘗試通過僅繪製面板的受影響區域來使繪畫更高效。這不是重新繪製整個玩家面板,而只是在舊位置和新位置重新繪製玩家。有關此方法的示例,請參閱Custom Painting的Swing教程中的部分。 moveSquare(...)方法顯示了這種方法的工作原理。