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
52 lines
1.5 KiB
C++
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
|