From 7eaebc4e7c44988436e476db704ecacd30564eed Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Jun 2024 09:30:42 +0200 Subject: [PATCH] Fix crash when freeing agent with performance monitoring enabled --- bt/bt_player.cpp | 42 +++++++++++++++++++++++++++--------------- bt/bt_player.h | 4 ++++ 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/bt/bt_player.cpp b/bt/bt_player.cpp index 5a5ea0e..838baf7 100644 --- a/bt/bt_player.cpp +++ b/bt/bt_player.cpp @@ -153,21 +153,31 @@ void BTPlayer::restart() { void BTPlayer::_set_monitor_performance(bool p_monitor_performance) { monitor_performance = p_monitor_performance; - if (!get_owner()) { + if (!get_owner() && monitor_performance) { + // Don't add custom monitor if not in scene. return; } - Performance *perf = Performance::get_singleton(); if (monitor_performance) { - if (monitor_id == StringName()) { - monitor_id = vformat("limboai/update_ms|%s_%s_%s", get_owner()->get_name(), get_name(), - String(itos(get_instance_id())).md5_text().substr(0, 4)); - } - if (!perf->has_custom_monitor(monitor_id)) { - PERFORMANCE_ADD_CUSTOM_MONITOR(monitor_id, callable_mp(this, &BTPlayer::_get_mean_update_time_msec)); - } - } else if (monitor_id != StringName() && perf->has_custom_monitor(monitor_id)) { - perf->remove_custom_monitor(monitor_id); + _add_custom_monitor(); + } else { + _remove_custom_monitor(); + } +} + +void BTPlayer::_add_custom_monitor() { + if (monitor_id == StringName()) { + monitor_id = vformat("LimboAI/update_ms|%s_%s_%s", get_owner()->get_name(), get_name(), + String(itos(get_instance_id())).md5_text().substr(0, 4)); + } + if (!Performance::get_singleton()->has_custom_monitor(monitor_id)) { + PERFORMANCE_ADD_CUSTOM_MONITOR(monitor_id, callable_mp(this, &BTPlayer::_get_mean_update_time_msec)); + } +} + +void BTPlayer::_remove_custom_monitor() { + if (monitor_id != StringName() && Performance::get_singleton()->has_custom_monitor(monitor_id)) { + Performance::get_singleton()->remove_custom_monitor(monitor_id); } } @@ -205,9 +215,6 @@ void BTPlayer::_notification(int p_notification) { _load_tree(); } set_active(active); -#ifdef DEBUG_ENABLED - _set_monitor_performance(monitor_performance); -#endif } else { _update_blackboard_plan(); } @@ -217,6 +224,9 @@ void BTPlayer::_notification(int p_notification) { if (tree_instance.is_valid() && IS_DEBUGGER_ACTIVE()) { LimboDebugger::get_singleton()->register_bt_instance(tree_instance, get_path()); } + if (monitor_performance) { + _add_custom_monitor(); + } #endif // DEBUG_ENABLED } break; case NOTIFICATION_EXIT_TREE: { @@ -224,6 +234,9 @@ void BTPlayer::_notification(int p_notification) { if (tree_instance.is_valid() && IS_DEBUGGER_ACTIVE()) { LimboDebugger::get_singleton()->unregister_bt_instance(tree_instance, get_path()); } + if (monitor_performance) { + _remove_custom_monitor(); + } #endif // DEBUG_ENABLED if (Engine::get_singleton()->is_editor_hint()) { @@ -231,7 +244,6 @@ void BTPlayer::_notification(int p_notification) { behavior_tree->disconnect(LW_NAME(plan_changed), callable_mp(this, &BTPlayer::_update_blackboard_plan)); } } - } break; } } diff --git a/bt/bt_player.h b/bt/bt_player.h index 026185d..9ff705c 100644 --- a/bt/bt_player.h +++ b/bt/bt_player.h @@ -92,6 +92,10 @@ private: void _set_monitor_performance(bool p_monitor_performance); bool _get_monitor_performance() const { return monitor_performance; } + + void _add_custom_monitor(); + void _remove_custom_monitor(); + double _get_mean_update_time_msec(); #endif // DEBUG_ENABLED