Files
test/source/blender/depsgraph/intern/depsgraph_relation.hh
Hans Goudey d1df97bd48 Depsgraph: Use LinearAllocator to allocate Relations
I observed allocation becoming a bottleneck when building the depsgraph
with scenes with many simple data-blocks. One of the main culprits was
the struct that encodes relations between nodes in the graph.

Instead of allocating each `Relation` with a separate allocation call,
combine them into a `LinearAllocator`. That is must faster because it
allocates in large chunks and just bumps an offset on each allocation.

In a test file with 30 thousand cube objects, I observe a 1.18x
improvement in depsgraph evaluation time, from 1370 to 1163 ms.

The depsgraph isn't completely re-allocated when it's rebuilt, so the
allocator added in this PR has to be cleared manually. In the future,
it can be used for other structs or potentially strings.

Pull Request: https://projects.blender.org/blender/blender/pulls/137303
2025-04-11 17:14:07 +02:00

52 lines
1.5 KiB
C++

/* SPDX-FileCopyrightText: 2020 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup depsgraph
*/
#pragma once
namespace blender::deg {
struct Node;
/* Settings/Tags on Relationship.
* NOTE: Is a bitmask, allowing accumulation. */
enum RelationFlag {
/* "cyclic" link - when detecting cycles, this relationship was the one
* which triggers a cyclic relationship to exist in the graph. */
RELATION_FLAG_CYCLIC = (1 << 0),
/* Update flush will not go through this relation. */
RELATION_FLAG_NO_FLUSH = (1 << 1),
/* Only flush along the relation is update comes from a node which was
* affected by user input. */
RELATION_FLAG_FLUSH_USER_EDIT_ONLY = (1 << 2),
/* The relation can not be killed by the cyclic dependencies solver. */
RELATION_FLAG_GODMODE = (1 << 4),
/* Relation will check existence before being added. */
RELATION_CHECK_BEFORE_ADD = (1 << 5),
/* The relation does not participate in visibility checks. */
RELATION_NO_VISIBILITY_CHANGE = (1 << 6),
};
/* B depends on A (A -> B) */
struct Relation {
Relation(Node *from, Node *to, const char *description) : from(from), to(to), name(description)
{
}
void unlink();
/* the nodes in the relationship (since this is shared between the nodes) */
Node *from; /* A */
Node *to; /* B */
/* relationship attributes */
const char *name; /* label for debugging */
int flag = 0; /* Bitmask of RelationFlag) */
};
} // namespace blender::deg