[英]Java - How to effectively draw graphics
我在這里試圖做的就是盡可能快地渲染游戲中的所有圖形。 該游戲是基於圖塊的,需要渲染很多圖像。 我遇到的問題是繪制所有圖像需要很長時間。 我不知道我是否應該以特殊的方式繪制拼貼,但現在我正在逐一渲染視口內部的所有拼貼。
這是我的繪制方法:
public void draw(Graphics2D g){
boolean drawn=false; // if player is drawn
int px=vpPosX, py=vpPosY; // Viewport Position
for(int y=Math.round(py/64); y<Math.round(py/64)+core.blcHeight; y++){
for(int x=Math.round(px/64); x<Math.round(px/64)+core.blcWidth; x++){
if(y<height && x<width && y>-1 && x>-1 && worldData[currentLayer][x][y] != 0){ // if tile is inside map
BufferedImage img = tileset.tiles[worldData[currentLayer][x][y]]; //tile image
if(-py+player.PosY+64-15 < (y*64)-py-(img.getHeight())+64 && drawn==false){player.draw(g);drawn=true;} // if player should be drawn
if(worldBackground[currentLayer][x][y]!=0){ // if tile has background
BufferedImage imgBack = tileset.tiles[worldBackground[currentLayer][x][y]]; // background tile
g.drawImage(imgBack, (x*64)-px-(((imgBack.getWidth())-64)/2), (y*64)-py-(imgBack.getHeight())+64, null); //draw background
}
g.drawImage(img, (x*64)-px-(((img.getWidth())-64)/2), (y*64)-py-(img.getHeight())+64, null); // draw tile
}
}
}
if(!drawn){player.draw(g);} // if drawn equals false draw player
}
所有圖像都加載在tileet類中。
游戲的fps / ups鎖定為60。
從具有游戲循環的核心類中調用此方法。
我想知道的是我做錯了什么?
我需要更改抽獎方法嗎?
我是否需要以特殊方式加載圖像?
我需要改變繪畫方式嗎?
我的目標是制作無滯后的2D圖塊游戲。
我自己發現的事情是,保存切片圖像的bufferedimages是RGBA格式。 但是當我將其設為RGB時,渲染所需的時間要少得多。 我知道額外的信息需要花費更多的時間來繪制。 但是我不知道到底是多少。
我設法找到一種使性能更好的東西。
如果我加載了所有圖像並將它們復制到以此方式創建的圖像中:
BufferedImage bi = ImageIO.read(ims[i]);
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage b = gc.createCompatibleImage(bi.getWidth()*4, bi.getHeight()*4, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = b.createGraphics();
g.drawImage(bi, 0, 0, bi.getWidth()*4, bi.getHeight()*4, null);
tiles[id]=b;
g.dispose();
這樣一來,繪制所有瓷磚的時間就大大減少了。 但這可能會更好。 當我要制造光引擎時(例如地下)。 然后,我將不得不在瓷磚上使用透明矩形。 或者,如果有人可以提出一種無需使用透明矩形而使瓷磚變暗的更好方法。 但問題是,當嘗試繪制透明矩形時也會出現延遲。 我不知道我是否應該避免使用透明圖像和矩形或其他東西。
希望有人能指出正確的方向。
一些技巧可能會有所幫助:
TYPE_INT_RGB
而不是TYPE_INT_ARGB
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.