Практические правила в GDI+

Я работал над кодом GDI+ в .NET и усердно усваивал уроки. Простые вещи, такие как:

  • То, что хорошо выглядит на экране, может выглядеть не очень красиво на бумаге, и наоборот.
  • Кэширование слишком большого количества объектов может привести к исключению OutOfMemoryException.
  • Поплавки не точны

...и так далее. Я уверен, что опытные люди могут добавить к этому гораздо больше.

Какие правила следует соблюдать при использовании GDI+ или вообще любой графической библиотеки?

Один полезный совет на пост будет приятно. Спасибо.


person Community    schedule 18.08.2009    source источник
comment
Жесткие ограничения для значений XY в GDI+   -  person Agnel Kurian    schedule 12.08.2010


Ответы (7)


Создавайте объекты как можно позже (не выполняйте преждевременную оптимизацию/кэширование) и освобождайте их как можно раньше (вызов Dispose или перенос в оператор using, если IDisposable).

person Community    schedule 18.08.2009

Не избегайте использования неуправляемых вызовов, это может значительно ускорить работу, если все сделано правильно.

person Community    schedule 18.08.2009

Будьте осторожны при преобразовании между логическими/экранными координатами. Если сделать это в неподходящее время, вы можете потерять точность и получить взамен неприятные артефакты рисования.

Последний раз, когда меня это укусило, я пытался вычислить новую точку в логических координатах; хотя они уже были близки к пределу точности, поэтому новая точка была не совсем такой, какой можно было бы надеяться. Преобразование раньше исправило это.

Можно получить аналогичную проблему, если слишком рано преобразовать в экранные координаты, хотя API, который позволяет вам передавать ему координаты с плавающей запятой (что делает GDI+), как правило, гораздо более устойчив к этому.

person Community    schedule 18.08.2009

Не рисуйте больше, чем нужно.

Как правило, операции рисования обходятся дороже, чем другие вычисления, которые вы будете выполнять (особенно в GDI+, который является хорошим API, но не самой быстрой библиотекой рисования). Потратить немного больше времени на собственный код, чтобы избежать ненужных операций рисования (например, рисовать одно и то же более одного раза), часто стоит того.

person Community    schedule 18.08.2009

GDI Gotchas, которые обожгли меня несколько раз.

  • Клон не клонирует() базовый клон данных (Rectangle, PixelFormat). Поэтому, если вы избавляетесь от clone(), исходный объект становится непригодным для использования. Используйте new Bitmap(), если вам нужны два отдельных растровых изображения.
  • Если вы загружаете изображение FromFile, этот файл блокируется до тех пор, пока растровое изображение не будет удалено (даже не может быть прочитано).
  • При использовании DrawImage не забудьте установить SmoothingMode, InterpolationMode и PixelOffsetMode, иначе вы будете удивлены низким качеством изображения.
person Community    schedule 20.08.2009

Строго не проблема GDI+, но помните об этом, чтобы сэкономить несколько часов отладки:

Одна ошибка, которую я слишком часто совершал при использовании GDI+ в .NET, заключается в вызове методов Matrix для свойства Transform объекта Graphics. Пример (в С++/CLI):

g->Transform->Translate(100.0f, 250.0f);    // WRONG. Will not have any effect.

Метод получения свойства Transform возвращает только копию матрицы. Таким образом, любые методы, вызываемые для этой копии, не повлияют на значение графического преобразования. Чтобы управлять преобразованием графики, вызовите один из методов-оболочек (MultiplyTransform, TranslateTransform, ScaleTransform и т. д.), как показано ниже.

g->TranslateTransform(100.0f, 250.0f);
person Community    schedule 20.10.2009

Будьте осторожны при использовании регионов: http://steveperks.com/post/Fun-With-GDI2b-Bugs.aspx

person Community    schedule 15.02.2010