Я много работаю с Visual Studio 2008, .NET C # 2.0-3.5 и Windows Forms, и я заметил, как и многие другие до меня, что GDI + чрезвычайно медленно рисует элементы управления. Обратите внимание , что я не очень много работаю с изображениями (JPG, GIF и т. Д.). Изображения только в виде значков в определенных местах. На самом деле это элементы управления / формы / и т. Д., Которые медленно рисуются.
Проблема в том, что вы можете видеть нарисованные элементы управления, и может потребоваться несколько секунд, чтобы нарисовать, казалось бы, простой набор элементов управления. То есть это отстает и ужасно.
Я провел тесты, в которых я просто наложил несколько меток (40-50) на форму, нажимая F5 для запуска и должен ждать, пока они будут нарисованы. Опять же, лаг и не очень приятный опыт.
Итак, есть WPF, который может решить эту проблему, но я / мы не готовы перейти на WPF. Поэтому я искал обходные пути или исправления, и я наткнулся на Direct2D и читал некоторые другие библиотеки.
Я немного озадачен, и вот такие вопросы:
1)
Во-первых, я хочу довольно аккуратный и простой способ просто заменить GDI + на что-то более быстрое и аппаратно ускоренное. Можно ли сделать это, не переходя в WPF и не переписывая весь мой код Windows Forms?
Всякий раз, когда я читаю что-либо в Direct2D, я вижу длинные блоки, как правило, ужасного кода C ++, рассказывающие о том, как вручную писать код для рисования. Я этого не хочу.
2)
Читая в сети, я наткнулся на SlimDX, но я не могу понять, как его использовать (и я признаю, что я не очень старался писать). Допустим, у меня уже есть GUI-приложение (Windows Forms, стандартный код C #) - могу ли я каким-то образом использовать SlimDX (или что-то в этом роде), чтобы просто «заменить» GDI + без особых переписываний?
Моя проблема в том, что я не могу найти какие-либо примеры или тому подобное, говорящие мне, возможно ли использовать SlimDX, Direct2D или другие подобные вещи в моем уже созданном программном обеспечении Windows Forms, и если это возможно - как это сделать.
Надеюсь, я не слишком пушистый =)
== РЕДАКТИРОВАТЬ == 2010-09-22
Я провел несколько тестов в своем реальном приложении и выделил одну из медленных вещей:
Когда я добавляю текст к некоторым меткам в UserControl, элементы управления изменяют свой размер, чтобы соответствовать тексту. Например, содержащий GroupControl немного адаптируется к размеру текста, который был только что добавлен к свойству .Text меток.
Существует около 10 элементов управления Label. При первом обновлении меток и, соответственно, изменении размеров, весь процесс занимает около 500 мс. Во второй раз, когда метки обновляются, и размер no изменяется, это занимает около 0 мс.
== РЕДАКТИРОВАТЬ 2 == 2010-09-22
Нашел одно из замедлений. Затем добавление строки в свойство Text будет медленным, если добавляемый текст отличается в строке length от текста, который был до обновления.
Я использую библиотеки DevExpress, и LabelControls можно установить в AutoSizeMode. Если я установлю это на «Нет», то отставание исчезнет при добавлении текста, длина которого отличается от предыдущего текста. Я предполагаю, что эта проблема будет такой же для обычного элемента управления Label, поскольку она также имеет параметр AutoSize = true / false.
Тем не менее, это "обходной путь", но все же подтверждает мою точку зрения - он очень медленный при изменении размера, что довольно хромает.