C# WPF:动画线条减慢用户界面速度
我在UI中画了一条线,每次重新绘制图形时都需要更新它。因为我希望我的UI仍然是响应性的(目前不是这样),所以我使用了一个backgroundworker,它在每次呈现UI时都会被调用。如前所述,当绘制线时,UI变得无响应且缓慢。有什么我可以改变来改进我的软件吗 这就是我正在使用的代码(至少是相关的部分) 我使用的线是由点[]的数组生成的。为了确保没有其他东西会减慢软件的速度,我将行生成简化为仅使用虚拟值:C# WPF:动画线条减慢用户界面速度,c#,wpf,xaml,C#,Wpf,Xaml,我在UI中画了一条线,每次重新绘制图形时都需要更新它。因为我希望我的UI仍然是响应性的(目前不是这样),所以我使用了一个backgroundworker,它在每次呈现UI时都会被调用。如前所述,当绘制线时,UI变得无响应且缓慢。有什么我可以改变来改进我的软件吗 这就是我正在使用的代码(至少是相关的部分) 我使用的线是由点[]的数组生成的。为了确保没有其他东西会减慢软件的速度,我将行生成简化为仅使用虚拟值: void Worker_DoWork(object sender, DoWorkEvent
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
Dispatcher.BeginInvoke((Action)delegate
{
Point[] line = new Point[480];
MySegment1.Points.Clear();
bool isStart = true;
for (int i = 0; i < line.Length; i++)
{
line[i] = new Point(0, 0);
if (isStart)
{
MyFigure1.StartPoint = line[i];
isStart = false;
}
else
MySegment1.Points.Add(new Point(i, line[i].Y + 10));
}
});
}
void Worker\u DoWork(对象发送方,DoWorkEventArgs e)
{
Dispatcher.BeginInvoke((操作)委托
{
点[]线=新点[480];
MySegment1.Points.Clear();
bool-isStart=true;
for(int i=0;i
该行的XAML如下所示:
<Path Stroke="GreenYellow" StrokeThickness="2" Name="MyPath1" Grid.Column="1">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure x:Name="MyFigure1" StartPoint="0,0">
<PathFigure.Segments>
<PathSegmentCollection>
<PolyBezierSegment x:Name="MySegment1"/>
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
非常感谢您的推荐
编辑:除了克莱门斯的回答之外,我还将
DispatcherPriority
更改为System.Windows.Threading.DispatcherPriority.ApplicationIdle
,这也大大增加了UI的责任。我认为这是我目前可以忍受的一种状态……:) 如果不逐点更新PolyBezierSegment,而是创建一个新的点集合
,并将其分配给PolyBezierSegment的点
属性,则无需进行所有这些BackgroundWorker“优化”:
private Random random = new Random(); // creates some sample data
private void CompositionTarget_Rendering(object sender, EventArgs e)
{
var line = new Point[480];
for (int i = 0; i < line.Length; i++ )
{
line[i] = new Point(i, random.Next(0, 100));
}
MyFigure1.StartPoint = line[0];
MySegment1.Points = new PointCollection(line); // here
}
private Random=new Random();//创建一些示例数据
私有void CompositionTarget_呈现(对象发送方,事件参数e)
{
var线=新点[480];
for(int i=0;i
还请注意,WPF提供了比路径控件中的PathGeometry更高效的图形渲染方法。您可以开始阅读MSDN上的文章。如果您不逐点更新PolyBezierSegment,而是创建一个新的
点集合
,并将其分配给PolyBezierSegment的点
属性,则无需进行所有这些BackgroundWorker“优化”:
private Random random = new Random(); // creates some sample data
private void CompositionTarget_Rendering(object sender, EventArgs e)
{
var line = new Point[480];
for (int i = 0; i < line.Length; i++ )
{
line[i] = new Point(i, random.Next(0, 100));
}
MyFigure1.StartPoint = line[0];
MySegment1.Points = new PointCollection(line); // here
}
private Random=new Random();//创建一些示例数据
私有void CompositionTarget_呈现(对象发送方,事件参数e)
{
var线=新点[480];
for(int i=0;i
还请注意,WPF提供了比路径控件中的PathGeometry更高效的图形渲染方法。您可以开始阅读MSDN上的文章。您的后台工作人员正在后台线程上运行worker\u DoWork?对不,你正在使用调度程序在UI线程上运行整个更新算法。您的后台工作人员不会执行jack Shuck操作,除非将该方法排入调度程序。老实说,做你想做的事所需要的技能水平相当高;我建议抛售动画,或者只是买一个控件,它可以按照你需要的方式来做你需要做的事情。谢谢你的诚实意见-需要什么样的技能才能做到这一点?我真的很想自己学习如何实现这一点,而不是买任何东西……首先,我很好地理解了多线程应用程序编程是如何完成的。其次,深入了解如何在WPF中呈现UI。第三,对于动画复杂图形,最必要的是如何通过DX在WPF中编程加速的2d和3d图形。这三者的复杂程度从一开始就非常高,并且呈指数级上升。这就是为什么买总比写好。你的后台工作人员在后台线程上运行worker\u DoWork?对不,你正在使用调度程序在UI线程上运行整个更新算法。您的后台工作人员不会执行jack Shuck操作,除非将该方法排入调度程序。老实说,做你想做的事所需要的技能水平相当高;我建议抛售动画,或者只是买一个控件,它可以按照你需要的方式来做你需要做的事情。谢谢你的诚实意见-需要什么样的技能才能做到这一点?我真的很想自己学习如何实现这一点,而不是买任何东西……首先,我很好地理解了多线程应用程序编程是如何完成的。其次,深入了解如何在WPF中呈现UI。第三,对于动画复杂图形,最必要的是如何通过DX在WPF中编程加速的2d和3d图形。这三者的复杂程度从一开始就非常高,并且呈指数级上升。这就是为什么买总比写好。哇,谢谢。这是一个巨大的推动。谢谢你推荐的文章!哇,谢谢你。这是一个巨大的推动。谢谢你推荐的文章!