Java Graphics Dispose方法

时间:2015-06-07 17:45:03

标签: java graphics 2d-games

我想知道一段代码:

public void render()
{
    BufferStrategy bs = getBufferStrategy();

    if(bs == null)
    {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();

    g.dispose();
    bs.show();
}

渲染在游戏循环中。

在我正在阅读的书中,它说我需要在这里打电话。我真的不明白为什么。是不是每次渲染循环都会覆盖g。

2 个答案:

答案 0 :(得分:0)

根据JavaDoc应该出于性能原因。如果释放所有的依据,它将通过垃圾收集器自行处理。

你问:

  

无论如何,每次渲染循环都不会覆盖g。

好吧,在您的情况下,每次查询图形上下文时都会创建一个 new Graphics对象。因此,应该调用dispose,就像它只调用一次一样,因为每个实例都是一个孤立的情况。

答案 1 :(得分:0)

每个Graphics对象都使用系统资源,这些资源应该被释放。这与需要在您已打开的close()上致电InputStream非常相似。

如果不这样做,对象的finalize()方法中会有代码返回资源。但是Java中的一个已知问题是finalize()可能被调用很晚,或根本不调用,因此这些资源永远不会被清除。这可能导致程序在资源不足时停止工作。

您可能会认为,因为在render()结束时,变量g超出范围,所以无论如何都会进行垃圾收集。但它只是成为收藏的候选人。具有终结器的对象不会很快收集 - 终结器必须在完全删除对象之前运行。在任何情况下,垃圾收集都会处理内存分配,而不是其他系统资源。

documentation of the dispose() method itself中简要解释了这一点。

请注意the documentation for BufferStrategy.getDrawGraphics()告诉您,每次调用它时,都会创建图形上下文。也就是说,每次都没有获得相同的对象 - 对于getDrawGraphics()的每次调用,它都是一个新对象。