【问题标题】:Program takes too much memory程序占用太多内存
【发布时间】:2011-09-20 21:57:03
【问题描述】:

我正在使用 WPF 开发康威生命游戏的模拟器。

由于某种原因,有时程序会占用高达 400,000K 的内存(当我绘制大量单元格时非常快)。

如何减少内存使用和/或减少由此引起的延迟。

编辑 1: 主窗口代码: http://pastebin.com/mz0z7tBu

网格类: http://pastebin.com/ZHX1WBuK

细胞结构:

struct Cell
{
    public int Neighbors {get; set;}
    public bool Alive { get; set; }
}

编辑 2: 我将尝试解释程序结构: Cell 是一个结构,其中包含 AutoProperty 邻居的 int 类型和 AutoProperty IsAlive 的类型 bool。

CellGrid 是一个包装二维单元格数组的类。 每次迭代,每个 Cell 的 Neighbors 属性都会更新以包含存活的 Neighbors 的数量,然后将每个 Cell 的 IsALive 设置为 true 或 false,这取决于邻居的数量和之前的 IsAlive 状态。

MainWindow 类有一个 CellGrid 类型的对象。 它将网格渲染到屏幕上。

编辑 3:

XAML:http://pastebin.com/Zp3dr8zc

resources.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type MenuItem}">
        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="MaxHeight" Value="32" />
    </Style>
    <Style TargetType="{x:Type MenuItem}" x:Key="ParentMenuItem">
        <Setter Property="Width" Value="46" />
    </Style>
</ResourceDictionary>

【问题讨论】:

  • 任何人都很难在没有看到代码的情况下提供指导。
  • 如何控制世代之间的时间?
  • 绘图代码还是单元格代码? @DMX 没有时间。只需单击一个按钮即可传递世代。
  • @Gilad Naaman:在共享代码之前,不要 / ,而是尝试对程序结构进行高级演示:例如。单元:它们是什么,有多大,何时/如何创建,哪些模块使用它们。例如。 “Generation manager”等。您可能会发现,在以适当的精度解释问题时,您可能会给自己一些想法,作为过度使用内存的可能来源。
  • 添加程序结构+代码

标签: c# wpf xaml memory conways-game-of-life


【解决方案1】:

这是使用 DrawingContext/DrawingVisual 的结果。它实际上是良性的,应该在系统需要时全部进行垃圾收集,但内存使用情况可能令人担忧。相反,如果您要在画布上绘制形状,那么您可能不会看到这个问题。过去,我在使用自定义绘制控件时遇到过同样的问题。改用更多基于矢量的绘图技术(即画布上的形状)解决了内存消耗问题。

【讨论】:

  • 谢谢你:)。你有画布使用的学习资源吗?
  • 学习它们可能有点复杂,但我的项目 WPFSVL 有一个例子 (wpfsvl.codeplex.com)。频谱分析器控件用于使用 DrawingContext 和 DrawinVisual 进行快速渲染,但我将其更改为使用形状。当我这样做时,我看到了与您类似的情况。它曾经“占用”数百 MB 内存,但现在整个应用程序占用大约 30 MB。
  • 为了比较,你可以在这里找到一些仍然使用DrawingVisuals的旧源代码:inchoatethoughts.com/…
  • 那么,我应该怎么写呢?每一代都添加矩形并更改其背景属性?
  • 是的,没错。在画布上您需要它们的位置添加矩形并更改其填充属性以更改颜色。我的直觉是,与 DrawingContext 方法相比,这会非常慢,但它的性能确实令人惊讶。
猜你喜欢
  • 1970-01-01
  • 2017-09-01
  • 2013-01-10
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2015-10-14
  • 2013-07-18
  • 2013-07-11
相关资源
最近更新 更多