From f5a41b511932efe824fe2b3a87b9d2de8b5f6b88 Mon Sep 17 00:00:00 2001 From: Stefan Bursuc Date: Mon, 8 Apr 2024 11:07:27 +0200 Subject: [PATCH] Fix for GC Allocations inside TooltipHandler In the case where the pointer is not in the chart, both calls to ListPool.Get() from inside the function UpdateTooltipData are executed. And because the pointer is not in the chart, m_ShowTooltip is set to false in the last else clause. This makes UpdateTooltip to skip all logic and miss the chance to release the list back to the pool. --- Runtime/Component/Tooltip/TooltipHandler.cs | 40 +++++++++++---------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index aeb21bea..5aea9015 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -107,7 +107,11 @@ namespace XCharts.Runtime m_ShowTooltip = false; if (tooltip.trigger == Tooltip.Trigger.None) return; chart.isTriggerOnClick = tooltip.triggerOn == Tooltip.TriggerOn.Click; - if (!chart.isPointerInChart || !tooltip.show || (chart.isTriggerOnClick && !chart.isPointerClick)) + + if ((tooltip.show && chart.isPointerInChart) && + ((tooltip.triggerOn == Tooltip.TriggerOn.Click && chart.isPointerClick) || + (tooltip.triggerOn == Tooltip.TriggerOn.MouseMove)) + ) { for (int i = chart.series.Count - 1; i >= 0; i--) { @@ -124,26 +128,16 @@ namespace XCharts.Runtime if (m_ContainerSeries.Count > 0) { m_ShowTooltip = true; - m_ContainerSeries = null; return; } } - m_ContainerSeries = ListPool.Get(); - UpdatePointerContainerAndSeriesAndTooltip(tooltip, ref m_ContainerSeries); - if (m_ContainerSeries.Count > 0) + + if (!m_ShowTooltip && tooltip.IsActive()) { - m_ShowTooltip = true; - } - else - { - m_ShowTooltip = false; - if (tooltip.IsActive()) - { - tooltip.ClearValue(); - tooltip.SetActive(false); - component.context.xAxisClickIndex = -1; - chart.pointerClickEventData = null; - } + tooltip.ClearValue(); + tooltip.SetActive(false); + component.context.xAxisClickIndex = -1; + chart.pointerClickEventData = null; } } @@ -151,7 +145,16 @@ namespace XCharts.Runtime private List m_ContainerSeries; private void UpdateTooltip(Tooltip tooltip) { - if (!m_ShowTooltip) return; + if (!m_ShowTooltip) + { + if (m_ContainerSeries != null) + { + ListPool.Release(m_ContainerSeries); + m_ContainerSeries = null; + } + return; + } + var anyTrigger = false; for (int i = chart.series.Count - 1; i >= 0; i--) { @@ -173,6 +176,7 @@ namespace XCharts.Runtime else anyTrigger = true; ListPool.Release(m_ContainerSeries); + m_ContainerSeries = null; } if (!m_ShowTooltip || !anyTrigger) {