簡體   English   中英

在Windows中緩慢繪制緩沖圖像,在Linux中快速繪制

[英]Drawing a bufferedimage slow in Windows, fast in Linux

好吧,對於一個課堂項目,我和其他一些人正在開發一個等距游戲。 一切都使用一個緩沖的圖像繪制在一個JPanel中。 無論如何,每件藝術品都是專門在煙火中完成的,並保存為.png。 在Linux上,每個游戲周期重新繪制地圖所花費的時間約為3毫秒。 在Windows(以及OSx)上,大約需要100毫秒才能達到500毫秒。 從典型的筆記本電腦到i7-3770K + 660游戲機,在4種不同的計算機上都觀察到了這種效果。 發生這種情況時,CPU使用率約為10-20%,程序的RAM使用率約為1GB。 該問題已在許多地方的互聯網上進行了研究,但都無濟於事,而且我們的部門負責人(負責該項目的人)也感到沮喪。 有任何想法嗎?

這是JPanel和setEntityImage方法中的繪畫組件。 您可以在paintComponent的底部看到時間戳從何處拉出。 setEntityImage每500毫秒使用一個新的BufferedImage進行設置,該BufferedImage在傳遞到此JPanel中之前已在另一個線程上預先繪制。 我包含該代碼,因為我也很好奇它是否可能是線程問題。

public void setEntityImage(BufferedImage entityImg)
{
    this.entityImg = entityImg;
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    Graphics g2 = (Graphics2D) g;

    g2.fillRect(0, 0, tileImg.getWidth(), tileImg.getHeight());

    // Draw tiles
    g2.drawImage(tileImg, 0, 0, null);

    // Draw box over square mouse is hovering over
    if (hover)
    {
        g2.setColor(new Color(255, 255, 255, 128));
        int screenX = (this.x * 16 - this.y * 16) + Window.WIDTH * 16;
        int screenY = (this.x * 8 + this.y * 8) + 16;

        g2.drawLine(screenX, screenY + 8, screenX + 16, screenY);
        g2.drawLine(screenX + 16, screenY, screenX + 32, screenY + 8);
        g2.drawLine(screenX, screenY + 8, screenX + 16, screenY + 16);
        g2.drawLine(screenX + 16, screenY + 16, screenX + 32, screenY + 8);
    }

    long time = System.currentTimeMillis();
    g2.drawImage(entityImg, 0, 0, null);
    System.out.println(System.currentTimeMillis() - time);
}

暫無
暫無

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

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