Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#GDI+;内存不足异常_C#_Gdi+_Out Of Memory_Lineargradientbrush - Fatal编程技术网

c#GDI+;内存不足异常

c#GDI+;内存不足异常,c#,gdi+,out-of-memory,lineargradientbrush,C#,Gdi+,Out Of Memory,Lineargradientbrush,简介:让我们看看平面上的点集(x,y)和函数F(x,y)返回双精度。点在用户定义的矩形中随机生成(这意味着变量约束)。让我们将相关点的数量设置为N。这一集合比三角剖分(Delaunay三角剖分)要多。假设此三角剖分设置了func F(x,y)曲面的近似值。边上的值呈线性变化(因此它只是点之间的一个范围(x,y,z=F(x,y))。顶点是插值的顶点。因此我们将三角形本身作为插值平面。 我在一个标准的图片框上绘制三角剖分图。使用LinearGradientBrush绘制边-颜色反映值F(x,y)的级


简介:让我们看看平面上的点集(x,y)和函数F(x,y)返回双精度。点在用户定义的矩形中随机生成(这意味着变量约束)。让我们将相关点的数量设置为N。这一集合比三角剖分(Delaunay三角剖分)要多。假设此三角剖分设置了func F(x,y)曲面的近似值。边上的值呈线性变化(因此它只是点之间的一个范围(x,y,z=F(x,y))。顶点是插值的顶点。因此我们将三角形本身作为插值平面。
我在一个标准的
图片框上绘制三角剖分图
。使用
LinearGradientBrush绘制边
-颜色反映值F(x,y)的级别(棕色-最大值,浅绿色-最小值,绿色-中间)。 在我设置N>=M之前,这一切都是有效的,其中M在~30k到50k之间不断变化。在这种情况下,我会出现内存不足异常。虽然我没有看到任务管理器中缺少操作内存,但我认为它指的是视频内存,不是吗?
我可以绘制N=100k的三角剖分,而无需使用颜色渐变(只需简单的单色实心边),因此我认为问题在于每次迭代时使用或创建GDI对象
Pen
LinearGradientBrush

一些代码:

private void pboxTriangulation_Paint(对象发送方,PaintEventArgs e)
{
e、 Graphics.SmoothingMode=SmoothingMode.AntiAlias;
如果(null!=dt)
使用渐变绘制(例如图形);
}
带渐变的专用空心颜料(图形g)
{
//这里我删除了代码块
//其中,我在集合上找到F(x,y)的最小值、最大值和中间值
foreach(三角形t在dt.三角形中)
{
System.Drawing.PointF[]ps=新的System.Drawing.PointF[3];
颜色[]颜色=新颜色[3];
对于(int i=0;i<3;i++)
{
//在这里,对于每个第i点,我找到了它的显示坐标-ps[i]
//顶点的颜色-颜色[i]
}
对于(int i=0;i<3;i++)
{
使用(LinearGradientBrush b=新的LinearGradientBrush(ps[i],ps[(i+1)%3],colors[i],colors[(i+1)%3]))
{
使用(笔=新笔(b))
{
g、 抽绳(pen,ps[i],ps[(i+1)%3]);
}
}
}
}
}

示例:
问题:问题是什么?我如何解决它?
请不要建议使用其他绘图工具作为解决方案(例如OpenGL和其他强大工具)但如果你想把它写下来作为对这个问题的评论——我会记住它,也许它在将来会有用。这个问题不是关于如何在广义上绘制带有梯度边的三角剖分,而是关于我的例子中例外的根源是什么


UPD:程序是在x64中构建的。在x86中,它消耗200k(不是更高的N)看起来还可以。300k在分配了~1.8gb的情况下在一段时间后下降了。

您是否尝试过在每次迭代中都不创建新的画笔和线性渐变?显然,结果是纯色,但如果您没有遇到内存异常,那么您可能已经发现了问题。听起来像是您想到了这一点,但您没有指定您是否有此问题d尝试过了。CLR OutOfMemory异常从不引用视频内存。是否确实在绘图代码中获得OOM,而不是在代码的其他部分?(还要检查CLR内存性能计数器以查看分配了多少空间,还要指定进程是32位还是64位)@李哈里森:是的,我试过了,没有任何问题就得了10万分problems@AlexeiLevenkov:LinearGradientBrush构造函数中每次都会出现异常。我有x64 win7,所以我说的“任何cpu”都对吗项目属性中的选项意味着x64?因此我尝试在x86中构建它,它绘制了200000点三角剖分!@pkuderov:我觉得很奇怪,但您是否尝试过使用单个
LinearGradientBrush
并在每次需要时简单地修改
GradientStops
属性(以及任何其他相关属性)?值得一试?1