From 5356865c40bb5968f7e67d0ca9ed7e5c3e7ba8bf Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sat, 9 May 2020 09:42:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/API/BaseChart_API.cs | 4 +- Runtime/Component/Main/Axis.cs | 4 +- Runtime/Component/Main/Serie.cs | 56 ++++++++++++------------- Runtime/Component/Sub/SerieAnimation.cs | 2 +- Runtime/Component/Sub/SerieData.cs | 11 +++++ Runtime/Internal/CoordinateChart.cs | 28 ++++++------- Runtime/Internal/SerieDataPool.cs | 33 +++++++++++++++ Runtime/Internal/SerieDataPool.cs.meta | 11 +++++ Runtime/Utility/ChartCached.cs | 54 ++++++++++++++++++++---- Runtime/Utility/ChartDrawer.cs | 12 +++--- 10 files changed, 154 insertions(+), 61 deletions(-) create mode 100644 Runtime/Internal/SerieDataPool.cs create mode 100644 Runtime/Internal/SerieDataPool.cs.meta diff --git a/Runtime/API/BaseChart_API.cs b/Runtime/API/BaseChart_API.cs index 67699b78..81f0e043 100644 --- a/Runtime/API/BaseChart_API.cs +++ b/Runtime/API/BaseChart_API.cs @@ -626,8 +626,8 @@ namespace XCharts /// public bool IsInChart(Vector2 local) { - if (local.x < m_ChartX || local.x > m_ChartX + chartWidth || - local.y < m_ChartY || local.y > m_ChartY + chartHeight) + if (local.x < m_ChartX || local.x > m_ChartX + m_ChartWidth || + local.y < m_ChartY || local.y > m_ChartY + m_ChartHeight) { return false; } diff --git a/Runtime/Component/Main/Axis.cs b/Runtime/Component/Main/Axis.cs index 44fc1b51..7fcc3061 100644 --- a/Runtime/Component/Main/Axis.cs +++ b/Runtime/Component/Main/Axis.cs @@ -747,7 +747,7 @@ namespace XCharts m_TooltipLabel = label; m_TooltipLabelRect = label.GetComponent(); m_TooltipLabelText = label.GetComponentInChildren(); - m_TooltipLabel.SetActive(true); + ChartHelper.SetActive(m_TooltipLabel, true); } internal void SetTooltipLabelColor(Color bgColor, Color textColor) @@ -760,7 +760,7 @@ namespace XCharts { if (m_TooltipLabel && m_TooltipLabel.activeInHierarchy != flag) { - m_TooltipLabel.SetActive(flag); + ChartHelper.SetActive(m_TooltipLabel, flag); } } diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index 785a42f4..a9943079 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -1016,6 +1016,10 @@ namespace XCharts /// public void ClearData() { + foreach (var serieData in m_Data) + { + SerieDataPool.Release(serieData); + } m_Data.Clear(); SetVerticesDirty(); } @@ -1049,15 +1053,15 @@ namespace XCharts while (m_Data.Count > m_MaxCache) { m_NeedUpdateFilterData = true; + SerieDataPool.Release(m_Data[0]); m_Data.RemoveAt(0); } } int xValue = m_Data.Count; - var serieData = new SerieData() - { - data = new List() { xValue, value }, - name = dataName - }; + var serieData = SerieDataPool.Get(); + serieData.data.Add(xValue); + serieData.data.Add(value); + serieData.name = dataName; serieData.index = xValue; m_Data.Add(serieData); m_ShowDataDimension = 1; @@ -1087,19 +1091,11 @@ namespace XCharts /// public SerieData AddXYData(float xValue, float yValue, string dataName = null) { - if (m_MaxCache > 0) - { - while (m_Data.Count > m_MaxCache) - { - m_NeedUpdateFilterData = true; - m_Data.RemoveAt(0); - } - } - var serieData = new SerieData() - { - data = new List() { xValue, yValue }, - name = dataName - }; + CheckMaxCache(); + var serieData = SerieDataPool.Get(); + serieData.data.Add(xValue); + serieData.data.Add(yValue); + serieData.name = dataName; serieData.index = m_Data.Count; m_Data.Add(serieData); m_ShowDataDimension = 2; @@ -1128,16 +1124,9 @@ namespace XCharts } else { - if (m_MaxCache > 0) - { - while (m_Data.Count > m_MaxCache) - { - m_NeedUpdateFilterData = true; - m_Data.RemoveAt(0); - } - } + CheckMaxCache(); m_ShowDataDimension = valueList.Count; - var serieData = new SerieData(); + var serieData = SerieDataPool.Get(); serieData.name = dataName; serieData.index = m_Data.Count; for (int i = 0; i < valueList.Count; i++) @@ -1151,6 +1140,17 @@ namespace XCharts } } + private void CheckMaxCache() + { + if (m_MaxCache <= 0) return; + while (m_Data.Count > m_MaxCache) + { + m_NeedUpdateFilterData = true; + SerieDataPool.Release(m_Data[0]); + m_Data.RemoveAt(0); + } + } + /// /// 获得维度Y索引对应的数据 /// @@ -1572,7 +1572,7 @@ namespace XCharts return false; } - + /// /// 设置指定index的数据图标的尺寸 diff --git a/Runtime/Component/Sub/SerieAnimation.cs b/Runtime/Component/Sub/SerieAnimation.cs index a3e1ea9d..ca8ac60f 100644 --- a/Runtime/Component/Sub/SerieAnimation.cs +++ b/Runtime/Component/Sub/SerieAnimation.cs @@ -229,7 +229,7 @@ namespace XCharts #if UNITY_EDITOR if (!Application.isPlaying) return true; #endif - return !enable || m_IsEnd || (m_CurrDataProgress > m_DestDataProgress && m_CurrDetailProgress > m_DestDetailProgress); + return !m_Enable || m_IsEnd || (m_CurrDataProgress > m_DestDataProgress && m_CurrDetailProgress > m_DestDetailProgress); } public bool IsInDelay() diff --git a/Runtime/Component/Sub/SerieData.cs b/Runtime/Component/Sub/SerieData.cs index 3bd9ed77..99569a85 100644 --- a/Runtime/Component/Sub/SerieData.cs +++ b/Runtime/Component/Sub/SerieData.cs @@ -177,6 +177,17 @@ namespace XCharts private List m_DataUpdateTime = new List(); private List m_DataUpdateFlag = new List(); + public void Clear() + { + m_Name = string.Empty; + m_Selected = false; + m_Radius = 0; + m_Data.Clear(); + m_PreviousData.Clear(); + m_DataUpdateTime.Clear(); + m_DataUpdateFlag.Clear(); + } + public float GetData(int index, bool inverse = false) { if (index >= 0 && index < m_Data.Count) diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index 96e96d4a..b83c4485 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -15,9 +15,9 @@ namespace XCharts { public partial class CoordinateChart : BaseChart { - private static readonly string s_DefaultAxisY = "axis_y"; - private static readonly string s_DefaultAxisX = "axis_x"; private static readonly string s_DefaultDataZoom = "datazoom"; + private static readonly string s_DefaultAxisName = "name"; + private static readonly string s_DefaultAxisLabel = "label"; [SerializeField] protected Grid m_Grid = Grid.defaultGrid; [SerializeField] protected List m_XAxises = new List(); @@ -513,9 +513,7 @@ namespace XCharts private void InitYAxis(int yAxisIndex, YAxis yAxis) { yAxis.axisLabelTextList.Clear(); - - string objName = yAxisIndex > 0 ? s_DefaultAxisY + "2" : s_DefaultAxisY; - + string objName = ChartCached.GetYAxisName(yAxisIndex); var axisObj = ChartHelper.AddObject(objName, transform, chartAnchorMin, chartAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight)); axisObj.transform.localPosition = Vector3.zero; @@ -567,7 +565,7 @@ namespace XCharts switch (yAxis.axisName.location) { case AxisName.Location.Start: - axisName = ChartHelper.AddTextObject(objName + "_name", axisObj.transform, + axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, m_ThemeInfo.font, color, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), fontSize, yAxis.axisName.rotate, yAxis.axisName.fontStyle); @@ -576,7 +574,7 @@ namespace XCharts new Vector2(zeroPos.x + offset.x, coordinateY - offset.y); break; case AxisName.Location.Middle: - axisName = ChartHelper.AddTextObject(objName + "_name", axisObj.transform, + axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, m_ThemeInfo.font, color, TextAnchor.MiddleRight, new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(100, 20), fontSize, yAxis.axisName.rotate, yAxis.axisName.fontStyle); @@ -585,7 +583,7 @@ namespace XCharts new Vector2(coordinateX - offset.x, coordinateY + coordinateHeight / 2 + offset.y); break; case AxisName.Location.End: - axisName = ChartHelper.AddTextObject(objName + "_name", axisObj.transform, + axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, m_ThemeInfo.font, color, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), fontSize, yAxis.axisName.rotate, yAxis.axisName.fontStyle); @@ -601,7 +599,7 @@ namespace XCharts { Vector2 privot = yAxisIndex > 0 ? new Vector2(0, 0.5f) : new Vector2(1, 0.5f); var labelParent = m_Tooltip.runtimeGameObject.transform; - GameObject labelObj = ChartHelper.AddTooltipLabel(objName + "_label", labelParent, m_ThemeInfo.font, privot); + GameObject labelObj = ChartHelper.AddTooltipLabel(ChartCached.GetAxisTooltipLabel(objName), labelParent, m_ThemeInfo.font, privot); yAxis.SetTooltipLabel(labelObj); yAxis.SetTooltipLabelColor(m_ThemeInfo.tooltipBackgroundColor, m_ThemeInfo.tooltipTextColor); yAxis.SetTooltipLabelActive(yAxis.show && m_Tooltip.show && m_Tooltip.type == Tooltip.Type.Corss); @@ -620,7 +618,7 @@ namespace XCharts { xAxis.axisLabelTextList.Clear(); - string objName = xAxisIndex > 0 ? ChartHelper.Cancat(s_DefaultAxisX, 2) : s_DefaultAxisX; + string objName = ChartCached.GetXAxisName(xAxisIndex); var axisObj = ChartHelper.AddObject(objName, transform, chartAnchorMin, chartAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight)); axisObj.transform.localPosition = Vector3.zero; @@ -635,7 +633,7 @@ namespace XCharts { float labelWidth = xAxis.GetScaleWidth(coordinateWidth, i, m_DataZoom); bool inside = xAxis.axisLabel.inside; - Text txt = ChartHelper.AddTextObject(ChartHelper.Cancat(objName, i), axisObj.transform, + Text txt = ChartHelper.AddTextObject(ChartCached.GetXAxisName(xAxisIndex, i), axisObj.transform, m_ThemeInfo.font, labelColor, TextAnchor.MiddleCenter, new Vector2(0, 1), new Vector2(0, 1), new Vector2(1, 0.5f), new Vector2(labelWidth, 20), xAxis.axisLabel.fontSize, xAxis.axisLabel.rotate, xAxis.axisLabel.fontStyle); @@ -661,7 +659,7 @@ namespace XCharts switch (xAxis.axisName.location) { case AxisName.Location.Start: - axisName = ChartHelper.AddTextObject(ChartHelper.Cancat(objName, "_name"), axisObj.transform, + axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, m_ThemeInfo.font, color, TextAnchor.MiddleRight, new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(100, 20), fontSize, xAxis.axisName.rotate, xAxis.axisName.fontStyle); @@ -670,7 +668,7 @@ namespace XCharts new Vector2(zeroPos.x - offset.x, zeroPos.y + offset.y); break; case AxisName.Location.Middle: - axisName = ChartHelper.AddTextObject(ChartHelper.Cancat(objName, "_name"), axisObj.transform, + axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, m_ThemeInfo.font, color, TextAnchor.MiddleCenter, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), fontSize, xAxis.axisName.rotate, xAxis.axisName.fontStyle); @@ -679,7 +677,7 @@ namespace XCharts new Vector2(coordinateX + coordinateWidth / 2 + offset.x, coordinateY - offset.y); break; case AxisName.Location.End: - axisName = ChartHelper.AddTextObject(ChartHelper.Cancat(objName, "_name"), axisObj.transform, + axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, m_ThemeInfo.font, color, TextAnchor.MiddleLeft, new Vector2(0, 0.5f), new Vector2(0, 0.5f), new Vector2(0, 0.5f), new Vector2(100, 20), fontSize, xAxis.axisName.rotate, xAxis.axisName.fontStyle); @@ -694,7 +692,7 @@ namespace XCharts { Vector2 privot = xAxisIndex > 0 ? new Vector2(0.5f, 1) : new Vector2(0.5f, 1); var labelParent = m_Tooltip.runtimeGameObject.transform; - GameObject labelObj = ChartHelper.AddTooltipLabel(ChartHelper.Cancat(objName, "_label"), labelParent, m_ThemeInfo.font, privot); + GameObject labelObj = ChartHelper.AddTooltipLabel(ChartCached.GetAxisTooltipLabel(objName), labelParent, m_ThemeInfo.font, privot); xAxis.SetTooltipLabel(labelObj); xAxis.SetTooltipLabelColor(m_ThemeInfo.tooltipBackgroundColor, m_ThemeInfo.tooltipTextColor); xAxis.SetTooltipLabelActive(xAxis.show && m_Tooltip.show && m_Tooltip.type == Tooltip.Type.Corss); diff --git a/Runtime/Internal/SerieDataPool.cs b/Runtime/Internal/SerieDataPool.cs new file mode 100644 index 00000000..3e42922a --- /dev/null +++ b/Runtime/Internal/SerieDataPool.cs @@ -0,0 +1,33 @@ +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +namespace XCharts +{ + internal static class SerieDataPool + { + private static readonly ObjectPool s_ListPool = new ObjectPool(null, OnClear); + + static void OnGet(SerieData serieData) + { + } + + static void OnClear(SerieData serieData) + { + serieData.Clear(); + } + + public static SerieData Get() + { + return s_ListPool.Get(); + } + + public static void Release(SerieData toRelease) + { + s_ListPool.Release(toRelease); + } + } +} diff --git a/Runtime/Internal/SerieDataPool.cs.meta b/Runtime/Internal/SerieDataPool.cs.meta new file mode 100644 index 00000000..3e569777 --- /dev/null +++ b/Runtime/Internal/SerieDataPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6bd0d723595ba485dbe696491cf978f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Utility/ChartCached.cs b/Runtime/Utility/ChartCached.cs index dadb47c1..8fb2e672 100644 --- a/Runtime/Utility/ChartCached.cs +++ b/Runtime/Utility/ChartCached.cs @@ -17,11 +17,17 @@ namespace XCharts private const string NUMERIC_FORMATTER_d = "d"; private const string NUMERIC_FORMATTER_X = "X"; private const string NUMERIC_FORMATTER_x = "x"; + private static readonly string s_DefaultAxisY = "axis_y"; + private static readonly string s_DefaultAxisX = "axis_x"; private static CultureInfo ci = new CultureInfo("en-us");// "en-us", "zh-cn", "ar-iq", "de-de" private static Dictionary s_ColorToStr = new Dictionary(100); private static Dictionary s_SerieLabelName = new Dictionary(1000); private static Dictionary s_AxisLabelName = new Dictionary(1000); private static Dictionary s_ColorDotStr = new Dictionary(100); + private static Dictionary s_XAxisName = new Dictionary(); + private static Dictionary s_YAxisName = new Dictionary(); + private static Dictionary s_AxisLabel = new Dictionary(); + private static Dictionary> s_NumberToStr = new Dictionary>(); private static Dictionary> s_PrecisionToStr = new Dictionary>(); @@ -119,19 +125,51 @@ namespace XCharts } } - internal static string GetAxisLabelName(string prefix, bool isYAxis, int axisIndex, int i) + internal static string GetXAxisName(int axisIndex, int index = -1) { - int key = (isYAxis ? 2 : 1) * 1000000 + (axisIndex + 1) * 100000 + i; - if (s_AxisLabelName.ContainsKey(key)) + if (axisIndex > 0) axisIndex = 2; + if (index >= 0) { - return s_AxisLabelName[key]; + int key = (axisIndex + 1) * 10000 + index; + if (!s_XAxisName.ContainsKey(key)) + { + s_XAxisName[key] = axisIndex > 0 ? s_DefaultAxisX + axisIndex + index : s_DefaultAxisX + index; + } + return s_XAxisName[key]; } - else + else if (!s_XAxisName.ContainsKey(axisIndex)) { - string name = prefix + "_" + axisIndex + "_" + i; - s_AxisLabelName[key] = name; - return name; + s_XAxisName[axisIndex] = axisIndex > 0 ? s_DefaultAxisX + axisIndex : s_DefaultAxisX; } + return s_XAxisName[axisIndex]; + } + + internal static string GetYAxisName(int axisIndex, int index = -1) + { + if (axisIndex > 0) axisIndex = 2; + if (index >= 0) + { + int key = (axisIndex + 1) * 10000 + index; + if (!s_YAxisName.ContainsKey(key)) + { + s_YAxisName[key] = axisIndex > 0 ? s_DefaultAxisY + axisIndex + index : s_DefaultAxisY + index; + } + return s_YAxisName[key]; + } + else if (!s_YAxisName.ContainsKey(axisIndex)) + { + s_YAxisName[axisIndex] = axisIndex > 0 ? s_DefaultAxisY + axisIndex : s_DefaultAxisY; + } + return s_YAxisName[axisIndex]; + } + + internal static string GetAxisTooltipLabel(string axisName) + { + if (!s_AxisLabel.ContainsKey(axisName)) + { + s_AxisLabel[axisName] = axisName + "_label"; + } + return s_AxisLabel[axisName]; } } } \ No newline at end of file diff --git a/Runtime/Utility/ChartDrawer.cs b/Runtime/Utility/ChartDrawer.cs index 46f35522..602c2032 100644 --- a/Runtime/Utility/ChartDrawer.cs +++ b/Runtime/Utility/ChartDrawer.cs @@ -15,6 +15,8 @@ namespace XCharts { public static class ChartDrawer { + private static readonly Vector2 zeroVector2 = Vector2.zero; + private static readonly Vector3 zeroVector3 = Vector3.zero; private static UIVertex[] vertex = new UIVertex[4]; private static List s_CurvesPosList = new List(); @@ -44,7 +46,7 @@ namespace XCharts for (int j = 0; j < 4; j++) { vertex[j].color = color; - vertex[j].uv0 = Vector2.zero; + vertex[j].uv0 = zeroVector2; } vh.AddUIVertexQuad(vertex); } @@ -256,7 +258,7 @@ namespace XCharts for (int j = 0; j < 4; j++) { vertex[j].color = j >= 2 ? toColor : startColor; - vertex[j].uv0 = Vector2.zero; + vertex[j].uv0 = zeroVector2; } vh.AddUIVertexQuad(vertex); } @@ -519,15 +521,15 @@ namespace XCharts UIVertex v1 = new UIVertex(); v1.position = p1; v1.color = color; - v1.uv0 = Vector3.zero; + v1.uv0 = zeroVector2; UIVertex v2 = new UIVertex(); v2.position = p2; v2.color = color2; - v2.uv0 = Vector3.zero; + v2.uv0 = zeroVector2; UIVertex v3 = new UIVertex(); v3.position = p3; v3.color = color3; - v3.uv0 = Vector3.zero; + v3.uv0 = zeroVector2; int startIndex = vh.currentVertCount; vh.AddVert(v1); vh.AddVert(v2);