Subject: Re: [JAVA3D] Trouble with Link/SharedGroup - is it a Java3D bug??


> We also use shared groups to put in trees, boulders, etc, but we haven't
> put all that many into a scene yet.  I've not noticed any specific
> memory issues (Java 3D is a memory hog but we all know that).

Sigh, ok, nobody seems to believe me....

Here is a small code snippet that demonstrates the effect (e.g. in a
HelloUniverse environment).
I turns out that the memory consumption depends on the complexity/depth of
the subtree that
is used below the SharedGroup. I create an arbitrary tree with some
ColorCubes and TGs and
either Link/SharedGroup or cloneTree() it. The bigger the subtree, the
better the Link-solution
should be. In cases where the subtree in question only consists of one or
two groups, it should
not make any difference at all anyway.

The samples creates only 10 clones/links. While cloning keeps the memory
consumption well
below 40megs, Link gives an OutOfMemoryException even with -Xmx256mb.

A smaller test (createDeepSubGraph(6)) works marginally with 256MB and
produces
2.021.371 instances of javax.media.j3d.BranchGroupRetained.

I'd really appreciate if someone could confirm my observation.


================================================================

 /**
  * Create a subgraph with 10 objects by either Linking or cloning an
object.
  */
 Node create10Objects( boolean clone )
 {
  Group grp = new Group();

  // Create a non-trivial subgraph
  Node object = createDeepSubGraph( 7 );
  System.out.println( numNodesCreated );

  // Setup sharedgroup
  SharedGroup shared = null;
  if ( ! clone )
  {
   shared = new SharedGroup();
   shared.addChild( object );
  }

  // Add the objects
  for ( int i = 0; i < 10; i++ )
  {
   TransformGroup tg = new TransformGroup();
   Transform3D t3d = new Transform3D();
   t3d.setTranslation( new Vector3f( i * 2.0f, 0.0f, i * 2.0f ) );
   tg.setTransform( t3d );

   // either link or clone the object
   if ( clone )
    tg.addChild( object.cloneTree() );
   else
    tg.addChild( new Link( shared ) );

   grp.addChild( tg );
  }
  return grp;
 }


 /**
  * Create subgraph of a certain depth.
  */
 static int numNodesCreated = 0;
 Node createDeepSubGraph( int depth )
 {
  BranchGroup g = new BranchGroup();

  // One new cube...
  g.addChild( new ColorCube( 0.1 ) );
  numNodesCreated++;

  // ...and maybe two subgraphs
  if ( depth > 0 )
  {
   Transform3D t3d = new Transform3D();
   Transform3D t3d2 = new Transform3D();
   TransformGroup tg;

   t3d.setScale( 0.2 * (double)depth );
   t3d2.setTranslation( new Vector3f( 0.2f, -0.2f, 0.0f ) );
   t3d.mul( t3d2 );
   tg = new TransformGroup();
   tg.setTransform( t3d );
   tg.addChild( createDeepSubGraph( depth - 1 ) );
   g.addChild( tg );

   t3d.setScale( 0.2 * (double)depth );
   t3d2.setTranslation( new Vector3f( -0.2f, -0.2f, 0.0f ) );
   t3d.mul( t3d2 );
   tg = new TransformGroup();
   tg.setTransform( t3d );
   tg.addChild( createDeepSubGraph( depth - 1 ) );
   g.addChild( tg );
  }
  return g;
 }

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to