[英]Java Graphics Batch Rendering
摘要:
基本上,我希望能夠根據圖像/批處理/精靈來渲染項目,以加快游戲速度,但是我還必須根據y位置對實體進行排序,以便其以正確的順序繪制。
題:
理論上我該怎么做? (代碼塊很好,但是推理更好,謝謝!)
完整情況:
我正在創建一個2.5 D側滾軸,其中我發現〜500 fps對於開發的早期階段是不錯的(至少在我的廢話計算機上),但是我希望它能更高,因為我將添加更多方面稍后(進一步降低fps),以便我現在就可以進行優化。
我想知道的是,是否可以同時渲染具有相同圖像文件的所有實體,以節省加載圖像文件的時間。 我遇到的困難是,我不能僅按實體的圖像文件對它們進行排序(或者至少不能想到,這就是我要問的原因),因為我還需要從頭到尾渲染它們,因為它是2.5 D游戲。
現在,我將圖像存儲在HashMap中,因此並不十分糟糕,我只想知道我可以改進什么。
編輯:另外要注意我正在使用Jframe和Jpanel類與Graphics進行渲染
如果不需要,您無需發布代碼塊。 我只想要更多的理論推理。 謝謝!
-Kore
想到的一個想法是,如果您擁有一個將被大量使用的圖像,則可以對其進行緩存 ,這可能會有所幫助。
有一些方法可以使用BufferedImage和ImageIcon直接引用圖像文件(我會直接鏈接,但是我沒有足夠的要點:/)。
可能將緩存和直接引用與圖像文件混合可以幫助加快處理速度。 與緩存一起,您可能會找到一種將所有需要相同圖像文件的對象組合在一起的方法(可以通過對所有使用此Sprite的對象創建一個arrayList來完成),因此,一旦有一個對象渲染文件,它們都當時從緩存中渲染文件。 然后為下一個圖像清除緩存。
另外,如果要具有指向精靈的變量,則可以讓對象加載變量,而不必全部指向圖像文件。
即
String path = "Image1.jpg";
File file = new File(path);
BufferedImage image = ImageIO.read(file);
然后您的所有對象都引用了圖像作為其圖像的來源。 但是,我不確定這是否比將每個對象單獨指向文件的速度更快,這只是一個想法。
希望其中一些回答您的要求。 祝好運!
- -編輯 - -
因此,我的下一個想法可以使用父類或僅另一個持有ArrayList的類來實現。 因此,您的想法是,您不需要每次想要加載圖像時都必須使用images.get(imgPath)方法。
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.ImageIcon;
class SomeClass{
ImageIcon imgOne = new ImageIcon(new BufferedImage(images.get(imgPath)))
ImageIcon imgTwo = new ImageIcon(new BufferedImage(images.get(imgPathTwo)))
private ArrayList<ImageIcon> imagesHolder = new ArrayList<ImageIcon>(){{
add(imgOne);
add(imgTwo);
}};
public ImageIcon getImageIcon(int index){
return imagesHolder.get(index);
}
}
class test{
SomeClass imageHolder = new SomeClass();
JLabel label = new JLabel(imageHolder.getImageIcon(0));
JFrame f = new JFrame();
f.getContentPane().add(label);
}
在這種情況下,我們有一個類(someclass),其對象(我們只需要其中一個)將數組列表中的每個圖像存儲到處理最多的狀態(imageIcon或您正在使用的任何對象都可以在此處使用),然后再實際放置它JFrame可以從中創建一個對象,以獲取所有已經渲染的圖像。
這意味着此時您要做的就是將圖像添加到JFrame。 您不必一遍又一遍地對每個圖像進行大量預處理,因為它可以直接在JFrame上使用。
盡管這在渲染方面並沒有多大幫助(因為其中大部分是圖像處理),但在內存方面確實有很多幫助,因為您只需要為每個處理過的圖像創建1個,然后重新繪制同一處理過的圖像即可。
希望一次處理所有圖像的想法可以幫助您找到一種方法,即僅渲染一次圖像。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.