1

所以在模型方面,我有一个 100x100 的 Cell 对象数组。这些对象有一个属性 State,它是一个布尔值。Cell 实现 INotifyPropertyChanged。我还有一个 CellCollection 对象,它包含 100x100 数组并具有修改该数组的方法。

在视图方面,我有一个包含 10,000 个 Rectangle 控件的画布,它们排列在一个 100x100 的网格中。100x100 数组的每个元素都设置为 Canvas 中它们对应的 Rectangle 的 DataContext。DataTrigger 是为 XAML 中的 Rectangle 控件定义的,该控件绑定在 Rectangle 的 DataContext 的 State 属性上。如果 State 的值为 True,则将 Rectangle 的背景设置为黑色(通过 Setter),如果为 False,则将背景设置为白色。

现在我有一个以 100 毫秒间隔运行的 DispatcherTimer,它调用 CellCollection 对象上的一个方法。该方法评估数组的状态,并更改其某些元素的 State 属性的值。随着 State 属性的值发生变化,这些变化会按预期反映在 GUI 中。

唯一的问题是它非常慢。

因此调度程序调用的 CellCollection 方法分两部分工作:首先它计算单元数组的新状态应该是什么,并将结果存储在一个 100x100 布尔数组中。其次,它遍历 Cell 数组并根据 bool 数组中的值更新其元素的 State 属性。我在控制台上打印了一些时间戳,似乎计算 bool 数组大约需要 10 毫秒,所以我不认为这是我的算法效率低下的问题,而是我推测缓慢是由于细胞所有更新几乎同时(触发属性更改事件,进而触发更改相应矩形的填充值的数据触发器)。

我是 C# 和 WPF 的新手,所以我不完全确定如何让它更快。有人告诉我,可以使用 Dispatcher 大大提高性能,但我不确定如何做到这一点。我也知道 BackgroundWorker 类,但不完全确定在这种情况下如何使用它。

最初我将 Cell 的 State 属性绑定到 Rectangle 的 Fill 属性,并使用 ValueConverter 将布尔值转换为颜色。有人建议 DataTriggers 可能更快,这是我目前正在使用的,但我并没有真正注意到任何性能改进。其他人还建议我应该使用 RectangleGeometry 和 Path 对象而不是 Rectangle 对象,因为它可能会提高图形性能,但不确定这是否准确,并且没有太多运气成功实现这一点。

无论如何,我能做些什么来提高我的应用程序的性能?

4

1 回答 1

1

首先,确保您只更改实际更改值的单元格。如果某些内容保持不变,请不要设置属性背景字段,也不要发出 NotifyChanged 信号。

这很可能无济于事。所以你需要另一种方法。你没有提到通过这个 wpf 元素的任何输入。所以我认为它们仅用于展示。更新 10K 元素,因为它更容易处理…… 更容易处理,但速度非常慢。您真正想要的是显示 100 x 100 单元格图片的单个元素。尝试先在代码中将该图片绘制到位图中,然后使用 Image 控件并绑定到位图使位图出现在屏幕上。绘制时,Bitmap 是旧的,一旦在后台完成生成 bitmpa,就可以设置这个新的 Bitmap。

您可以在后台线程中处理位图的绘制,但我的猜测是这将是一种快速有意义的方式。

于 2013-05-23T05:37:27.930 回答