【问题标题】:C# Conway's Game Of LifeC# Conway 的生命游戏
【发布时间】:2013-12-01 10:01:07
【问题描述】:

我将康威人生游戏的一个版本构建为 C# Windows 窗体应用程序。 该表单包含一个 TableLayoutPanel,并且该表的每个单元格都包含一个表单控件。 最初,我有以下课程:

网格

int Rows
int Cols  
List<Row> RowList

List<Cell> CellList

单元格

bool IsAlive
Button b
int ColIndex
int RowIndex

代码构建了一个网格对象,没有。行和列作为参数,然后将每个单元格按钮控件放置到 TableLayoutPanel 的相关行和列中的表单上。 我完成了游戏的开发,一切正常。我的最大网格尺寸为 50x50,运行非常流畅。
然后我想了想,决定我最好使用 CheckBox 控件而不是 Button 控件。这将否定 Cell 类中对布尔 IsAlive 的需要,因为我可以只使用 CheckBox 选中的属性。我还决定单元格对象不需要包含行和列索引,因为我可以通过获取 TableLayoutPanel 中的控件位置来确定这些。这也让我觉得不需要 Row 类。我可以只拥有一个包含一组单元格的网格。
我以新的方式重新编写了应用程序,认为这将是一个更清洁的解决方案,但现在它在性能方面运行得非常非常慢。 主要处理代码是相同的,除了原来它必须这样做:

foreach (Row r in RowList)
{
    foreach (Cell c in CellList)
    {
        // Do stuff
    }
}

它现在在哪里:

foreach (Cell c in CellList)
{
    // Do Stuff
}

我不明白为什么第二个版本这么慢。是因为单元格的集合更大而不是分解成行吗?或者与我使用 CheckBox 对象而不是按钮这一事实有关?

任何帮助将不胜感激!

【问题讨论】:

  • 一般来说,最好将底层数据结构(单元格列表)和表示(按钮/复选框)尽可能分开。否则,您将程序逻辑与显示方法紧密耦合。仅出于这个原因,我不确定使用复选框的“已检查”属性而不是布尔值来存储状态是最好的举动。
  • 谢谢我感谢建设性的批评。 C# 对我来说是新手,也是我第一次接触 OO 编程。我的背景是 IBM iSeries 和 RPG。

标签: c# list button checkbox collections


【解决方案1】:

您没有显示更改“Checked”属性的代码,所以这是一个猜测,但是:

如果你的算法经常使用控件的“Checked”属性,它会很慢,因为当属性状态发生变化时,它会更新大量的 UI 内容。它将希望更新显示状态以显示十字。

如果你只使用一个普通的布尔值,它会非常快。对布尔值使用 Control 属性可能会慢数千倍。

【讨论】:

  • 同意 - 这将是瓶颈。值得注意的是,对于像 50x50 这样的小数组大小,几乎没有时间花在单元格列表中。在其他条件相同的情况下,从行和列更改为简单的单元格列表根本不会是性能问题。
  • 谢谢!这就说得通了。最初,为了更新单元格,我有自己的方法来更新布尔值,然后设置按钮背景颜色。一旦我更改为使用复选框,复选框背景颜色就会由复选框控件方法根据其选中值进行更改。我猜在检查值更改时执行的复选框方法必须比我在使用 Button 的原始更新方法中所做的处理更多。
猜你喜欢
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2017-03-09
相关资源
最近更新 更多