2013-08-23 27 views
1

開始研究之前進行研究是一個好主意,所以我在開始一個項目之前一直在Stackverflow的文章中查看。使用Cliping增加幀速率的Java Tilemaps:有什麼可以改錯的?

現在在查找tilemaps的其他問題之一導致我的Java教程之一,特別是這個頁面(http://docs.oracle.com/javase/tutorial/uiswing/painting/step3.html),其中一些引起了我的眼睛,這樣的:

private void moveSquare(int x, int y) { 
    int OFFSET = 1; 
    if ((squareX!=x) || (squareY!=y)) { 
     repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
     squareX=x; 
     squareY=y; 
     repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
    } 
} 

對於那些誰不知道在paintX被調用的時候發生了什麼,在squareX,squareY上繪製了一個紅色方塊,這是允許你改變squareX和squareY的方法,它通過告訴Java限制區域被重繪爲only來加速重繪過程舊的和新的位置(這是兩個電話重新繪製)

現在這聽起來像一些我應該使用,當瓷磚更新時,它的座標被重新繪製,但瓷磚地圖通常涉及二維數組,並在繪畫時遍歷整個陣列,可能涉及多個圖像在一個位置,而大多數地圖不會重繪這仍然可能會減慢速度。

所以你給你的瓷磚添加一個標誌,指出是否有東西發生了變化,這會導致它自上次繪製所有東西后出現不同的外觀,並且只放置已更改瓷磚的圖像。

這個效果很好,直到類似窗口繪製的圖形經過最小/最大循環,現在每個圖塊都需要它的圖形更新,但沒有圖標會被標記,導致一個空白屏幕。

什麼是最好的爲什麼處理這個?

還有什麼我錯過了?

回答

1

repaint(int,int,int,int);的問題是兩個文件夾。

首先,不能保證只有這個區域纔會被更新。 RepaintManager可能會將多個重繪請求合併爲一個請求,將要繪製的區域組合起來可能會使該區域重新繪製得更大。其次,所有的repaint請求都安排回事件派發線程,這意味着它會一直冒泡到您的paintXxx方法。

因此,除非您的paintXxx方法經過優化以處理更新,否則這不會對您有任何好處。

正如您已經指出的那樣,您實際上需要能夠根據Graphics上下文的剪切矩形計算哪些標題被更新。

更好的方法可能是使用在某個後臺線程中更新的屏幕外緩衝區作爲遊戲引擎的一部分。然後這將被切換到「活動」緩衝區,以便在準備就緒時將其繪製到屏幕上。

你可以利用的剪貼在這個時候,只有使活動緩衝區的一小部分,如果您發現更新整個屏幕inafficent

......恕我直言......

實際上對此有一點討論Painting in AWT and Swing