Optimizations

This commit is contained in:
Daniel Chappuis 2019-11-22 21:31:51 +01:00
parent 46d19bf550
commit 58df6cdaff
5 changed files with 28 additions and 14 deletions

View File

@ -127,8 +127,14 @@ void ConcaveMeshShape::computeOverlappingTriangles(const AABB& localAABB, List<V
List<int> overlappingNodes(allocator);
mDynamicAABBTree.reportAllShapesOverlappingWithAABB(localAABB, overlappingNodes);
const uint nbOverlappingNodes = overlappingNodes.size();
// Add space in the list of triangles vertices/normals for the new triangles
triangleVertices.addWithoutInit(nbOverlappingNodes * 3);
triangleVerticesNormals.addWithoutInit(nbOverlappingNodes * 3);
// For each overlapping node
for (uint i=0; i < overlappingNodes.size(); i++) {
for (uint i=0; i < nbOverlappingNodes; i++) {
int nodeId = overlappingNodes[i];
@ -136,18 +142,10 @@ void ConcaveMeshShape::computeOverlappingTriangles(const AABB& localAABB, List<V
int32* data = mDynamicAABBTree.getNodeDataInt(nodeId);
// Get the triangle vertices for this node from the concave mesh shape
Vector3 trianglePoints[3];
getTriangleVertices(data[0], data[1], trianglePoints);
triangleVertices.add(trianglePoints[0]);
triangleVertices.add(trianglePoints[1]);
triangleVertices.add(trianglePoints[2]);
getTriangleVertices(data[0], data[1], &(triangleVertices[i * 3]));
// Get the vertices normals of the triangle
Vector3 verticesNormals[3];
getTriangleVerticesNormals(data[0], data[1], verticesNormals);
triangleVerticesNormals.add(verticesNormals[0]);
triangleVerticesNormals.add(verticesNormals[1]);
triangleVerticesNormals.add(verticesNormals[2]);
getTriangleVerticesNormals(data[0], data[1], &(triangleVerticesNormals[i * 3]));
// Compute the triangle shape ID
shapeIds.add(computeTriangleShapeId(data[0], data[1]));

View File

@ -294,6 +294,17 @@ class List {
mSize++;
}
/// Add a given numbers of elements at the end of the list but do not init them
void addWithoutInit(uint nbElements) {
// If we need to allocate more memory
if (mSize == mCapacity) {
reserve(mCapacity == 0 ? nbElements : (mCapacity + nbElements) * 2);
}
mSize += nbElements;
}
/// Try to find a given item of the list and return an iterator
/// pointing to that element if it exists in the list. Otherwise,
/// this method returns the end() iterator

View File

@ -433,8 +433,15 @@ LastFrameCollisionInfo* OverlappingPairs::addLastFrameInfoIfNecessary(uint64 pai
assert(pairIndex < mNbPairs);
uint32 maxShapeId = shapeId1;
uint32 minShapeId = shapeId2;
if (shapeId1 < shapeId2) {
maxShapeId = shapeId2;
minShapeId = shapeId1;
}
// Try to get the corresponding last frame collision info
const uint64 shapesId = pairNumbers(std::max(shapeId1, shapeId2), std::min(shapeId1, shapeId2));
const uint64 shapesId = pairNumbers(maxShapeId, minShapeId);
// If there is no collision info for those two shapes already
auto it = mLastFrameCollisionInfos[pairIndex].find(shapesId);

View File

@ -222,7 +222,6 @@ void CollisionDetectionSystem::computeMiddlePhase(NarrowPhaseInput& narrowPhaseI
assert(mProxyShapesComponents.getBroadPhaseId(mOverlappingPairs.mProxyShapes1[i]) != mProxyShapesComponents.getBroadPhaseId(mOverlappingPairs.mProxyShapes2[i]));
// Check that at least one body is enabled (active and awake) and not static
// TODO : Do not test this every frame
if (mOverlappingPairs.mIsActive[i]) {
const Entity proxyShape1Entity = mOverlappingPairs.mProxyShapes1[i];

View File

@ -320,7 +320,6 @@ class ContactSolverSystem {
RigidBodyComponents& mRigidBodyComponents;
/// Reference to the proxy-shapes components
// TODO : Do we really need to use this ?
ProxyShapeComponents& mProxyShapeComponents;
/// True if the split impulse position correction is active