【发布时间】:2015-01-16 00:17:48
【问题描述】:
这个太疯狂了。我只是在OnPaint 处理程序中画了几千行。没有问题,pen.Width <= 1,或者屏幕上没有多少行。
好的,我画了一张比例尺的地图。线宽随地图缩放。当我缩放一些地图时,我得到OutOfMemoryException。为什么?!
当我将pen.Width 设置为 1 - 没问题。当我将其设置为对应的轨道宽度时 - 有些地图绘制正常,有些则在某些缩放级别抛出异常。
发生了什么事?它与实际内存使用无关。我已经仔细检查过。
顺便说一句,我设置的 pen.Width 在它发生时约为 2。
代码看起来像foreach (...) g.DrawLine(...) - 在画了几百行后它崩溃了。
如果我找不到解决方案,我将不得不放弃线宽缩放,这会大大降低演示质量。或者我可以做一个丑陋的黑客尝试捕捉这个异常(如果它可以被捕捉到的话)......
注意:我不使用任何位图。我不对巨大的数组进行操作。我在绘图期间不打开任何文件。有一个向量数组(大约 10k 个元素),我只是将它们全部绘制为单独的线,使用一些不同的笔来绘制各种地图对象。当我不触摸pen.Width 时 - 不会发生异常。当我设置 pen.Width - 一些地图在所有缩放级别上都正确显示,但有些则抛出异常。这 5 支笔在进入绘图循环之前在OnPaint 事件中创建,并在退出循环后正确处理。在绘制每条线之前设置其宽度。
我试图将线坐标限制为仅在视口中实际可见的坐标。这是多余的,因为 Graphics 对象会自己处理它。当然没有帮助。我在一些较小的窗口尺寸上尝试过 - 没有帮助。我试图打开和关闭双缓冲。没有喜悦。我没有想法。
编辑:
private void DrawMap(PaintEventArgs e) {
var pens = new[] {
new Pen(TrackColor),
new Pen(SwitchColor),
new Pen(RoadColor),
new Pen(RiverColor),
new Pen(CrossColor)
};
var b = Splines.Bounds;
var g = e.Graphics;
var f = true; // OutFull;
var tr = GetTransformation();
float ts = tr[0], tx = tr[1], ty = tr[2];
TrackSpline[] visible = !f ? Splines.GetSubset(ts, _Viewport) : null;
var ct = f ? Splines.Count : visible.Length;
for (int i = 0; i < ct; i++) {
TrackSpline s = f ? Splines[i] : visible[i];
var pen = pens[s.T];
pen.Width = ts * s.W;
if (ts < 0.01 || s.L) {
var p1 = new PointF(s.A.X * ts + tx, s.A.Y * ts + ty);
var p2 = new PointF(s.D.X * ts + tx, s.D.Y * ts + ty);
g.DrawLine(pen, p1, p2);
} else {
var p1 = new PointF(s.A.X * ts + tx, s.A.Y * ts + ty);
var p2 = new PointF(s.B.X * ts + tx, s.B.Y * ts + ty);
var p3 = new PointF(s.C.X * ts + tx, s.C.Y * ts + ty);
var p4 = new PointF(s.D.X * ts + tx, s.D.Y * ts + ty);
try {
g.DrawBezier(pen, p1, p2, p3, p4);
} catch (OutOfMemoryException) {
g.DrawLine(pen, p1, p4);
}
}
}
foreach (var p in pens) p.Dispose();
}
看到这里的丑陋黑客了吗?它完美无缺,我什至看不到哪些曲线被线条替换。显然g.DrawBezier 抛出异常。我不喜欢丑陋的黑客...
【问题讨论】:
-
关于
OutOfMemoryException,请分享您的完整堆栈跟踪信息吗? -
这可能是它!谢谢老兄,我明天会检查一下,但这加起来了。
-
您无法捕获内存不足异常 -
catch (OutOfMemoryException)- 请参阅 safaribooksonline.com/library/view/c-40-unleashed/9780132678926/… -
什么是
GetTransformation?