NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hello Bill, I have already changed the DisplayImplJ3D and the VisADCanvasJ3D for my own, so I have no problem with offscreen rendering. I only wanted to submit the problem, to improve the visad library. But I would do it in another way than yours. I would generally call removeNotify() instead of stopRenderer() in VisASCanvasJ3D. It also works when not using offscreen rendering. public void stop() { removeNotify(); // works also when not using offscreen rendering display = null; displayRenderer = null; if (component == null) { display.destroyUniverse(); } . . . And instead of adding a new method 'destroyUniverse' in DisplayImplJ3D, I suggest to add this in the destroy() method: public void destroy() throws VisADException, RemoteException { // WLH 17 Dec 2001 // ((DisplayRendererJ3D) getDisplayRenderer()).getCanvas().stop(); ((DisplayRendererJ3D) getDisplayRenderer()).destroy(); if (universe != null) universe.destroy(); // when offscreen super.destroy(); } I using both rendering methods (offscreen and 'normal') and I don't want to call different methods for destroying, depeding on the rendering mode. Cheers, Hannes -----Original Message----- From: Bill Hibbard <billh@xxxxxxxxxxxxx> To: Johann Liedl <JLiedl@xxxxxxxxxxxxxx> Date: Wed, 12 Mar 2003 11:51:49 -0600 (CST) Subject: Re: Memory leak when using offscreen rendering > Hi Johann, > > I have put versions of DisplayImplJ3D.java and > VisADCanvasJ3D.java on: > > ftp://ftp.ssec.wisc.edu/pub/visad-2.0/untested/ > > with modified versions of you changes. Specifically, > there is a new method in in DisplayImplJ3D: > > public void destroyUniverse() { > if (universe != null) universe.destroy(); > } > > and in VisADCanvasJ3D: > > public void stop() { > try { > stopRenderer(); > } > catch (IllegalStateException e) { > removeNotify(); > } > display = null; > displayRenderer = null; > if (component == null) { > display.destroyUniverse(); > } > else if (component instanceof DisplayPanelJ3D) { > ((DisplayPanelJ3D) component).destroy(); > } > . . . > > Please let me know if these changes solve your problem. > > Cheers, > Bill > > On Wed, 12 Mar 2003, Johann Liedl wrote: > > > Hello, > > > > When using offscreen rendering, there are 2 problems with memory > > when destroying the 3D scene: > > > > 1. When invoking DisplayImplJ3D.destroy(), I get a > 'IllegalStateException' > > thrown in Canvas3D.stopRenderer(). > > Suggested solution: In the VisADCanvasJ3D.stop() method, instead of > > calling stopRenderer(), the method removeNotify() should be invoked. > > > > 2. The UniverseBuilderJ3D.destroy() method is never reach, because > the > > attribute 'component' in VisADCanvasJ3D is null. > > Suggested solution: Add a attribute 'universe' in DisplayImplJ3D, > which > > has e reference to the universe and is assign in the initialize(..) > > method. When the DisplayImplJ3D.destroy() method is invoked, call > also > > universe.destroy(); > > > > Cheers, > > > > Hannes > > > >
visad
archives: