Разумно ли создавать приложение OpenGL C # для замены GDI? - PullRequest
3 голосов
/ 24 августа 2009

Я разработал довольно большое приложение с использованием MFC. Естественно, я использовал GDI для рисования, CCmdTarget для маршрутизации событий и архитектуру просмотра документов. Это был удобный путь развития.

Теперь клиент заинтересован в преобразовании этого приложения в .Net. Я бы предпочел (и они тоже) написание нового продукта на C #.

Приложение отображает и взаимодействует с тысячами графических объектов, поэтому Я полагал, что использование GDI +, хотя кажется естественным, может вызвать проблемы с производительностью, Так что я думаю об использовании OpenGL, в частности - OpenTK - в качестве графической библиотеки (это 2D).

Я знаю, что OpenGL работает иначе, чем эти API-интерфейсы Windows, которые полагаются на Invalidation части экрана. OpenGL имеет цикл рендеринга, который постоянно рисует на экране.

Мой вопрос: Это приемлемый путь, думая о:

  • производительность - потребуются ли пользователям специальные видеокарты (аппаратные средства). Это интенсивная графика, но это не высококачественная игра

  • печать и предварительный просмотр - сложно ли это достичь?

  • множественный выбор и контекстные меню

Хорошо ли подходит эта библиотека для оконных форм?

Ответы [ 5 ]

7 голосов
/ 24 августа 2009

Я так не думаю. Используйте WPF, если можете, или DirectX, если не можете.

Я знаю, что это может быть нечестно, но если я программирую на .NET (Microsoft) на Windows (Microsoft), я бы предпочел использовать DirectX ... который также от Microsoft.

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

4 голосов
/ 01 сентября 2009

По моему опыту разработки CAD-подобного программного обеспечения, преимущества OpenGL и DirectX заключаются в быстром тестировании глубины, плавном вращении и панорамировании, освещении и мощных текстурах. Очевидно, что есть и другие преимущества, но, несмотря на то, что большинство руководств заставят вас поверить, внедрение системы рендеринга с использованием любого из этих API-интерфейсов является значительным мероприятием и не должно восприниматься как легкое.

В частности:

  • Если это 2D-приложение, и оно уже реализовано в GDI, то переключение на GDI + будет намного проще. Кроме того, на современном оборудовании 2D GDI или GDI + могут быть примерно такими же быстрыми, как 2D OpenGL или DirectX. И, в конечном счете, конечный пользователь, вероятно, не заметит разницы, особенно с поддержкой двойной буферизации в GDI +.

  • Вы не нуждаетесь (и, вероятно, не хотите) в непрерывном цикле рендеринга для своего приложения. В OpenGL и DirectX вы можете явно аннулировать окно при изменении вашей сцены.

  • Если вы используете OpenGL или DirectX, вам нужно рассмотреть возможность помещения ваших объектов в списки отображения или массивы вершин (буферы) для быстрого рисования. Это не сложно, но управление объектами таким образом добавляет сложности системе и, скорее всего, существенно изменит архитектуру вашей системы рендеринга.

  • Печать в OpenGL или DirectX также может быть утомительной. С одной стороны, вы можете отобразить растровое изображение и распечатать его. Однако для изображений высокого качества вам могут потребоваться векторизованные изображения, которые трудно получить с помощью любой из этих платформ рендеринга.

  • Я бы также не стал писать GUI-интерфейсы в OpenGL или DirectX ... если вы действительно не ищете вызов; ~)

  • Наконец, и это просто раздражает с точки зрения установки, библиотека времени выполнения Managed DirectX, которую необходимо установить на компьютере пользователя, составляет около 100 МБ.

0 голосов
/ 04 августа 2012

Вы также можете использовать TAO framework в качестве альтернативы OpenTK.

0 голосов
/ 01 января 2010

Direct X и Open GL намного быстрее, чем GDI +.

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

У меня нет опыта работы с C #, но я однажды построил систему слоев для программы рисования, которая использовала openGL для рендеринга.

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

...