我在我的UI中画了一条线,每次重绘图形时都需要更新。由于我希望我的UI仍然具有响应性(目前不是这样),我使用的是每次呈现UI时都会调用的后台工作程序。如上所述,在绘制线条时,UI变得无响应且速度慢。有什么我可以改变来改进我的软件吗?
这是我正在使用的代码(至少是相关的部分)。
BackgroundWorker _worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
void CompositionTarget_Rendering(object sender, EventArgs e)
{
if (!_worker.IsBusy) { _worker.RunWorkerAsync(); }
}
我使用的线是由Point []数组生成的。为了确保没有其他因素减慢软件速度,我将生成线分解为仅使用虚拟值:
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));
}
});
}
该行的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>
非常感谢任何推荐!
编辑:除了Clemens的回答,我还将DispatcherPriority
更改为System.Windows.Threading.DispatcherPriority.ApplicationIdle
,这也增加了UI的责任。我认为这是一个我现在可以忍受的状态...... :)
答案 0 :(得分:4)
如果您没有逐点更新PolyBezierSegment,而是创建新的PointCollection
并将其分配给PolyBezierSegment的Points
属性,则不需要所有这些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
}
另请注意,WPF提供的渲染图形比Path控件中的PathGeometry更有效。您可以开始阅读MSDN上的Graphics and Multimedia文章。