【发布时间】:2018-06-19 12:24:42
【问题描述】:
我是初学者,正在做一些 C# 练习。我发现了 Forest Fire Model 并尝试使用 WPF 来实现这一点,对于绘图,我通过为每个像素创建一个矩形来使用画布。 我遇到的问题是程序冻结并且画布不绘制任何东西(使用 while(true) 循环)。此外,我在迭代后删除了所有子项,但程序仍在收集 GB 的 RAM。
用于测试的简化代码:
public partial class TestDrawing : Window
{
public TestDrawing()
{
InitializeComponent();
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
DrawForestFire();
}
private void DrawForestFire()
{
Random rand = new Random();
while (true)
{
for (int y = 0; y < 100; y++)
{
for (int x = 0; x < 100; x++)
{
Rectangle rectangle = new Rectangle();
Color color = Color.FromRgb((byte)rand.Next(200),
(byte)rand.Next(200), (byte)rand.Next(200));
rectangle.Fill = new SolidColorBrush(color);
rectangle.Width = 4;
rectangle.Height = 4;
Canvas.SetTop(rectangle, y * 4);
Canvas.SetLeft(rectangle, x * 4);
canvas.Children.Add(rectangle);
}
}
canvas.Children.Clear();
}
}
}
我还尝试在线程中绘制运行“DrawForestFire()”,画布对象位于“this.Dispatcher.Invoke(() => { ... });”中但这对我没有任何影响。出了什么问题?
而且,对于这种操作,还有比 Canvas 更好的东西吗?
【问题讨论】:
-
永远不要在应用程序的 UI 线程中使用
while (true)。使用计时器,例如而是 DispatcherTimer。 -
您正在连续循环中制作 10000 个黑色矩形。难怪它变得反应迟钝。
-
而不是绘制 10000 个矩形,考虑使用 WriteableBitmap。
-
你见过stackoverflow.com/questions/1644874/…>吗?
-
我尝试创建一个间隔为 2 秒的 DispatcherTimer,我确实让 DrawForestFire() 每个 Tick 运行,但它只冻结了一秒钟,什么也没发生。我想让它在画布上工作,之后我会用位图尝试一下。