增加SampleDist采样距离的配置,对过密的曲线开启采样,优化绘制效率

This commit is contained in:
monitor1394
2019-09-27 18:58:42 +08:00
parent 2d5d5b89bc
commit 7b8fef6d81
5 changed files with 15326 additions and 15247 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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--;
} }
} }

View File

@@ -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;

View File

@@ -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.
/// 设置图表的大小。 /// 设置图表的大小。

View File

@@ -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);
@@ -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);