Misc SurfaceData Optimizations (#7299)
* Misc SurfaceData Optimizations. This includes a few different optimizations found while trying to make the bulk query APIs faster: * Switches mutexes over to shared_lock to optimize for the multi-reader-single-writer pattern * Surface provider point creation now uses a pre-created set of masks to initialize with, and uses std::move() to move the created point into the output list instead of copying it. * Splits CombineSortAndFilterNeightboringPoints so that the FilterPoints() can occur separately and efficiently with erase/remove_if, and avoids making a copy of the output points. * Optimized SurfaceDataShapeComponent::ModifySurfacePoints * Fixed potential bug where the sort wasn't stable since it only compared the Z value, and could have produced unexpected results for differing points with the exact same Z value. * Fixed up a couple small bugs and missing checks in the unit tests Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fixed syntax on unit tests. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com>
This commit is contained in:
+6
-5
@@ -95,6 +95,7 @@ namespace SurfaceData
|
||||
m_refresh = false;
|
||||
|
||||
// Update the cached mesh data and bounds, then register the surface data provider
|
||||
AssignSurfaceTagWeights(m_configuration.m_tags, 1.0f, m_newPointWeights);
|
||||
UpdateMeshData();
|
||||
}
|
||||
|
||||
@@ -115,7 +116,7 @@ namespace SurfaceData
|
||||
|
||||
// Clear the cached mesh data
|
||||
{
|
||||
AZStd::lock_guard<decltype(m_cacheMutex)> lock(m_cacheMutex);
|
||||
AZStd::unique_lock<decltype(m_cacheMutex)> lock(m_cacheMutex);
|
||||
m_meshAssetData = {};
|
||||
m_meshBounds = AZ::Aabb::CreateNull();
|
||||
m_meshWorldTM = AZ::Transform::CreateIdentity();
|
||||
@@ -145,7 +146,7 @@ namespace SurfaceData
|
||||
|
||||
bool SurfaceDataMeshComponent::DoRayTrace(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, AZ::Vector3& outNormal) const
|
||||
{
|
||||
AZStd::lock_guard<decltype(m_cacheMutex)> lock(m_cacheMutex);
|
||||
AZStd::shared_lock<decltype(m_cacheMutex)> lock(m_cacheMutex);
|
||||
|
||||
// test AABB as first pass to claim the point
|
||||
const AZ::Vector3 testPosition = AZ::Vector3(
|
||||
@@ -181,8 +182,8 @@ namespace SurfaceData
|
||||
point.m_entityId = GetEntityId();
|
||||
point.m_position = hitPosition;
|
||||
point.m_normal = hitNormal;
|
||||
AddMaxValueForMasks(point.m_masks, m_configuration.m_tags, 1.0f);
|
||||
surfacePointList.push_back(point);
|
||||
point.m_masks = m_newPointWeights;
|
||||
surfacePointList.push_back(AZStd::move(point));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,7 +236,7 @@ namespace SurfaceData
|
||||
bool meshValidAfterUpdate = false;
|
||||
|
||||
{
|
||||
AZStd::lock_guard<decltype(m_cacheMutex)> lock(m_cacheMutex);
|
||||
AZStd::unique_lock<decltype(m_cacheMutex)> lock(m_cacheMutex);
|
||||
|
||||
meshValidBeforeUpdate = (m_meshAssetData.GetAs<AZ::RPI::ModelAsset>() != nullptr) && (m_meshBounds.IsValid());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user