Как рисовать в C # / WinForms с приличной скоростью? - PullRequest
3 голосов
/ 27 августа 2009

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

Graph # поставляется с красивым визуализатором, но мне он не нравится, потому что он написан на WPF (в то время как мое приложение - WinForms), и потому что я хочу добавить еще несколько параметров интерактивности, которые потребуют переделки об этом все равно.

Графики, которые я рисую, обычно будут довольно большими, примерно с 100 вершинами и таким же количеством ребер (графы будут деревьями в 99% случаев). Это означает, что результирующий рендеринг может быть до 2000px к 2000px и даже больше. Пользователи должны иметь возможность увеличивать и уменьшать масштаб, прокручивать, выделять и перетаскивать вершины и ребра, а также получать всплывающие окна с дополнительной информацией при наведении курсора на вершину.

Я беспокоюсь, что стандартный System.Drawing не сможет обеспечить приличную скорость для этого. Я бы хотел, чтобы операции перетаскивания / масштабирования / прокрутки были плавными, а всплывающие окна должны открываться с небольшой анимацией. Нечто вроде 20fps должно быть необходимостью.

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

Что ты думаешь?

Ответы [ 3 ]

5 голосов
/ 27 августа 2009

«Преждевременная оптимизация - корень всего зла»

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

Я сделал тысячу полигонов на растровом изображении 1000x800 пикселей и полностью перерисовал его со скоростью более 100 кадров в секунду, используя только GDI +

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

1 голос
/ 27 августа 2009

Я рекомендую оставить Graph # один и просто разместить его в своем приложении Windows Forms .

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

0 голосов
/ 27 августа 2009

GDI + будет достаточно быстрым для того, что вы делаете, особенно если (как это звучит из вашего описания) все, что вы рисуете, это прямоугольники и вертикальные / горизонтальные линии. Полигоны и нелинейные формы немного медленнее, но не сильно (разница в скорости частично зависит от SmoothingMode вашего объекта Graphics). Рисование кэшированных растровых изображений с изменением размера также происходит довольно быстро, хотя может значительно замедлиться, если вы используете высококачественный параметр InterpolationMode.

В качестве эталона я написал GPS-приложение .Net Compact Framework для Windows Mobile, которое отображало на экране около 10 000 строк в реальном времени. Это позволило достичь частоты кадров всего в несколько кадров в секунду, но вычислительная мощность смартфона, конечно, намного ниже, чем у современного ПК.

...