gpt4 book ai didi

c# - 在 GDI+ 中递归绘制矩形时出现 OutOfMemory 异常

转载 作者:行者123 更新时间:2023-11-30 16:59:12 25 4
gpt4 key购买 nike

我在使用 GDI+ 的 C# 中绘制和填充矩形时遇到问题。我正在尝试渲染 treemap因此构建了一个递归算法,该算法从根到叶级别遍历树结构,并在任何情况下绘制一个矩形,但如果该节点恰好是叶节点,则填充该矩形。

该代码适用于较小的树,但对于具有 42 层节点的较大数据集可重现地崩溃。尝试渲染第 16 层以下的节点时,上层 DrawRectangle 调用抛出 OutOfMemoryException,独立于 32 位/64 位或调试和发布配置。

Brushes 和 Pens 不会发生变化,因此它们存储在方法外部的数组中。创建或处置对象都没有问题。

这是我用来渲染树状图的递归方法:

/// <summary>
/// Renders a certain <see cref="Tree"/> onto the canvas.
/// </summary>
/// <param name="tree">The tree node to be rendered.</param>
/// <param name="g">The <see cref="Graphics"/> canvas to render the tree to.</param>
/// <param name="bounds">The rectangle available for the specified <paramref name="tree"/>.</param>
protected void RenderTree(Tree tree, Graphics g, RectangleF bounds)
{
if (tree.IsLeaf)
{
g.FillRectangle(brushes[tree.Depth], bounds);
g.DrawRectangle(pens[tree.Depth], bounds);
}
else
{
g.DrawRectangle(pens[tree.Depth], bounds);

if (bounds.Width >= bounds.Height)
{
float widthPerChild = bounds.Width / (float)tree.Children.Count;
for (int i = 0; i < tree.Children.Count; ++i)
{
RenderTree(tree.Children[i], g, new RectangleF(bounds.X + i * widthPerChild, bounds.Y, widthPerChild, bounds.Height));
}
}
else
{
float heightPerChild = bounds.Height / (float)tree.Children.Count;
for (int i = 0; i < tree.Children.Count; ++i)
{
RenderTree(tree.Children[i], g, new RectangleF(bounds.X, bounds.Y + i * heightPerChild, bounds.Width, heightPerChild));
}
}
}

}

对于代码有什么问题有什么想法吗?还是 GDI+ 有问题?

最佳答案

谢谢大家的评论;我可以解决这个问题。我还测试了绘图过程的迭代版本,它没有改变任何东西,但给了我更好的调试选项。 问题似乎是我尝试绘制的矩形太小(宽度和高度 > 0,但大约为 10^(-5)):在绘制矩形之前,我添加了一个阈值,如果矩形的宽度或高度小于 1/1000。当然,这使得 OutOfMemoryException 不是很有帮助,因为您提到的所有内存问题都没有显示出任何可疑行为。

关于c# - 在 GDI+ 中递归绘制矩形时出现 OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24042367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com