C# mschart-大型数据集的交互/光标性能较差
我正在使用mschart显示10行数据,每行最多显示60000个数据点。每行都有一个C# mschart-大型数据集的交互/光标性能较差,c#,.net,data-visualization,mschart,C#,.net,Data Visualization,Mschart,我正在使用mschart显示10行数据,每行最多显示60000个数据点。每行都有一个图表区和一个单独的系列,设置为typeFastLine 初始性能非常好,几乎可以立即加载图表。当需要任何类型的交互时,问题就开始了。在我的情况下,这意味着CursorX位置/选择已更改。GUI线程的使用率约为100%(整个内核),直到光标停止移动。在此期间,图形会偶尔更新。没有调用其他代码或函数 在分析应用程序以查看所有CPU时间的使用位置之后,每次移动光标时,似乎都必须重新绘制整个图表。所有10*60000点数
图表区
和一个单独的系列
,设置为typeFastLine
初始性能非常好,几乎可以立即加载图表。当需要任何类型的交互时,问题就开始了。在我的情况下,这意味着CursorX
位置/选择已更改。GUI线程的使用率约为100%(整个内核),直到光标停止移动。在此期间,图形会偶尔更新。没有调用其他代码或函数
在分析应用程序以查看所有CPU时间的使用位置之后,每次移动光标时,似乎都必须重新绘制整个图表。所有10*60000点数据。虽然这是合理的,只需要绘制几千个数据点,但它的伸缩性并不好。更改光标间隔值似乎没有任何区别
我是否可以进行任何更改来修复/避免此性能问题?如果没有,您可以推荐其他图表库吗
//编辑//
根据要求,这里有一些测试代码,显示了与前面提到的相同的问题。所需的只是一个名为chart1
的图表。将CursorX.IsUserEnabled
和CursorX.IsUserSelectionEnabled
设置为true
允许进行(有问题的)交互:
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//Set up chart and add values
ChartArea ca = chart1.ChartAreas.Add("Data");
ca.AxisX.IsMarginVisible = false;
ca.CursorX.Interval = 0.001;
ca.CursorX.IsUserEnabled = true;
ca.CursorX.IsUserSelectionEnabled = true;
ca.AxisX.ScaleView.Zoomable = false;
for (int i = 0; i < 10; i++)
{
Series s = new Series("Series_" + i.ToString());
s.ChartArea = ca.Name;
s.ChartType = SeriesChartType.FastLine;
for (int p = 0; p < _maxPoints; p++)
{
double x = p / 100.0; //(10ms steps)
double y = p * (1 + i);
s.Points.AddXY(x, y);
}
chart1.Series.Add(s);
}
}
public MainForm()
{
//
//Windows窗体设计器支持需要InitializeComponent()调用。
//
初始化组件();
//设置图表并添加值
ChartArea ca=chart1.ChartAreas.Add(“数据”);
ca.axix.IsMarginVisible=false;
ca.CursorX.Interval=0.001;
ca.CursorX.IsUserEnabled=true;
ca.CursorX.IsUserSelectionEnabled=true;
ca.axix.ScaleView.Zoomable=false;
对于(int i=0;i<10;i++)
{
系列s=新系列(“系列”+i.ToString());
s、 ChartArea=ca.名称;
s、 ChartType=SerieChartType.FastLine;
对于(int p=0;p<_maxPoints;p++)
{
双x=p/100.0;/(10ms步长)
双y=p*(1+i);
s、 点.AddXY(x,y);
}
图1.系列。添加(s);
}
}
_maxPoints的值越大,问题就越严重。您是如何绑定到数据的?请发布添加/绑定数据的代码,以及更改CursorX PropertyId的代码,以查看应用程序的大部分时间都花在哪里?顺便说一句,如果没有你的代码,你不太可能得到帮助。我现在添加了一些测试代码来进一步强调这个问题。分析显示当光标位置更改时,图表必须重新绘制,这需要重新检查所有数据点(Series.ResetAutoValues
被调用)尝试在循环之前添加s.points.SuspendUpdate
,在循环之后添加s.points.ResumeUpdates
。添加点的速度足够快。一旦图表加载完毕,用户用鼠标移动光标,问题就会出现