aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/classes/share/javax/media/j3d/BoundingBox.java20
-rw-r--r--src/classes/share/javax/media/j3d/MasterControl.java15
2 files changed, 31 insertions, 4 deletions
diff --git a/src/classes/share/javax/media/j3d/BoundingBox.java b/src/classes/share/javax/media/j3d/BoundingBox.java
index bb73c8b..5133550 100644
--- a/src/classes/share/javax/media/j3d/BoundingBox.java
+++ b/src/classes/share/javax/media/j3d/BoundingBox.java
@@ -42,7 +42,7 @@ public class BoundingBox extends Bounds {
private BoundingSphere tmpSphere = null;
private BoundingBox tmpBox = null;
private BoundingPolytope tmpPolytope = null;
- private Point3d tmpP3d = new Point3d();
+ private Point3d tmpP3d = null;
/**
@@ -683,6 +683,13 @@ public class BoundingBox extends Bounds {
else {
throw new IllegalArgumentException(J3dI18N.getString("BoundingBox5"));
}
+
+ // Release the temporary fields:
+ if (VirtualUniverse.mc.releaseBoundingBoxMemory) {
+ tmpSphere = null;
+ tmpBox = null;
+ tmpPolytope = null;
+ }
}
/**
@@ -693,7 +700,11 @@ public class BoundingBox extends Bounds {
if(boundsIsInfinite)
return;
-
+
+ if (tmpP3d == null) {
+ tmpP3d = new Point3d();
+ }
+
double ux, uy, uz, lx, ly, lz;
ux = upper.x; uy = upper.y; uz = upper.z;
lx = lower.x; ly = lower.y; lz = lower.z;
@@ -770,6 +781,11 @@ public class BoundingBox extends Bounds {
if ( tmpP3d.y < lower.y ) lower.y = tmpP3d.y;
if ( tmpP3d.z < lower.z ) lower.z = tmpP3d.z;
+ if (VirtualUniverse.mc.releaseBoundingBoxMemory) {
+ // Free memory
+ tmpP3d = null;
+ }
+
}
/**
diff --git a/src/classes/share/javax/media/j3d/MasterControl.java b/src/classes/share/javax/media/j3d/MasterControl.java
index fee00ce..0dd364e 100644
--- a/src/classes/share/javax/media/j3d/MasterControl.java
+++ b/src/classes/share/javax/media/j3d/MasterControl.java
@@ -476,7 +476,15 @@ class MasterControl {
//Set as true if you have memory leaks after disposing Canvas3D.
//Default false value does affect Java3D View dispose behavior.
boolean forceReleaseView = false;
-
+
+ // Issue 561: Set by -Dj3d.releaseBoundingBoxMemory property.
+ // When set to true, the per-instance fields used in bounding box
+ // transformation are released at the end of transform methods. This saves
+ // a significant amount of memory in large scenes containing huge amounts
+ // of bounding boxes. Setting this false can improve performance when
+ // lots of transforms are performed. The default is false.
+ boolean releaseBoundingBoxMemory = false;
+
// Issue 480: Cache the bounds of nodes so that getBounds does not
// recompute the boounds of the entire graph per call
boolean cacheAutoComputedBounds = false;
@@ -535,6 +543,9 @@ class MasterControl {
"forceReleaseView after Canvas3D dispose enabled",
"forceReleaseView after Canvas3D dispose disabled");
+ releaseBoundingBoxMemory = getBooleanProperty("j3d.releaseBoundingBoxMemory",
+ releaseBoundingBoxMemory, "releasing memory after bounding box transform");
+
useCombiners = getBooleanProperty("j3d.usecombiners", useCombiners,
"Using NV_register_combiners if available",
"NV_register_combiners disabled");
@@ -1417,7 +1428,7 @@ class MasterControl {
}
}
}
- }
+ }
if ((targetThreads & J3dThread.UPDATE_RENDER) != 0) {
// Note that we don't check for active view