GDI + DashStyle выбрасывает исключение OutOfMemoryException в .NET

Я использую DashStyle.Dash при рендеринге моей иерархии объектов. Мое приложение широко использует Graphics.Transform, и я обнаружил, что при некоторых значениях шкалы (включая масштаб 100%) и некоторых углах поворота Graphics.DrawLine бросает OutOfMemoryException при использовании пера с DashStyle.Dash. Используя Google, я обнаружил, что это хорошо известный проблема. Microsoft сообщает нам, что это не блокировка проблема. Пока я не нашел решения этой проблемы.

Какие у меня варианты?


person Agnel Kurian    schedule 18.05.2009    source источник
comment
Я полагаю, вы избавляетесь от ручки? В одной из упомянутых статей говорилось, что нужно избегать дублирования точек в Graphics.DrawLine s. Вы используете единственную версию, верно? Вы можете опубликовать код; возможно, это поможет получить некоторые ответы.   -  person Paul Williams    schedule 14.08.2009
comment
Вам обязательно нужно избавиться от всех ваших объектов GDI +. У меня было много проблем, когда я этого не делал, и одна из них была исключением из памяти.   -  person Sebastian    schedule 25.08.2009
comment
Другая идея - взять профилировщик и посмотреть, что может происходить с кодом, например, утечка памяти, и помочь вам решить эту проблему.   -  person Sebastian    schedule 25.08.2009
comment
Я считаю, что речь идет о памяти видеокарты. И я думаю, проблема в том, что я кэшировал перья между событиями WM_PAINT, которые некоторые назвали плохой идеей.   -  person Agnel Kurian    schedule 25.08.2009


Ответы (1)


Я столкнулся с той же проблемой. При дальнейшем исследовании я обнаружил следующее.

  1. Длина линии точно соответствовала длине пользовательского штрихового рисунка. Изменение длины строки +/- 1 пиксель позволило избежать ошибки.
  2. Я использовал LineCapRound и DashCapRound, переключился на LineCapSquare и DashCapFlat избежал ошибки
  3. Ошибка возникла из-за попытки сгладить путь (предположительно из-за закругленных концов)
  4. Ширина пера была равна нулю.

Моим окончательным решением было не рисовать линии нулевой ширины!

person Stephen Nutt    schedule 06.09.2012