From cc7e93e2ee40dbf929b88ebe51c12d8e3917b1a6 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 25 Aug 2023 10:22:33 +0200 Subject: [PATCH] Don't recheck decorators conditions if the node is already relevant --- Source/Engine/AI/BehaviorTreeNodes.cpp | 29 ++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Source/Engine/AI/BehaviorTreeNodes.cpp b/Source/Engine/AI/BehaviorTreeNodes.cpp index a134697fe..05b631530 100644 --- a/Source/Engine/AI/BehaviorTreeNodes.cpp +++ b/Source/Engine/AI/BehaviorTreeNodes.cpp @@ -44,21 +44,24 @@ BehaviorUpdateResult BehaviorTreeNode::InvokeUpdate(const BehaviorUpdateContext& ASSERT_LOW_LAYER(_executionIndex != -1); const BitArray<>& relevantNodes = *(const BitArray<>*)context.RelevantNodes; - // Check decorators if node can be executed - for (BehaviorTreeDecorator* decorator : _decorators) - { - ASSERT_LOW_LAYER(decorator->_executionIndex != -1); - if (relevantNodes.Get(decorator->_executionIndex) == false) - decorator->BecomeRelevant(context); - if (!decorator->CanUpdate(context)) - { - return BehaviorUpdateResult::Failed; - } - } - - // Make node relevant before update + // If node is not yet relevant if (relevantNodes.Get(_executionIndex) == false) + { + // Check decorators if node can be executed + for (BehaviorTreeDecorator* decorator : _decorators) + { + ASSERT_LOW_LAYER(decorator->_executionIndex != -1); + if (relevantNodes.Get(decorator->_executionIndex) == false) + decorator->BecomeRelevant(context); + if (!decorator->CanUpdate(context)) + { + return BehaviorUpdateResult::Failed; + } + } + + // Make node relevant BecomeRelevant(context); + } // Update decorators bool decoratorFailed = false;