Bladeren bron

Merge pull request #132 from phr00t/master

- performance improvements to PhysicsSpace - thanks to @phr00t
- ups jME Java dependence to Java 1.6
normen 11 jaren geleden
bovenliggende
commit
f1a485a965

+ 10 - 10
jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java

@@ -46,6 +46,8 @@ import com.jme3.math.Transform;
 import com.jme3.math.Vector3f;
 import com.jme3.scene.Node;
 import com.jme3.scene.Spatial;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -91,8 +93,8 @@ public class PhysicsSpace {
     private Map<Long, PhysicsRigidBody> physicsBodies = new ConcurrentHashMap<Long, PhysicsRigidBody>();
     private Map<Long, PhysicsJoint> physicsJoints = new ConcurrentHashMap<Long, PhysicsJoint>();
     private Map<Long, PhysicsVehicle> physicsVehicles = new ConcurrentHashMap<Long, PhysicsVehicle>();
-    private List<PhysicsCollisionListener> collisionListeners = new LinkedList<PhysicsCollisionListener>();
-    private List<PhysicsCollisionEvent> collisionEvents = new LinkedList<PhysicsCollisionEvent>();
+    private ArrayList<PhysicsCollisionListener> collisionListeners = new ArrayList<PhysicsCollisionListener>();
+    private ArrayDeque<PhysicsCollisionEvent> collisionEvents = new ArrayDeque<PhysicsCollisionEvent>();
     private Map<Integer, PhysicsCollisionGroupListener> collisionGroupListeners = new ConcurrentHashMap<Integer, PhysicsCollisionGroupListener>();
     private ConcurrentLinkedQueue<PhysicsTickListener> tickListeners = new ConcurrentLinkedQueue<PhysicsTickListener>();
     private PhysicsCollisionEventFactory eventFactory = new PhysicsCollisionEventFactory();
@@ -331,7 +333,7 @@ public class PhysicsSpace {
 //    }
     private void addCollisionEvent_native(PhysicsCollisionObject node, PhysicsCollisionObject node1, long manifoldPointObjectId) {
 //        System.out.println("addCollisionEvent:"+node.getObjectId()+" "+ node1.getObjectId());
-        collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId));
+        collisionEvents.push(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId));
     }
 
     /**
@@ -361,17 +363,15 @@ public class PhysicsSpace {
 
     public void distributeEvents() {
         //add collision callbacks
-//        synchronized (collisionEvents) {
-        for (Iterator<PhysicsCollisionEvent> it = collisionEvents.iterator(); it.hasNext();) {
-            PhysicsCollisionEvent physicsCollisionEvent = it.next();
-            for (PhysicsCollisionListener listener : collisionListeners) {
-                listener.collision(physicsCollisionEvent);
+        int clistsize = collisionListeners.size();
+        while( collisionEvents.isEmpty() == false ) {
+            PhysicsCollisionEvent physicsCollisionEvent = collisionEvents.pop();
+            for(int i=0;i<clistsize;i++) {
+                collisionListeners.get(i).collision(physicsCollisionEvent);
             }
             //recycle events
             eventFactory.recycle(physicsCollisionEvent);
-            it.remove();
         }
-//        }
     }
 
     public static <V> Future<V> enqueueOnThisThread(Callable<V> callable) {

+ 14 - 14
jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java

@@ -66,6 +66,8 @@ import com.jme3.math.Transform;
 import com.jme3.math.Vector3f;
 import com.jme3.scene.Node;
 import com.jme3.scene.Spatial;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -111,8 +113,8 @@ public class PhysicsSpace {
     private Map<RaycastVehicle, PhysicsVehicle> physicsVehicles = new ConcurrentHashMap<RaycastVehicle, PhysicsVehicle>();
     private Map<Integer, PhysicsCollisionGroupListener> collisionGroupListeners = new ConcurrentHashMap<Integer, PhysicsCollisionGroupListener>();
     private ConcurrentLinkedQueue<PhysicsTickListener> tickListeners = new ConcurrentLinkedQueue<PhysicsTickListener>();
-    private List<PhysicsCollisionListener> collisionListeners = new LinkedList<PhysicsCollisionListener>();
-    private List<PhysicsCollisionEvent> collisionEvents = new LinkedList<PhysicsCollisionEvent>();
+    private ArrayList<PhysicsCollisionListener> collisionListeners = new ArrayList<PhysicsCollisionListener>();
+    private ArrayDeque<PhysicsCollisionEvent> collisionEvents = new ArrayDeque<PhysicsCollisionEvent>();
     private PhysicsCollisionEventFactory eventFactory = new PhysicsCollisionEventFactory();
     private Vector3f worldMin = new Vector3f(-10000f, -10000f, -10000f);
     private Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f);
@@ -294,7 +296,7 @@ public class PhysicsSpace {
                     CollisionObject rBody1 = (CollisionObject) body1;
                     node = (PhysicsCollisionObject) rBody0.getUserPointer();
                     node1 = (PhysicsCollisionObject) rBody1.getUserPointer();
-                    collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, cp));
+                    collisionEvents.push(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, cp));
                 }
                 return true;
             }
@@ -332,19 +334,17 @@ public class PhysicsSpace {
 
     public void distributeEvents() {
         //add collision callbacks
-//        synchronized (collisionEvents) {
-            for (Iterator<PhysicsCollisionEvent> it = collisionEvents.iterator(); it.hasNext();) {
-                PhysicsCollisionEvent physicsCollisionEvent = it.next();
-                for (PhysicsCollisionListener listener : collisionListeners) {
-                    listener.collision(physicsCollisionEvent);
-                }
-                //recycle events
-                eventFactory.recycle(physicsCollisionEvent);
-                it.remove();
+        int clistsize = collisionListeners.size();
+        while( collisionEvents.isEmpty() == false ) {
+            PhysicsCollisionEvent physicsCollisionEvent = collisionEvents.pop();
+            for(int i=0;i<clistsize;i++) {
+                collisionListeners.get(i).collision(physicsCollisionEvent);
             }
-//        }
+            //recycle events
+            eventFactory.recycle(physicsCollisionEvent);
+        }
     }
-
+    
     public static <V> Future<V> enqueueOnThisThread(Callable<V> callable) {
         AppTask<V> task = new AppTask<V>(callable);
         System.out.println("created apptask");