mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-30 13:28:47 +00:00
增加SampleDist采样距离的配置,对过密的曲线开启采样,优化绘制效率
This commit is contained in:
30510
Demo/demo_xchart.unity
30510
Demo/demo_xchart.unity
File diff suppressed because it is too large
Load Diff
@@ -26,6 +26,7 @@ namespace XCharts
|
|||||||
protected SerializedProperty m_MaxShowDataNumber;
|
protected SerializedProperty m_MaxShowDataNumber;
|
||||||
protected SerializedProperty m_MaxCacheDataNumber;
|
protected SerializedProperty m_MaxCacheDataNumber;
|
||||||
protected SerializedProperty m_LineSmoothStyle;
|
protected SerializedProperty m_LineSmoothStyle;
|
||||||
|
protected SerializedProperty m_SampleDist;
|
||||||
|
|
||||||
protected float m_DefaultLabelWidth;
|
protected float m_DefaultLabelWidth;
|
||||||
protected float m_DefaultFieldWidth;
|
protected float m_DefaultFieldWidth;
|
||||||
@@ -50,6 +51,7 @@ namespace XCharts
|
|||||||
m_MaxShowDataNumber = serializedObject.FindProperty("m_MaxShowDataNumber");
|
m_MaxShowDataNumber = serializedObject.FindProperty("m_MaxShowDataNumber");
|
||||||
m_MaxCacheDataNumber = serializedObject.FindProperty("m_MaxCacheDataNumber");
|
m_MaxCacheDataNumber = serializedObject.FindProperty("m_MaxCacheDataNumber");
|
||||||
m_LineSmoothStyle = serializedObject.FindProperty("m_LineSmoothStyle");
|
m_LineSmoothStyle = serializedObject.FindProperty("m_LineSmoothStyle");
|
||||||
|
m_SampleDist = serializedObject.FindProperty("m_SampleDist");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnInspectorGUI()
|
public override void OnInspectorGUI()
|
||||||
@@ -96,9 +98,11 @@ namespace XCharts
|
|||||||
EditorGUILayout.PropertyField(m_MaxShowDataNumber, true);
|
EditorGUILayout.PropertyField(m_MaxShowDataNumber, true);
|
||||||
EditorGUILayout.PropertyField(m_MaxCacheDataNumber, true);
|
EditorGUILayout.PropertyField(m_MaxCacheDataNumber, true);
|
||||||
EditorGUILayout.PropertyField(m_LineSmoothStyle,true);
|
EditorGUILayout.PropertyField(m_LineSmoothStyle,true);
|
||||||
|
EditorGUILayout.PropertyField(m_SampleDist,true);
|
||||||
if (m_MinShowDataNumber.intValue < 0) m_MinShowDataNumber.intValue = 0;
|
if (m_MinShowDataNumber.intValue < 0) m_MinShowDataNumber.intValue = 0;
|
||||||
if (m_MaxShowDataNumber.intValue < 0) m_MaxShowDataNumber.intValue = 0;
|
if (m_MaxShowDataNumber.intValue < 0) m_MaxShowDataNumber.intValue = 0;
|
||||||
if (m_MaxCacheDataNumber.intValue < 0) m_MaxCacheDataNumber.intValue = 0;
|
if (m_MaxCacheDataNumber.intValue < 0) m_MaxCacheDataNumber.intValue = 0;
|
||||||
|
if (m_SampleDist.floatValue < 0) m_SampleDist.floatValue = 0;
|
||||||
EditorGUI.indentLevel--;
|
EditorGUI.indentLevel--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ namespace XCharts
|
|||||||
[SerializeField] protected int m_MaxShowDataNumber;
|
[SerializeField] protected int m_MaxShowDataNumber;
|
||||||
[SerializeField] protected int m_MaxCacheDataNumber;
|
[SerializeField] protected int m_MaxCacheDataNumber;
|
||||||
[SerializeField] [Range(1, 8)] private float m_LineSmoothStyle = 2f;
|
[SerializeField] [Range(1, 8)] private float m_LineSmoothStyle = 2f;
|
||||||
|
[SerializeField] protected float m_SampleDist;
|
||||||
|
|
||||||
[NonSerialized] private Theme m_CheckTheme = 0;
|
[NonSerialized] private Theme m_CheckTheme = 0;
|
||||||
[NonSerialized] private Title m_CheckTitle = Title.defaultTitle;
|
[NonSerialized] private Title m_CheckTitle = Title.defaultTitle;
|
||||||
|
|||||||
@@ -80,6 +80,13 @@ namespace XCharts
|
|||||||
/// <value></value>
|
/// <value></value>
|
||||||
public float lineSmoothStyle { get { return m_LineSmoothStyle; } set { m_LineSmoothStyle = value; } }
|
public float lineSmoothStyle { get { return m_LineSmoothStyle; } set { m_LineSmoothStyle = value; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// the min pixel dist of sample.
|
||||||
|
/// 采样的最小像素距离,默认为0时不采样。当两个数据点间的像素距离小于改值时,开启采样,保证两点间的像素距离不小于改值。
|
||||||
|
/// </summary>
|
||||||
|
/// <value></value>
|
||||||
|
public float sampleDist { get { return m_SampleDist; } set { m_SampleDist = value < 0 ? 0 : value; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set the size of chart.
|
/// Set the size of chart.
|
||||||
/// 设置图表的大小。
|
/// 设置图表的大小。
|
||||||
|
|||||||
@@ -163,24 +163,34 @@ namespace XCharts
|
|||||||
int maxCount = maxShowDataNumber > 0 ?
|
int maxCount = maxShowDataNumber > 0 ?
|
||||||
(maxShowDataNumber > showData.Count ? showData.Count : maxShowDataNumber)
|
(maxShowDataNumber > showData.Count ? showData.Count : maxShowDataNumber)
|
||||||
: showData.Count;
|
: showData.Count;
|
||||||
|
int i;
|
||||||
if (seriesHig.Count < minShowDataNumber)
|
if (seriesHig.Count < minShowDataNumber)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < minShowDataNumber; i++)
|
for (i = 0; i < minShowDataNumber; i++)
|
||||||
{
|
{
|
||||||
seriesHig.Add(0);
|
seriesHig.Add(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int rate = 1;
|
||||||
for (int i = minShowDataNumber; i < maxCount; i++)
|
if (m_SampleDist > 0) rate = (int)((maxCount - minShowDataNumber) / (coordinateWid / m_SampleDist));
|
||||||
|
if (rate < 1) rate = 1;
|
||||||
|
for (i = minShowDataNumber; i < maxCount; i += rate)
|
||||||
{
|
{
|
||||||
if (i >= seriesHig.Count)
|
if (i >= seriesHig.Count)
|
||||||
{
|
{
|
||||||
seriesHig.Add(0);
|
for (int j = 0; j < rate; j++) seriesHig.Add(0);
|
||||||
}
|
}
|
||||||
float yValue = showData[i].data[1];
|
float yValue = showData[i].data[1];
|
||||||
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np);
|
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np);
|
||||||
serie.dataPoints.Add(np);
|
serie.dataPoints.Add(np);
|
||||||
lp = np;
|
}
|
||||||
|
if (maxCount % rate != 0)
|
||||||
|
{
|
||||||
|
i = maxCount - 1;
|
||||||
|
seriesHig.Add(0);
|
||||||
|
float yValue = showData[i].data[1];
|
||||||
|
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np);
|
||||||
|
serie.dataPoints.Add(np);
|
||||||
}
|
}
|
||||||
if (serie.dataPoints.Count <= 0)
|
if (serie.dataPoints.Count <= 0)
|
||||||
{
|
{
|
||||||
@@ -191,7 +201,7 @@ namespace XCharts
|
|||||||
float currDetailProgress = lp.x;
|
float currDetailProgress = lp.x;
|
||||||
float totalDetailProgress = serie.dataPoints[dataCount - 1].x;
|
float totalDetailProgress = serie.dataPoints[dataCount - 1].x;
|
||||||
serie.animation.InitProgress(dataCount, currDetailProgress, totalDetailProgress);
|
serie.animation.InitProgress(dataCount, currDetailProgress, totalDetailProgress);
|
||||||
for (int i = 1; i < serie.dataPoints.Count; i++)
|
for (i = 1; i < serie.dataPoints.Count; i++)
|
||||||
{
|
{
|
||||||
np = serie.dataPoints[i];
|
np = serie.dataPoints[i];
|
||||||
serie.ClearSmoothList(i);
|
serie.ClearSmoothList(i);
|
||||||
@@ -237,7 +247,7 @@ namespace XCharts
|
|||||||
if (!serie.animation.IsFinish())
|
if (!serie.animation.IsFinish())
|
||||||
{
|
{
|
||||||
float duration = serie.animation.duration > 0 ? (float)serie.animation.duration / 1000 : 1;
|
float duration = serie.animation.duration > 0 ? (float)serie.animation.duration / 1000 : 1;
|
||||||
float speed = totalDetailProgress / duration;
|
float speed = totalDetailProgress / duration;
|
||||||
float symbolSpeed = serie.symbol.size / duration;
|
float symbolSpeed = serie.symbol.size / duration;
|
||||||
serie.animation.CheckProgress(Time.deltaTime * speed);
|
serie.animation.CheckProgress(Time.deltaTime * speed);
|
||||||
serie.animation.CheckSymbol(Time.deltaTime * symbolSpeed, serie.symbol.size);
|
serie.animation.CheckSymbol(Time.deltaTime * symbolSpeed, serie.symbol.size);
|
||||||
@@ -331,19 +341,24 @@ namespace XCharts
|
|||||||
int maxCount = maxShowDataNumber > 0 ?
|
int maxCount = maxShowDataNumber > 0 ?
|
||||||
(maxShowDataNumber > showData.Count ? showData.Count : maxShowDataNumber)
|
(maxShowDataNumber > showData.Count ? showData.Count : maxShowDataNumber)
|
||||||
: showData.Count;
|
: showData.Count;
|
||||||
|
int i = 0;
|
||||||
if (seriesHig.Count < minShowDataNumber)
|
if (seriesHig.Count < minShowDataNumber)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < minShowDataNumber; i++)
|
for (i = 0; i < minShowDataNumber; i++)
|
||||||
{
|
{
|
||||||
seriesHig.Add(0);
|
seriesHig.Add(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var fine = isStack && m_Series.IsAnyGradientSerie(serie.stack);
|
var fine = isStack && m_Series.IsAnyGradientSerie(serie.stack);
|
||||||
for (int i = minShowDataNumber; i < maxCount; i++)
|
|
||||||
|
int rate = 1;
|
||||||
|
if (m_SampleDist > 0) rate = (int)((maxCount - minShowDataNumber) / (coordinateWid / m_SampleDist));
|
||||||
|
if (rate < 1) rate = 1;
|
||||||
|
for (i = minShowDataNumber; i < maxCount; i += rate)
|
||||||
{
|
{
|
||||||
if (i >= seriesHig.Count)
|
if (i >= seriesHig.Count)
|
||||||
{
|
{
|
||||||
seriesHig.Add(0);
|
for (int j = 0; j < rate; j++) seriesHig.Add(0);
|
||||||
}
|
}
|
||||||
float value = showData[i].data[1];
|
float value = showData[i].data[1];
|
||||||
float pY = startY + i * scaleWid;
|
float pY = startY + i * scaleWid;
|
||||||
@@ -352,15 +367,25 @@ namespace XCharts
|
|||||||
np = new Vector3(pX + dataHig, pY);
|
np = new Vector3(pX + dataHig, pY);
|
||||||
serie.dataPoints.Add(np);
|
serie.dataPoints.Add(np);
|
||||||
seriesHig[i] += dataHig;
|
seriesHig[i] += dataHig;
|
||||||
lp = np;
|
|
||||||
}
|
}
|
||||||
|
if (maxCount % rate != 0)
|
||||||
|
{
|
||||||
|
i = maxCount - 1;
|
||||||
|
seriesHig.Add(0);
|
||||||
|
float value = showData[i].data[1];
|
||||||
|
float pY = startY + i * scaleWid;
|
||||||
|
float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width;
|
||||||
|
float dataHig = (value - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWid;
|
||||||
|
np = new Vector3(pX + dataHig, pY);
|
||||||
|
serie.dataPoints.Add(np);
|
||||||
|
seriesHig[i] += dataHig;
|
||||||
|
}
|
||||||
lp = serie.dataPoints[0];
|
lp = serie.dataPoints[0];
|
||||||
int dataCount = serie.dataPoints.Count;
|
int dataCount = serie.dataPoints.Count;
|
||||||
float currDetailProgress = lp.y;
|
float currDetailProgress = lp.y;
|
||||||
float totalDetailProgress = serie.dataPoints[dataCount - 1].y;
|
float totalDetailProgress = serie.dataPoints[dataCount - 1].y;
|
||||||
serie.animation.InitProgress(dataCount, currDetailProgress, totalDetailProgress);
|
serie.animation.InitProgress(dataCount, currDetailProgress, totalDetailProgress);
|
||||||
for (int i = 1; i < serie.dataPoints.Count; i++)
|
for (i = 1; i < serie.dataPoints.Count; i++)
|
||||||
{
|
{
|
||||||
np = serie.dataPoints[i];
|
np = serie.dataPoints[i];
|
||||||
serie.ClearSmoothList(i);
|
serie.ClearSmoothList(i);
|
||||||
|
|||||||
Reference in New Issue
Block a user