From 518c5ce4cd75aabcc649efb9e118d18622b5ea70 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sat, 8 May 2021 23:57:36 -0500 Subject: Geometry Nodes: Improve point instance node performance This commit uses two changes to improve the performance of the point instance node. **Prevent Reallocations** At 64 bytes, the transform matrix for every instance is rather large, so reallocating the vector as it grows can become a performance bottle- neck. This commit reserves memory for the instances that will be added to prevent unecessary reallocations as the instance vector grows. In a test with 4 million instances of 3 objects in a collection, the node was about 40% faster, from 370ms to 270ms for the node. **Parallelization** Currently the instances are added by appending to a vector. By changing this slightly to fill indices instead, we can parallelize the operation so that multiple threads can fill data at the same time. Tested on a Ryzen 3700x, this reduced the runtime from the above 270ms to 44ms average, bringing the total speedup to ~8x. Note that displaying the instances in the viewport is still much slower than the calculations in node, this change doesn't affect that. --- source/blender/blenkernel/BKE_geometry_set.hh | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source/blender/blenkernel/BKE_geometry_set.hh') diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 106af8172d1..bd2b062152d 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -597,6 +597,7 @@ class InstancesComponent : public GeometryComponent { void clear(); void reserve(int min_capacity); + void resize(int capacity); int add_reference(InstanceReference reference); void add_instance(int instance_handle, const blender::float4x4 &transform, const int id = -1); @@ -604,6 +605,7 @@ class InstancesComponent : public GeometryComponent { blender::Span references() const; blender::Span instance_reference_handles() const; + blender::MutableSpan instance_reference_handles(); blender::MutableSpan instance_transforms(); blender::Span instance_transforms() const; blender::MutableSpan instance_ids(); -- cgit v1.2.3