簡體   English   中英

BufferedImage.createGraphics()內存泄漏

[英]BufferedImage.createGraphics() memory leak

下面的代碼產生內存泄漏。

public static BufferedImage mergeImages2(BufferedImage base, Collection<Light> images) {
    BufferedImage output = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_ARGB);

    Graphics2D g = output.createGraphics();
    g.drawImage(base, 0, 0, null);
    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 1.0f));
    for (Light l : images) {
        g.drawImage(l.LIGHT_IMAGE, l.x, l.y, null);
        l.LIGHT_IMAGE.flush();
    }
    g.dispose();
    output.flush();
    return output;
}

正如我在這里閱讀的: BufferedImage.getGraphics()導致內存泄漏,是否有修復程序? .createGraphics()是問題所在。

該代碼可以經常執行(將計時器設置為以50ms的恆定速率計時,如果燈光“移動”,它將調用此代碼,但是如果燈光停留在同一位置,則將其跳過)。 它運行良好,但每次都會使進程變得笨拙,這是一個級聯進程,最終導致在不到一分鍾的時間內從約18萬個內存增加到超過60萬個內存。 從圖形上講,它可以正常工作,直到在某些時候結塊變得過多(顯然)並且FPS急劇下降為止。

現在,我縮小了范圍,認為此塊會產生泄漏,因為注釋它的調用使問題消失了。

繪制的基本圖像為1024x561,燈光的圖像很小(50x50)。 到目前為止,我一直只用陣列中的一盞燈對其進行測試。

有什么解決方案可以避免內存泄漏?

正如安德魯·湯普森(Andrew Thompson)所說,這不一定是內存泄漏。 垃圾收集器的啟動可能比您想象的要晚。 您可以嘗試在燈光不動的情況下嘗試System.gc()調用,盡管通常不建議調用System.gc(): 什么時候System.gc()做任何事情

另外,您可以嘗試直接操作BufferedImage后面的整數數組(不容易),或者使用其他API(如JOGL)。

暫無
暫無

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

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