我构建了Conway作为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 checked属性。我还决定不需要单元格对象包含行和列索引,因为我可以通过获取TableLayoutPanel中的控件位置来确定它们。这也让我觉得没有必要使用Row类。我可以拥有一个包含Cell集合的Grid 我以新的方式重新编写应用程序,认为它将是一个更清晰的解决方案,但现在它运行得多,在性能方面要慢得多。 主处理代码是相同的,除了最初必须这样做:
foreach (Row r in RowList)
{
foreach (Cell c in CellList)
{
// Do stuff
}
}
现在只是这样:
foreach (Cell c in CellList)
{
// Do Stuff
}
我无法理解为什么第二个版本会慢得多。是因为细胞的收集要大得多,而不是分成几行?或者与我使用CheckBox对象而不是按钮的事实有什么关系?
非常感谢任何帮助!
答案 0 :(得分:3)
您没有显示更改“已检查”属性的代码,因此这是猜测,但是:
如果您的算法经常使用控件的“Checked”属性,那么它将非常慢,因为当属性的状态发生变化时,它将更新UI内容的负载。它将需要更新显示状态以显示交叉。
如果你只使用普通布尔,它会非常快。对bool使用Control属性可能会慢几千倍。