优化图表性能

This commit is contained in:
monitor1394
2026-05-20 22:13:04 +08:00
parent 10d67cff41
commit 2ee94acd30
12 changed files with 780 additions and 154 deletions

View File

@@ -67,6 +67,7 @@ namespace XCharts.Runtime
m_LastCheckContextFlag = needCheck;
var themeSymbolSize = chart.theme.serie.lineSymbolSize;
lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
var symbolVisible = serie.symbol != null && serie.symbol.show && serie.symbol.type != SymbolType.None;
var needInteract = false;
if (m_LegendEnter)
@@ -76,9 +77,12 @@ namespace XCharts.Runtime
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize, SerieState.Emphasis);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, size);
if (symbolVisible)
{
var size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize, SerieState.Emphasis);
serieData.interact.SetValue(ref needInteract, size);
}
}
}
else if (serie.context.isTriggerByAxis)
@@ -90,13 +94,17 @@ namespace XCharts.Runtime
var serieData = serie.data[i];
var highlight = i == serie.context.pointerItemDataIndex;
serieData.context.highlight = highlight;
var state = SerieHelper.GetSerieState(serie, serieData, true);
var size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
if (symbolVisible)
{
var state = SerieHelper.GetSerieState(serie, serieData, true);
var size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
}
if (highlight)
{
serie.context.pointerEnter = true;
serie.context.pointerItemDataIndex = i;
needInteract = true;
}
}
}
@@ -108,13 +116,21 @@ namespace XCharts.Runtime
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var dist = Vector3.Distance(chart.pointerPos, serieData.context.position);
var size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize);
var highlight = dist <= size;
var pointerOffset = (Vector2)chart.pointerPos - (Vector2)serieData.context.position;
bool highlight;
if (symbolVisible)
{
var size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize);
highlight = pointerOffset.sqrMagnitude <= size * size;
var state = SerieHelper.GetSerieState(serie, serieData, true);
size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
}
else
{
highlight = pointerOffset.sqrMagnitude <= themeSymbolSize * themeSymbolSize;
}
serieData.context.highlight = highlight;
var state = SerieHelper.GetSerieState(serie, serieData, true);
size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize, state);
serieData.interact.SetValue(ref needInteract, size);
if (highlight)
{
serie.context.pointerEnter = true;
@@ -177,6 +193,18 @@ namespace XCharts.Runtime
var dataChangeDuration = serie.animation.GetChangeDuration();
var dataAddDuration = serie.animation.GetAdditionDuration();
var unscaledTime = serie.animation.unscaledTime;
var useCurrentData = false;
List<double> sampleSumPrefix = null;
if (serie.animation.enable)
{
useCurrentData = DataHelper.IsAnyDataChanged(ref showData, serie.minShow, maxCount);
dataChanging = useCurrentData;
}
if (!useCurrentData && rate > 1 &&
(serie.sampleType == SampleType.Sum || serie.sampleType == SampleType.Average))
{
sampleSumPrefix = DataHelper.BuildSampleSumPrefix(ref showData, maxCount, relativedAxis.inverse);
}
var interacting = false;
var lineWidth = LineHelper.GetLineWidth(ref interacting, serie, chart.theme.serie.lineWidth);
@@ -204,7 +232,8 @@ namespace XCharts.Runtime
var np = Vector3.zero;
var xValue = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse);
var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow,
maxCount, totalAverage, i, dataAddDuration, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime);
maxCount, totalAverage, i, dataAddDuration, dataChangeDuration, ref dataChanging, relativedAxis,
unscaledTime, useCurrentData, false, sampleSumPrefix);
serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, m_SerieGrid, xValue, relativedValue,
i, scaleWid, scaleRelativedWid, false, ref np);