3


简介:让我们在平面上设置点 (x, y) 并返回 double 的 func F(x, y)。在用户定义的矩形中随机生成点(这意味着对变量的约束)。让我们将生成点的数量设置为 N。这个设置比三角剖分(Delaunay triangulation)。想象一下,这个三角剖分设置了 func F(x, y) 的曲面的近似值。边缘上的值线性变化(所以它只是点之间的范围(x,y,z = F(x,y))。顶点是插值的顶点。所以我们将三角形本身作为插值平面。
我在标准上绘制三角剖分PictureBox. 边缘是使用绘制的LinearGradientBrush- 颜色反映值 F(x, y) 的水平(棕色 - 最大值,浅绿色 - 最小值,绿色 - 中间)。这一切都有效,直到我设置 N >= M,其中 M 不时从 ~30k 到 50k 变化。在这些情况下,我会遇到内存不足异常。虽然我没有在任务管理器中看到缺乏可操作内存,但我认为它指的是视频内存,不是吗?
我可以在不使用颜色渐变的情况下绘制 N = 100k 的三角剖分(只是简单的纯单色边缘),所以我认为问题在于LinearGradientBrush使用或创建 GDI 对象Pen以及LinearGradientBrush每次迭代。
一些代码:

private void pboxTriangulation_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    if (null != dt)
        PaintWithGradient(e.Graphics);
}

private void PaintWithGradient(Graphics g)
{
    //here I erased code block
    //where I find min, max and middle values of F(x, y) on a set        

    foreach (Triangle t in dt.triangles)
    {
        System.Drawing.PointF[] ps = new System.Drawing.PointF[3];
        Color[] colors = new Color[3];
        for (int i = 0; i < 3; i++)
        {
            //here for every i-th point I find its display coordinates - ps[i]
            //and color of vertex - colors[i]
        }

        for (int i = 0; i < 3; i++)
        {
            using (LinearGradientBrush b = new LinearGradientBrush(ps[i], ps[(i + 1) % 3], colors[i], colors[(i + 1) % 3]))
            {
                using (Pen pen = new Pen(b))
                {
                    g.DrawLine(pen, ps[i], ps[(i + 1) % 3]);
                }
            }
        }
    }
}


示例: n = 10k , n = 100k (built as x86) , n = 200k (built as x86)
问题:问题是什么,我该如何解决?
请不要建议使用其他绘图工具作为解决方案(例如 OpenGL 和其他强大的工具),但如果您只想将其写为问题的评论 - 我会记住它,也许它将来会有用。这个问题不是关于如何在广义上用渐变边缘绘制三角剖分,而是关于我的情况的异常根源是什么。

UPD:程序是在 x64 中构建的。在 x86 中,它绘制 200k(未尝试更高的 N)并且看起来还可以。一段时间后下降了 300k,分配了 ~1.8gb。

4

0 回答 0