這一個很瘋狂。我只需在OnPaint
處理程序中繪製幾千行。當pen.Width <= 1
或屏幕上沒有多少行時,沒有問題。使用WinForms繪製寬線時發生OutOfMemoryException
好吧,我畫一個縮放的地圖。線寬與地圖成比例。當我放大某些地圖時,我得到OutOfMemoryException
。爲什麼?!
當我設置pen.Width
爲1 - 沒有問題。當我將它設置爲對應軌道寬度時 - 某些地圖繪製正常,某些地圖會在某些縮放級別拋出異常。
發生了什麼事?這與實際的內存使用沒有任何關係。我已經仔細檢查了這一點。
順便說一下,pen.Width
我設置的時候發生了2左右。
該代碼看起來像foreach (...) g.DrawLine(...)
- 它在繪製幾百行後崩潰。
如果我不能找到解決方案,我將不得不放棄線寬縮放,這將大大降低演示質量。或者我可以做一個醜陋的黑客試圖趕上這個例外(如果它可以被捕獲)...
注:我沒有使用任何位圖。我不操作龐大的陣列。繪圖時我不打開任何文件。有一組向量(大約10k個元素),我只是將它們全部繪製爲單獨的行,對各種地圖對象使用一些不同的筆。當我不碰pen.Width
- 沒有發生異常。當我設置pen.Width時 - 一些地圖可以正確顯示所有縮放級別,但有些會拋出異常。在進入繪圖循環之前,會在OnPaint
事件中創建5筆,並在退出循環後正確放置。繪製每條線之前,其寬度已設置。
我試圖限制線座標只有在實際可見的視口。這是多餘的,因爲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',你會分享你的完整堆棧跟蹤嗎? –
請參閱[GraphicsPath和OutOfMemoryException](http://stackoverflow.com/q/6927774/719186) – LarsTech
這可能是!謝謝你,我明天會檢查一下,但這會加起來。 – Harry