簡體   English   中英

Java-如何有效繪制圖形

[英]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();

這樣一來,繪制所有瓷磚的時間就大大減少了。 但這可能會更好。 當我要制造光引擎時(例如地下)。 然后,我將不得不在瓷磚上使用透明矩形。 或者,如果有人可以提出一種無需使用透明矩形而使瓷磚變暗的更好方法。 但問題是,當嘗試繪制透明矩形時也會出現延遲。 我不知道我是否應該避免使用透明圖像和矩形或其他東西。

希望有人能指出正確的方向。

一些技巧可能會有所幫助:

  • 如果您有很多靜態背景圖塊 ,則不要在每一幀都重繪它們 -只需將它們繪制一次到BufferedImage中,並使用它一次繪制整個背景。 僅當其中一個圖塊發生更改或滾動屏幕等時才需要更新此背景圖像。
  • 確保僅繪制可見的圖塊 看起來您可能正在執行此操作,但是如果core.blcHeight和core.blcWidth太大,則可能會繪制過多的圖塊。
  • 不必擔心鎖定到60FP 對於基於圖塊的游戲,這可能不是必需的。 我建議您將游戲邏輯與幀速率解耦,並讓游戲以其可以處理的任何速度渲染。
  • 對於純色背景圖塊, 無需使用alpha陰影進行繪制 在某些情況下,這可以大大加快繪圖速度。 即您可以使用TYPE_INT_RGB而不是TYPE_INT_ARGB

如果您確實想要高性能的繪圖/動畫,則可能需要考慮切換到基於OpenGL的渲染引擎-例如Slick2DLWJGL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM