如何提高WPF liveCharts的渲染性能



这是我第一次在这里发布问题。所以,请原谅我糟糕的英语写作。我尽力把它说得更清楚。我编写了一个WPF程序,它使用LiveCharts控件来显示数据。XAML和后面的代码如下所示,我认为它非常简单。问题是,CPU使用率太高。运行大约30分钟后,大约一半的cpu被消耗掉。这正常吗?有谁能给我一些建议来降低CPU使用率并提高程序性能吗?

// this is the xaml
<Window x:Class="lvChartTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:lvChartTest"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" d:DataContext="{d:DesignInstance local:MainWindow}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<lvc:CartesianChart Series="{Binding ASeriesCollection}" 
Hoverable="False" LegendLocation="Left">
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="Salesman" Labels="{Binding ALabels}"></lvc:Axis>
</lvc:CartesianChart.AxisX>
<lvc:CartesianChart.AxisY>
<lvc:Axis Title="Sold Apps" LabelFormatter="{Binding AFormatter}"></lvc:Axis>
</lvc:CartesianChart.AxisY>
</lvc:CartesianChart>
<lvc:CartesianChart Grid.Row="1" Series="{Binding BSeriesCollection}" 
Hoverable="False"  LegendLocation="Right" >
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="Month" Labels="{Binding BLabels}"></lvc:Axis>
</lvc:CartesianChart.AxisX>
<lvc:CartesianChart.AxisY>
<lvc:Axis Title="Sales" LabelFormatter="{Binding BFormatter}"></lvc:Axis>
</lvc:CartesianChart.AxisY>
</lvc:CartesianChart>
</Grid>
</Window>
// this is the code behind
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
ASeriesCollection = new SeriesCollection
{
new ColumnSeries
{
Title = "2015",
PointGeometry=null,
Values = new ChartValues<ObservableValue>
{
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0),
new ObservableValue(0)
}
}
};
ALabels = new[] { "Maria", "Susan", "Charles", "Frida" };
AFormatter = value => value.ToString("N");
BSeriesCollection = new SeriesCollection
{
new LineSeries
{
Title = "Series 1",
PointGeometry=null,
Values = new ChartValues<ObservableValue>
{
new ObservableValue(4),
new ObservableValue(2),
new ObservableValue(8),
new ObservableValue(2),
new ObservableValue(3),
new ObservableValue(0),
new ObservableValue(1),
}  
}
};
BLabels = new[] { "Jan", "Feb", "Mar", "Apr", "May" };
BFormatter = value => value.ToString("C");
DispatcherTimer timerForDisplayData = new DispatcherTimer();
timerForDisplayData.Interval = TimeSpan.FromSeconds(1);
timerForDisplayData.Tick += OnDisplayData;
timerForDisplayData.Start();
}
private void OnDisplayData(object sender, EventArgs e)
{
var r = new Random();
foreach (var series in ASeriesCollection)
{
foreach (var observable in series.Values.Cast<ObservableValue>())
{
observable.Value = r.Next(0, 10);
}
}
foreach (var series in BSeriesCollection)
{
if (series.Values.Count >= 500)
{
series.Values.RemoveAt(0);
}
series.Values.Add(new ObservableValue(r.Next(0, 100)));
}
}
public SeriesCollection ASeriesCollection { get; set; }
public string[] ALabels { get; set; }
public Func<double, string> AFormatter { get; set; }
public SeriesCollection BSeriesCollection { get; set; }
public string[] BLabels { get; set; }
public Func<double, string> BFormatter { get; set; }
}

遗憾的是,文档中建议:

  • 丢失动画:DisableAnimations="True"
  • 丢失工具提示DataTooltip="{x:Null}"
  • 通过愤怒添加而不是简单添加(用series.Values.AddRange替换series.Values.Add,这基本上意味着降低频率(

查看此页面了解更多提示。顺便说一句,LiveChars免费版似乎受到了有意的限制,越来越多的人在为表演而挣扎。

尝试将OnDisplayData代码移动到using语句中,该语句禁用调度器,如下所示:

using(var dispatcher = Dispatcher.DisableProcessing())
{
/* do work while the dispatcher processing is disabled... */
}

https://learn.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher.disableprocessing?view=netframework-4.8

对于免费图表,唯一有帮助的是将PointGeometry设置为null。即使禁用动画、工具提示和悬停也无济于事。使用Geared,即使启用了PointGeometry、工具提示和悬停,性能也令人惊叹。

相关内容

  • 没有找到相关文章

最新更新