2011-04-19 38 views
5

我已經創建了自己的畫布,該畫布已經從JPanel擴展而來,但是我已經注意到w /內容等等,突然之間我的FPS受到了重創。我遵循來自Filthy Rich Clients的揮杆規則,通過使用paintComponent,創建剪輯區域,僅重繪已更改的內容等等。我將FPS設置爲50 FPS,我注意到有時我的FPS會跳到31/32 FPS並回到50等等。運行我的程序時,即使在渲染時,也只使用大約25MB的RAM和0的CPU。我也有OpenGL設置。要在Java2D中繪製子類以繪製哪個組件(用於2D遊戲)

注:我沒有圖像,這是嚴格使用圖形中的形狀。

通過繪製JPanel上的所有內容,是否存在重大性能下降?我應該擴展一個不同的組件嗎(我一直看到Canvas組件)?在JPanel中構建諸如俄羅斯方塊(或任何其他復古遊戲)的遊戲有多「聰明」?

這是一個可能性,這是一個計時器問題,因爲我剛剛添加了100個額外的繪畫調用,FPS仍然做50 32/31的事情。

+3

經過大量調查後我發現問題根本不在於JPanel。事實上,問題在於Java中的Timer。這不是100%準確的,這導致了FPS的退出。 我解決這個問題的方法是閱讀:http://www.koonsolo.com/news/dewitters-gameloop/ – abc123 2011-04-19 04:07:17

回答

1

經過多次調查後,我發現問題根本不在於JPanel。事實上,問題在於Java中的Timer。這不是100%準確的,這導致了FPS的退出。我解決這個問題的解決方案是這樣的:koonsolo.com/news/dewitters-gameloop

+0

定時器的精度取決於OS時鐘中斷實施的粒度。例如,WinXP只有15毫秒的準確度。有趣的閃避,但是,是運行一個後臺Thread.sleep(Long.MAX_VALUE);出於某種原因,這使得WinXP以1毫秒的精度運行! http://www.java-gaming.org/index.php/topic,24311.msg206914.html#msg206914 – 2011-08-24 19:55:03

0

我意識到你已經發現了一個Timer類的問題,但是我對你有另一個評論,你可能會覺得很有用:

你還沒有提到你是否使用雙緩衝技術。如果你不是,那麼你可能會注意到一個FPS的改進。

萬一你不熟悉的技術,它涉及創建單獨的面板緩衝,重新繪製場景的這個緩衝區,然後關掉這個緩衝與屏幕上的一個等