2014-06-30 40 views
1

我正在製作一個滾動的2D地圖/平鋪遊戲。每個瓦片(以瓦片形式存儲[21] [11] - 每個地圖總共231個瓦片)可以包含多達21個值(存儲爲int [3] [7])。全屏時,我一次看到大約8張地圖。Java Swing重/慢paintComponent - 有什麼建議嗎?

平均而言,每張地圖大約需要0.03秒來繪製(在System.nanoTime中找到)。問題是,只要屏幕上出現超過1張地圖,Swing事件輪詢顯着減慢。

有沒有解決這個問題的方法?我無法一次畫出地圖將其保存爲圖像,因爲它具有涉及移動演員的透明度,因此它變化頻繁。另外我不認爲我可以調用paintComponent中的一個線程來繪製地圖而不會出現毛刺,但我並不積極。

+1

背景圖像和瓷磚應繪製爲BufferedImages。屏幕上的圖像應該以某種方式緩存,並在需要時調出。通過調用帶參數的方法的重載,可以限制重繪區域。 –

+1

不要害怕使用多個'BufferedImage'作爲圖層來增強效果(後/中/前景)。一般來說,這些應該只有您需要的那麼大,只有在新內容發生變化時才拼接到新內容。 – MadProgrammer

+2

另請參閱此可能的[重複](http://stackoverflow.com/q/23145439/230513)。 – trashgod

回答

3

我的不是任何類型的JComponent,他們只是數據。我打電話給他們的容器MapPane,它在paintComponent中畫出了所有的瓷磚。

同樣,JTable單元格只是在JComponent內呈現的數據; flyweight模式,提到here,仍然適用:目標是省略渲染不可見單元格的任何努力。 Profileself-time,以優化渲染;在引用hereKineticModel中檢查了一些方法。

A BufferedImage不需要縮放是最好的。如果必須縮放,請嘗試使用與插值類型相關的RenderingHints。如果構圖太昂貴,則使用SwingWorker在背景中構建地圖; publish()他們變得可用,他們在美國東部時間process(),如here所示。

相關問題