我正在用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個子對象的特定數組。
編輯: !@#$%^ 這只是我令人難以置信的愚蠢,沒有清除清單。當我再次疲倦時,我永遠不會編碼或調試。
更快速地發佈[SSCCE](http://sscce.org/),簡短,可運行,可編譯爲'FileIO','XxxStream'或'JDBC'的硬編碼值 – mKorbel
同意@mKorbel SSCCE是去這裏的路,但注意*「創建圖形對象」*似乎對我很可疑。如果在組件中進行自定義繪畫,通常會給出一個Graphics對象來處理。該圖形實例不應該放置在您自己的代碼中。 *「面板是'setDoubleBuffered(true)'。」*這是'JPanel'的默認值。 –
是的,我的意思是參數中的圖形對象。 –