From 7e4defbf3b67ca2c1427e02718cc29686668ee38 Mon Sep 17 00:00:00 2001 From: Piotr Makal Date: Sun, 24 Aug 2025 08:59:47 -0400 Subject: [PATCH] Fix: Performance regression when using bevel and subdivision modifier PR https://projects.blender.org/blender/blender/pulls/144233. Fix #142296 performance regression caused by merging UV positions based on face area weights, replacing it with mean average weights computation. The former method resulted in higher probability in making subdivision cache invalid between frame updates and thus causing expensive recreation of blender::bke::subdiv::OpenSubdiv_Evaluator object. While this fix isn't directly answering a question why specific UV position updates would cause this reevaluation of subdivision object, it fixes the performance regression caused by #139595 PR. --- source/blender/bmesh/tools/bmesh_bevel.cc | 23 ++++++++------------- tests/files/modeling/bevel_regression.blend | 4 ++-- tests/files/modeling/modifiers.blend | 4 ++-- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/source/blender/bmesh/tools/bmesh_bevel.cc b/source/blender/bmesh/tools/bmesh_bevel.cc index ee45d3fce46..3255759f8a7 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.cc +++ b/source/blender/bmesh/tools/bmesh_bevel.cc @@ -814,24 +814,19 @@ static void bevel_merge_uvs(BevelParams *bp, BMesh *bm) int uv_data_offset = CustomData_get_n_offset(&bm->ldata, CD_PROP_FLOAT2, i); for (Vector &uv_vert_buckets : bp->uv_vert_maps[i].values()) { for (UVVertBucket &uv_vert_bucket : uv_vert_buckets) { - /* Using face weights instead of mean average because it produces slightly better results, - * although this is purely empirical and subjective. */ - float weight_sum = 0.0f; + int num_uv_verts = uv_vert_bucket.size(); + if (num_uv_verts <= 1) { + continue; + } float uv[2] = {0.0f, 0.0f}; for (BMLoop *l : uv_vert_bucket) { float *luv = BM_ELEM_CD_GET_FLOAT_P(l, uv_data_offset); - float weighted_luv[2] = {0.0f, 0.0f}; - float face_area = BM_face_calc_area(l->f); - mul_v2_v2fl(weighted_luv, luv, face_area); - add_v2_v2(uv, weighted_luv); - weight_sum += face_area; + add_v2_v2(uv, luv); } - if (uv_vert_bucket.size() > 1 && weight_sum > 0.0f) { - mul_v2_fl(uv, 1.0f / weight_sum); - for (BMLoop *l : uv_vert_bucket) { - float *luv = BM_ELEM_CD_GET_FLOAT_P(l, uv_data_offset); - copy_v2_v2(luv, uv); - } + mul_v2_fl(uv, 1.0f / (float)num_uv_verts); + for (BMLoop *l : uv_vert_bucket) { + float *luv = BM_ELEM_CD_GET_FLOAT_P(l, uv_data_offset); + copy_v2_v2(luv, uv); } } } diff --git a/tests/files/modeling/bevel_regression.blend b/tests/files/modeling/bevel_regression.blend index d67c23e2976..29a655cf6ae 100644 --- a/tests/files/modeling/bevel_regression.blend +++ b/tests/files/modeling/bevel_regression.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84c67236facdbf8d387f4f7f8013da452ce9734f119dc027ea44c70ccb5f9ecd -size 1857148 +oid sha256:c99fb440ca7539b5af8572feb66a0ee1d78d144aee13e8e12d6250eaae8d9149 +size 1908499 diff --git a/tests/files/modeling/modifiers.blend b/tests/files/modeling/modifiers.blend index a8c3b5b7358..b104e8e8f43 100644 --- a/tests/files/modeling/modifiers.blend +++ b/tests/files/modeling/modifiers.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f6efef2004ac186610b7fd615e9fb4c56afc144a774d10beeafa9d051ace280d -size 11622132 +oid sha256:cbbcc3fb806d0ff1212bdf8d83228cb1da0d5963096c2a78124e8970fe46635f +size 11727105