我想知道一段代码:
public void render()
{
BufferStrategy bs = getBufferStrategy();
if(bs == null)
{
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.dispose();
bs.show();
}
渲染在游戏循环中。
在我正在阅读的书中,它说我需要在这里打电话。我真的不明白为什么。是不是每次渲染循环都会覆盖g。
答案 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()
的每次调用,它都是一个新对象。