Java垃圾收集与图形处理方法

Java垃圾收集与图形处理方法,java,graphics,sync,dispose,toolkit,Java,Graphics,Sync,Dispose,Toolkit,我的业余爱好是制作一个游戏(克隆蛇)。我正在查看JavaAPI中图形类中的dispose方法。当我注释掉dispose方法时,我的动画以同样的方式工作,不管有没有它都可以。在Java API中,dispose方法执行此操作—释放图形上下文正在使用的系统资源。Java垃圾收集管理程序内存的方式是否与dispose类似?我应该保留处置方法吗 API对解释同步方法没有多大帮助。但从我在其他论坛上读到的内容来看,ToolKit类中的sync方法是为了确保绘图操作(如我认为的paintComponent方

我的业余爱好是制作一个游戏(克隆蛇)。我正在查看JavaAPI中图形类中的dispose方法。当我注释掉dispose方法时,我的动画以同样的方式工作,不管有没有它都可以。在Java API中,dispose方法执行此操作—释放图形上下文正在使用的系统资源。Java垃圾收集管理程序内存的方式是否与dispose类似?我应该保留处置方法吗

API对解释同步方法没有多大帮助。但从我在其他论坛上读到的内容来看,ToolKit类中的sync方法是为了确保绘图操作(如我认为的paintComponent方法)刷新到图形卡。那么,图形卡的任务是清理程序中以前的图形上下文的任何剩余部分吗

代码如下:

 public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Toolkit.getDefaultToolkit().sync();
            g.dispose();

     }

说到
图形
有一个简单的原则

如果您显式创建了它(例如
BuffereImage.createGraphics()
),则将其丢弃


paintComponent(Graphics g)
中,实例
g
由工具包提供,并在需要时进行处理。在自己的代码中这样做会导致“不可预测”的渲染。

Javadoc说:
当Java程序运行时,可以在短时间内创建大量图形对象。尽管垃圾收集器的终结过程也会处理相同的系统资源,最好通过调用此方法手动释放关联的资源,而不是依赖于可能在很长一段时间内无法运行到完成的终结过程。
永远不要依赖垃圾收集器获取系统/非托管资源。您的GC可能在几分钟内无法启动,而您的图形堆栈可能已耗尽,这将导致您在有大量可用ram的情况下停止查看图形。在.NET中的Java中发生这种情况并不重要,因为GUI对象池受到约束,即即使您有8GB的ram,也不能期望分配1000000个笔刷。ram越多,GC的攻击性就越小,这就是问题所在。我在.NET中见过许多应用程序,它们画的是“红十字”,而不是按钮和图像,然后在5分钟内复活。图形堆栈位于操作系统中——这是一件合乎逻辑的事情,例如在Windows上的gdi.dll中。若设备驱动程序支持某些硬件加速,那个么刷子和笔之类的东西可能会通过管道传输到PCI卡中。但GDI是内部固定大小阵列的瓶颈。例如,在Android上,2d绘图是使用SKIA库制作的,每个画笔都需要ram/pen@Nicholas:Graphics stack=如“Graphics components”(图形组件)中所述,它是2d基本体(至少)和窗口管理功能(管理区域中位图显示的功能)的渲染机制。这就是我所说的图形堆栈。不要与用于执行代码的堆栈段混淆,堆栈段是CPU专用寄存器(用于相对寻址和引用临时值的指针寄存器)。为了提高效率,我从java文档中读取了这段代码,仅当图形对象直接从组件或其他图形对象创建时,程序员才应在使用完图形对象后调用dispose。实际上,我应该自己处理它,因为图形对象是创建图形上下文g的对象。我牢记这一原则。感谢你的知识,安德鲁!这里也讨论了:,同样的答案。