2015-01-02 45 views
0

我正在寫一個Java 2D視頻遊戲。我只使用Java 2D api,並且所有更新都從單個更新計時器驅動。我使用paintComponent()在一個JPanel中執行所有的繪圖,並且從所讀取的所有圖形圖像使用易失性圖像應該會提高性能。在Java 2D視頻遊戲中閃爍的問題

儘管如此,有時我的視頻遊戲開始閃爍如瘋。整個屏幕開始閃爍。遊戲是用Java 6編寫的,而且我在Mac OS X 10.10.1上運行。

有關如何解決此問題的任何想法?

謝謝。

+1

你經常打電話給你的油漆方法?你正在使用'repaint()'重新繪製你的面板嗎?還是你明確地調用'paintComponent()'? – initramfs

+0

你能提供更多關於你在做什麼的細節嗎?爲什麼JPanel over JComponent(影響不透明度)?你可以重畫區域而不是整個組件嗎?你可以通過XOR繪製來消除重繪嗎?等等。 – Jeff

+0

易揮發的圖像可能隨時消失,這可能導致閃爍,圖像由於某種原因而失效。考慮使用兼容的BufferedImage代替。我可能是錯的,但我認爲使用易失性映像現在不需要對總體渲染管線進行更改 – MadProgrammer

回答

0

根據這個post你不應該直接調用paintComponent()。嘗試調用paint()來代替。

編輯:對不起,我困惑paintComponent()和paintComponents()。也許你可以顯示一些代碼?

+0

還要確保不要經常調用paint()。只有當屏幕上的內容發生變化時才調用它,並且您需要更新繪製的畫布。通過直接調用'paintComponent()'或過度重新繪畫,你很可能會有一些閃爍。 – NoseKnowsAll

+0

OP正在使用JPanel,它是一個Swing組件,因此**應該**重寫'paintComponent()'。這篇文章說,不要重寫'paintComponents()',它是與'paintComponent()'不同的方法。 – initramfs

+0

從我讀過的東西中,應該調用paintComponent(),因爲我已經更新了一個JPanel,並且應該只在更新Canvas時調用paint()。我會給它一個旋轉,看看會發生什麼。 – user1104028

0

在主窗口/框架/面板上調用setDoubleBuffered(true)。或者在準備好時抽取另一個組件並切換。

閃爍的發生是因爲您快速在相同的組件上重繪。在後臺重繪,然後快速切換到現在新繪製的圖片來擺脫這一點。這被稱爲雙緩衝。閱讀更多here

+3

默認情況下,在Swing組件上啓用了雙緩衝嗎? – Jeff

+0

根據文檔,是的:「您可能已經注意到Swing在其許多組件中使用了這種技術,通常默認情況下啓用,使用setDoubleBuffered方法。」 – jlink