[Bf-blender-cvs] [dffd032bc9b] master: Geometry Nodes: Remove unnecessary copy when replacing data

Hans Goudey noreply at git.blender.org
Fri Dec 10 00:43:42 CET 2021


Commit: dffd032bc9b9cd0dbb710f1f3d3f0b14361bc267
Author: Hans Goudey
Date:   Thu Dec 9 17:43:30 2021 -0600
Branches: master
https://developer.blender.org/rBdffd032bc9b9cd0dbb710f1f3d3f0b14361bc267

Geometry Nodes: Remove unnecessary copy when replacing data

In the `replace_mesh`/`replace_curve` etc. methods, the component
was retrieved with write access. Retrieving with write access will
duplicate the data if the component has another user. This means that
the replaced geometry data was often duplicated just to be deleted
a moment later.

I expect this would have a large impact in performance in some specific
situations when dealing with large geometry. In a scene with many small
meshes though, I didn't observe a significant difference.

This also makes replacing a geometry set's data with the same data
that's already in the set safe. It would be valid to assert for that
case instead, but this seems safer.

Differential Revision: https://developer.blender.org/D13530

===================================================================

M	source/blender/blenkernel/intern/geometry_set.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 214d88d1a63..7830e897109 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -353,7 +353,10 @@ void GeometrySet::replace_mesh(Mesh *mesh, GeometryOwnershipType ownership)
     this->remove<MeshComponent>();
     return;
   }
-
+  if (mesh == this->get_mesh_for_read()) {
+    return;
+  }
+  this->remove<MeshComponent>();
   MeshComponent &component = this->get_component_for_write<MeshComponent>();
   component.replace(mesh, ownership);
 }
@@ -364,7 +367,10 @@ void GeometrySet::replace_curve(CurveEval *curve, GeometryOwnershipType ownershi
     this->remove<CurveComponent>();
     return;
   }
-
+  if (curve == this->get_curve_for_read()) {
+    return;
+  }
+  this->remove<CurveComponent>();
   CurveComponent &component = this->get_component_for_write<CurveComponent>();
   component.replace(curve, ownership);
 }
@@ -375,7 +381,10 @@ void GeometrySet::replace_pointcloud(PointCloud *pointcloud, GeometryOwnershipTy
     this->remove<PointCloudComponent>();
     return;
   }
-
+  if (pointcloud == this->get_pointcloud_for_read()) {
+    return;
+  }
+  this->remove<PointCloudComponent>();
   PointCloudComponent &component = this->get_component_for_write<PointCloudComponent>();
   component.replace(pointcloud, ownership);
 }
@@ -386,7 +395,10 @@ void GeometrySet::replace_volume(Volume *volume, GeometryOwnershipType ownership
     this->remove<VolumeComponent>();
     return;
   }
-
+  if (volume == this->get_volume_for_read()) {
+    return;
+  }
+  this->remove<VolumeComponent>();
   VolumeComponent &component = this->get_component_for_write<VolumeComponent>();
   component.replace(volume, ownership);
 }



More information about the Bf-blender-cvs mailing list