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
> >
> >