Skip to content

Commit a30707f

Browse files
committed
optimised Matter.Pairs
1 parent f847f4c commit a30707f

3 files changed

Lines changed: 41 additions & 70 deletions

File tree

examples/manipulation.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Example.manipulation = function() {
6262
var counter = 0,
6363
scaleFactor = 1.01;
6464

65-
Events.on(engine, 'beforeUpdate', function(event) {
65+
Events.on(runner, 'afterTick', function(event) {
6666
counter += 1;
6767

6868
if (counter === 40)

src/collision/Pairs.js

Lines changed: 40 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ var Pair = require('./Pair');
1212
var Common = require('../core/Common');
1313

1414
(function() {
15-
16-
Pairs._pairMaxIdleLife = 1000;
1715

1816
/**
1917
* Creates a new pairs structure.
@@ -40,11 +38,14 @@ var Common = require('../core/Common');
4038
*/
4139
Pairs.update = function(pairs, collisions, timestamp) {
4240
var pairsList = pairs.list,
41+
pairsListLength = pairsList.length,
4342
pairsTable = pairs.table,
43+
collisionsLength = collisions.length,
4444
collisionStart = pairs.collisionStart,
4545
collisionEnd = pairs.collisionEnd,
4646
collisionActive = pairs.collisionActive,
4747
collision,
48+
pairIndex,
4849
pairId,
4950
pair,
5051
i;
@@ -54,91 +55,62 @@ var Common = require('../core/Common');
5455
collisionEnd.length = 0;
5556
collisionActive.length = 0;
5657

57-
for (i = 0; i < pairsList.length; i++) {
58+
for (i = 0; i < pairsListLength; i++) {
5859
pairsList[i].confirmedActive = false;
5960
}
6061

61-
for (i = 0; i < collisions.length; i++) {
62+
for (i = 0; i < collisionsLength; i++) {
6263
collision = collisions[i];
63-
64-
if (collision.collided) {
65-
pairId = Pair.id(collision.bodyA, collision.bodyB);
66-
67-
pair = pairsTable[pairId];
68-
69-
if (pair) {
70-
// pair already exists (but may or may not be active)
71-
if (pair.isActive) {
72-
// pair exists and is active
73-
collisionActive.push(pair);
74-
} else {
75-
// pair exists but was inactive, so a collision has just started again
76-
collisionStart.push(pair);
77-
}
78-
79-
// update the pair
80-
Pair.update(pair, collision, timestamp);
81-
pair.confirmedActive = true;
64+
pairId = Pair.id(collision.bodyA, collision.bodyB);
65+
pair = pairsTable[pairId];
66+
67+
if (pair) {
68+
// pair already exists (but may or may not be active)
69+
if (pair.isActive) {
70+
// pair exists and is active
71+
collisionActive.push(pair);
8272
} else {
83-
// pair did not exist, create a new pair
84-
pair = Pair.create(collision, timestamp);
85-
pairsTable[pairId] = pair;
86-
87-
// push the new pair
73+
// pair exists but was inactive, so a collision has just started again
8874
collisionStart.push(pair);
89-
pairsList.push(pair);
9075
}
91-
}
92-
}
9376

94-
// deactivate previously active pairs that are now inactive
95-
for (i = 0; i < pairsList.length; i++) {
96-
pair = pairsList[i];
97-
if (pair.isActive && !pair.confirmedActive) {
98-
Pair.setActive(pair, false, timestamp);
99-
collisionEnd.push(pair);
77+
// update the pair
78+
Pair.update(pair, collision, timestamp);
79+
pair.confirmedActive = true;
80+
} else {
81+
// pair did not exist, create a new pair
82+
pair = Pair.create(collision, timestamp);
83+
pairsTable[pairId] = pair;
84+
85+
// push the new pair
86+
collisionStart.push(pair);
87+
pairsList.push(pair);
10088
}
10189
}
102-
};
103-
104-
/**
105-
* Finds and removes pairs that have been inactive for a set amount of time.
106-
* @method removeOld
107-
* @param {object} pairs
108-
* @param {number} timestamp
109-
*/
110-
Pairs.removeOld = function(pairs, timestamp) {
111-
var pairsList = pairs.list,
112-
pairsTable = pairs.table,
113-
indexesToRemove = [],
114-
pairMaxIdleLife = Pairs._pairMaxIdleLife,
115-
pair,
116-
collision,
117-
pairIndex,
118-
i;
11990

120-
for (i = 0; i < pairsList.length; i++) {
91+
// find pairs that are no longer active
92+
var removePairIndex = [];
93+
pairsListLength = pairsList.length;
94+
95+
for (i = 0; i < pairsListLength; i++) {
12196
pair = pairsList[i];
122-
collision = pair.collision;
12397

124-
// never remove sleeping pairs
125-
if (collision.bodyA.isSleeping || collision.bodyB.isSleeping) {
126-
pair.timeUpdated = timestamp;
127-
continue;
128-
}
98+
if (!pair.confirmedActive) {
99+
Pair.setActive(pair, false, timestamp);
100+
collisionEnd.push(pair);
129101

130-
// if pair is inactive for too long, mark it to be removed
131-
if (timestamp - pair.timeUpdated > pairMaxIdleLife) {
132-
indexesToRemove.push(i);
102+
if (!pair.collision.bodyA.isSleeping && !pair.collision.bodyB.isSleeping) {
103+
removePairIndex.push(i);
104+
}
133105
}
134106
}
135107

136-
// remove marked pairs
137-
for (i = 0; i < indexesToRemove.length; i++) {
138-
pairIndex = indexesToRemove[i] - i;
108+
// remove inactive pairs
109+
for (i = 0; i < removePairIndex.length; i++) {
110+
pairIndex = removePairIndex[i] - i;
139111
pair = pairsList[pairIndex];
140-
delete pairsTable[pair.id];
141112
pairsList.splice(pairIndex, 1);
113+
delete pairsTable[pair.id];
142114
}
143115
};
144116

src/core/Engine.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ var Body = require('../body/Body');
152152
var pairs = engine.pairs,
153153
timestamp = timing.timestamp;
154154
Pairs.update(pairs, collisions, timestamp);
155-
Pairs.removeOld(pairs, timestamp);
156155

157156
// wake up bodies involved in collisions
158157
if (engine.enableSleeping)

0 commit comments

Comments
 (0)