2014-07-22 36 views
1

我遇到了一個基本代碼的問題,它在屏幕上以150x150的網格顯示一些動畫圖像。 (注意:是的,我知道圖像離開了屏幕的邊緣,但最終我打算根據需要縮放圖像以適合屏幕)。但是該程序只能以2 FPS運行,導致動畫有時無法工作。我的循環是目前的(在Java中)如下:如何使循環更有效?

for (int i = 0; i < 22; i++) { 
    for (int j = 0; j < 11; j++) { 
     g2d.drawImage(getImage(texture_Ocean,l),i*64,j*64,i*64+64,j*64+64,0,0,64,64,this); 
    } 
} 

而且的getImage:

public Image getImage(Image i, Long l) { 
    BufferedImage b = (BufferedImage) i; 
    int w = b.getWidth(); 
    if (b.getHeight() % w == 0) { 
     int frames = b.getHeight()/w; 
     int frame = Math.round((l%1000)/(1000/frames)); 
     System.out.println(frame); 
     return b.getSubimage(0,(int) (w*frame) ,w, w); 
    } else { 
     return texture_error; 
    } 
} 

我的問題是如何讓我的程序更高效/跑得快?我知道必須有辦法做到這一點,因爲你看到的遊戲,如監獄建築師和rimworld與300×300的話,並擁有實體hundreads。而像TF2這樣的遊戲在3D空間中顯示數以千計的多邊形。怎麼樣?

+0

我不是一個計算機圖形專家,但我相當肯定你列出的遊戲的幀速率更快,因爲他們使用像OpenGL這樣的庫,直接與GPU的相關設備進行接口。 – kviiri

+0

我對texture_Ocean沒什麼好感,但是如果你可以保存在一個靜態或成員變量中,並獲得寬度和高度,那麼你可以在每個迭代處保存一些好處理。 –

+0

它可能不會有太大的改進,但是你可以緩存getImage,因爲它總是返回相同的結果,現在每個循環都進行內部計算。 – HamoriZ

回答

3

問題是,您正在使用CPU(並通過低效的內存訪問方法)來完成GPU更好的工作。

你需要看看使用類似2D圖形或遊戲庫或類似的東西來獲得你正在尋找的那種表現。

+0

ok ty,你能提出任何好的圖形庫嗎? –

+0

看到這個問題的一些建議:http://stackoverflow.com/questions/24883018/is-using-swingutilities-invokelater-inside-a-java-game-loop-a-bad-practice/24883129?noredirect=1# comment38670638_24883129 –

0

事情是,當開發遊戲時,你應該關心很多優化。如果你不需要它,你不能簡單地調用paint方法,並且希望一切都會好起來的。

除此之外,您應該嘗試尋找專用於圖形的庫(如OpenGL),因爲它們可以輕鬆地使用硬件來處理優化。