2013-02-05 43 views
0

我正在用Java Swing製作遊戲,並且我已經意識到在遊戲運行了一段時間10分鐘左右之後,圖形開始落後了很多。遊戲循環報告以恆定的FPS運行。隨着時間的推移Java Swing遊戲滯後

現在我擁有了,所以一旦遊戲循環觸發時重繪也被調用。如果我不同步圖形,它很慢,畫出的不同部分在屏幕上可見。任務管理器顯示它使用的內存幾乎相同,但隨着時間的推移CPU使用率逐漸增加。如果我不得不猜測它必須是我沒有使用Swing繪製正確。

我目前使用的繪製過程是這樣的:

  • 投Graphics2D對象
  • 超級描繪圖形對象
  • 每個對象使用圖形對象繪製自己的圖形。
  • 工具包同步
  • 處置圖形

面板是setDoubleBuffered(true)

有什麼想法可能是錯的?

編輯:

我不能讓我的SSCCE滯後,等我回去重新測試每個繪圖功能,而且事實證明

int ilen = drawActorQueue.size(); 
    for (int i = 0; i < ilen; i++) 
    { 
     GameActor oo = drawActorQueue.get(i); 
     oo.draw(g2d, viewX, viewY); 
    } 

似乎是造成問題的原因。

我認爲它是因爲drawActorQueue實際上包含指向2種類型對象的指針,而GameActor只是基類。

這看起來是這樣嗎? 我想我可以通過使用接口來修復它,或者讓列表指向2個子對象的特定數組。

編輯: !@#$%^ 這只是我令人難以置信的愚蠢,沒有清除清單。當我再次疲倦時,我永遠不會編碼或調試。

+3

更快速地發佈[SSCCE](http://sscce.org/),簡短,可運行,可編譯爲'FileIO','XxxStream'或'JDBC'的硬編碼值 – mKorbel

+2

同意@mKorbel SSCCE是去這裏的路,但注意*「創建圖形對象」*似乎對我很可疑。如果在組件中進行自定義繪畫,通常會給出一個Graphics對象來處理。該圖形實例不應該放置在您自己的代碼中。 *「面板是'setDoubleBuffered(true)'。」*這是'JPanel'的默認值。 –

+0

是的,我的意思是參數中的圖形對象。 –

回答

2

確保您的應用程序不會泄漏內存和GC'ing嚴重。使用詳細的GC登錄運行該程序以查看問題是否存在。

1

將分析器附加到您的應用程序。例如,visualvm。 「採樣」可以快速啓動任何熱點。

visualvm的真正好處在於,當問題真的發生時,您可以真正關注,但在發生問題之前全速運行。

它還會顯示內存消耗和GC活動的圖表。如果你看到你的應用程序在很短的時間內通過大量的內存,你可能想看看你是否可以減少它。

visualvm是一款適用於Java的超級強大免費工具,應該可以安裝在每個工具箱中,並且是您查看性能問題時的首選地點。

相關問題