mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-18 22:40:10 +00:00
增加SampleDist采样距离的配置,对过密的曲线开启采样,优化绘制效率
This commit is contained in:
@@ -43,6 +43,7 @@ namespace XCharts
|
||||
[SerializeField] protected int m_MaxShowDataNumber;
|
||||
[SerializeField] protected int m_MaxCacheDataNumber;
|
||||
[SerializeField] [Range(1, 8)] private float m_LineSmoothStyle = 2f;
|
||||
[SerializeField] protected float m_SampleDist;
|
||||
|
||||
[NonSerialized] private Theme m_CheckTheme = 0;
|
||||
[NonSerialized] private Title m_CheckTitle = Title.defaultTitle;
|
||||
|
||||
@@ -80,6 +80,13 @@ namespace XCharts
|
||||
/// <value></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>
|
||||
/// Set the size of chart.
|
||||
/// 设置图表的大小。
|
||||
|
||||
@@ -163,24 +163,34 @@ namespace XCharts
|
||||
int maxCount = maxShowDataNumber > 0 ?
|
||||
(maxShowDataNumber > showData.Count ? showData.Count : maxShowDataNumber)
|
||||
: showData.Count;
|
||||
int i;
|
||||
if (seriesHig.Count < minShowDataNumber)
|
||||
{
|
||||
for (int i = 0; i < minShowDataNumber; i++)
|
||||
for (i = 0; i < minShowDataNumber; i++)
|
||||
{
|
||||
seriesHig.Add(0);
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
seriesHig.Add(0);
|
||||
for (int j = 0; j < rate; j++) 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);
|
||||
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)
|
||||
{
|
||||
@@ -191,7 +201,7 @@ namespace XCharts
|
||||
float currDetailProgress = lp.x;
|
||||
float totalDetailProgress = serie.dataPoints[dataCount - 1].x;
|
||||
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];
|
||||
serie.ClearSmoothList(i);
|
||||
@@ -237,7 +247,7 @@ namespace XCharts
|
||||
if (!serie.animation.IsFinish())
|
||||
{
|
||||
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;
|
||||
serie.animation.CheckProgress(Time.deltaTime * speed);
|
||||
serie.animation.CheckSymbol(Time.deltaTime * symbolSpeed, serie.symbol.size);
|
||||
@@ -331,19 +341,24 @@ namespace XCharts
|
||||
int maxCount = maxShowDataNumber > 0 ?
|
||||
(maxShowDataNumber > showData.Count ? showData.Count : maxShowDataNumber)
|
||||
: showData.Count;
|
||||
int i = 0;
|
||||
if (seriesHig.Count < minShowDataNumber)
|
||||
{
|
||||
for (int i = 0; i < minShowDataNumber; i++)
|
||||
for (i = 0; i < minShowDataNumber; i++)
|
||||
{
|
||||
seriesHig.Add(0);
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
seriesHig.Add(0);
|
||||
for (int j = 0; j < rate; j++) seriesHig.Add(0);
|
||||
}
|
||||
float value = showData[i].data[1];
|
||||
float pY = startY + i * scaleWid;
|
||||
@@ -352,15 +367,25 @@ namespace XCharts
|
||||
np = new Vector3(pX + dataHig, pY);
|
||||
serie.dataPoints.Add(np);
|
||||
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];
|
||||
int dataCount = serie.dataPoints.Count;
|
||||
float currDetailProgress = lp.y;
|
||||
float totalDetailProgress = serie.dataPoints[dataCount - 1].y;
|
||||
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];
|
||||
serie.ClearSmoothList(i);
|
||||
|
||||
Reference in New Issue
Block a user