Средства построения графиков для.NET. Компиляторы, утилиты, графические библиотеки

24.04.2019 Мониторы

Code::Blocks - свободная кроссплатформенная среда разработки. Code::Blocks написана на С++ и использует библиотеку wxWidgets. Имея открытую архитектуру, может масштабироваться за счёт подключаемых модулей. Поддерживает языки программирования С, С++, D (с ограничениями).

ConTEXT - бесплатный многооконный текстовый редактор с подсветкой синтаксиса основных популярных языков программирования, таких как C/C++, Delphi/Pascal, FORTRAN, 80x86 assembler, Java, JavaScript, Visual Basic, Perl/CGI, HTML, SQL, Python, PHP и т.п. Редактор может подключать внешние инструменты для компиляции или интерпретации исходного кода.

Eclipse - свободная интегрированная среда разработки модульных кроссплатформенных приложений. Развивается и поддерживается Eclipse Foundation.

Наиболее известные приложения на основе Eclipse Platform - различные «Eclipse IDE» для разработки ПО на множестве языков (Java, C/C++).

GTK+ (сокращение от GIMP ToolKit) - кроссплатформенная библиотека элементов интерфейса, имеет простой в использовании API, наряду с Qt является одной из двух наиболее популярных на сегодняшний день библиотек для X Window System.
Будучи изначально частью графического редактора GIMP, она развилась в отдельный проект и приобрела заметную популярность. GTK+ - свободное ПО, распространяемое на условиях GNU LGPL, позволяющей создавать как свободное, так и проприетарное программное обеспечение с использованием библиотеки. GTK+ является официальной библиотекой для создания графического интерфейса проекта GNU.

Konva.js - это JavaScript библиотека, которая добавляет интерактивность в HTML5 элемент canvas. Позволяет добавлять различные фигуры на холст, использовать для них обработчики событий, перемещать эти фигуры, изменять их масштаб, а также вращать, независимо друг от друга. Таким образом, поддерживается высокая производительность анимации, даже при большом количестве объектов.

Lazarus - свободная среда разработки программного обеспечения для компилятора Free Pascal на языке Object Pascal. Интегрированная среда разработки предоставляет возможность кроссплатформенной разработки приложений в Delphi-подобном окружении. На данный момент является единственным инструментом быстрой разработки приложений (RAD), позволяющим Delphi-программистам создавать приложения с графическим интерфейсом для Linux (и других не-Windows) систем.

MinGW (англ. Minimalist GNU for Windows), ранее mingw32, - компилятор, нативный программный порт GNU Compiler Collection (GCC) под Microsoft Windows, вместе с набором свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. MinGW позволяет разработчикам создавать нативные приложения Microsoft Windows. В MinGW включены расширения для библиотеки времени выполнения Microsoft Visual C++ для поддержки функциональности C99 (современный стандарт языка программирования Си).

Система PascalABC.NET является совместной разработкой российских и немецких программистов, активно используется в ряде средних и высших учебных заведений России и ближнего зарубежья как основной язык для обучения студентов направления "Информационные технологии".

Ниже рассмотрены библиотеки на C/C++, которые могут быть использованы в основе разработки библиотеки для генерации 2D финансовых графиков и индикаторов технического анализа.

Основными требованиями являются:

  • Наличие C/C++ API.
  • Наличие адекватной документации с примерами.
  • Наличие Python-пакета для экспериментов.
  • Относительно высокая скорость работы Python-пакета при рисовании >30000 линий.
  • Правильная работа со шрифтами, поддержка пиксельных шрифтов и возможность отключения сглаживания.

Итог к рассмотрению:

  • Pillow для работы в Python — быстрый, наличие документации.
  • gMagick++ или Magick++ для расширения C/C++ — быстрые, хорошо документированы на сайте ImageMagick.
  • SKIA или Cairo для работы с векторной графикой.

GraphicsMagic (Magick++)

Расширение для C++ форка GraphicsMagick библиотеки ImageMagick. С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах. В отличии от родителя (IMagick) разработчики делают упор на производительности, оптимизации и безопасности.

Python-пакет PgMagick может работать как с GraphicsMagick, так и с ImageMagick. Библиотека интегрирована в Python с помощью Python-Boost. В отличие от Wand-Py работает в десятки раз быстрее, но при этом имеет худшую документацию для Python (надо все искать в документации C++-расширения Magick++).

ImageMagick (Magick++)

Расширение для C++ популярной библиотеки ImageMagick (IMagick). С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах.

Wand-Py работает крайне медленно по сравнению с Pillow (форк стандартной библиотеки PIL для Python). Не удалось решить проблемы со шрифтами (добавляет сглаживание и размытие).

Cairo

Библиотека написанная на C для рендеринга векторной графики. Содержит функции для рисования двумерных изображений. Преимуществом отмечается (на форумах) хорошая документация. Работает медленнее SKIA (есть сравнение в интернете).

SKIA

Графическая библиотека написанная на C++ для рендеринга векторной графики. Используется в Google Chrome, Chrome OS, Mozilla Firefox, Android. Поддерживается Google. Куцая документация, но есть примеры. По сравнению с Cairo работает быстрее.

AGG (Anti-Grain)

Библиотека растровой графики написанная на C++. Последняя версия выпущена в 2006 году. Есть предположение, что данная библиотека лежит в основе PIL для Python (и Pillow).

C++, как и Python и многие другие языки программирования, поставляются без встроенных инструментов построения графического интерфейса пользователя. Так было и до середины 80-х, когда операционные системы для PC разрабатывались без этого типа интерфейсов, и даже после того, как Windows и различные операционные системы от Apple стали нормой, и событийно-ориентированному программированию потребовалось несколько дополнительных лет, чтобы наверстать упущенное.

Тридцать лет назад весь ввод/вывод был сделан на символьных дисплеях. Так было до начала 90-х, когда появились первые графические библиотеки. С тех пор Mac OS (и в меньшей степени Linux) выросла по важности по сравнению с Windows, что делает более привлекательными инвестиции в создание программного обеспечения, которое может работать на всех трех платформах без необходимости переписывать код

Без кроссплатформенных инструментов, вы должны были бы существенно переписать код для любой другой платформы только лишь для того, чтобы организовать обработку ввода/вывода и взаимодействие с пользователем. В то же время, графика на каждой операционной системе выполняется совершенно по-разному. Кроссплатформенные инструменты до некоторой степени защитят вас от этих различий и странностей.

Вам может никогда не понадобиться портировать ваше Windows приложение на Mac или Linux, но, по крайней мере, вы будете знать, что можете сделать это. В этом списке мы рассмотрим пять кроссплатформенных инструментов разработки GUI, которые написаны на C++ и все еще находятся в стадии активного развития. Пятерка, которую я выбрал, это Qt, wxWidgets, JUCE, CEGUI и CEF (некоторые другие, особенно GTK, MFC и Cocoa, не включены в список, так как они не полностью кроссплатформены).

Qt, один из старейших фреймворков, которому сейчас 21 год. Ранее принадлежал компании Nokia, текущий владелец - финская компания Qt Company. Платформа имеет лицензию, как свободное ПО с открытым исходным кодом, а также доступны версии Indie Mobile, Professional и Enterprise, начиная от $79 в месяц.

Этот старый фреймворк открыл себя заново со своей новой версией, Qt 5, которая используется везде, ото мобильных приложений до автомобилей и медицинского оборудования . Одним из его преимуществ является оконная системя, которая позволяет вам создавать пользовательские интерфейсы и включает в себя дополнительные функции, такие как отображение диаграмм, визуализация данных и карт от сторонних провайдеров. Qt версии 5 теперь обрабатывает прикосновения так же, как и взаимодействие с мышью и клавиатурой, и вы можете добавить виртуальные клавиатуры на X11 и Windows. На KDE Linux Qt является нативной библиотекой GUI, поэтому, если вы разрабатываете для KDE платформ, то вам следует рассмотреть Qt.


Разработчик Джулиан Смарт создал wxWidgets 24 года назад (что делает его старше, даже чем Qt) и остается его главным разработчиком. Эта библиотека во многом похожа на Qt, хотя некоторые разработчики предпочитают ее, так как она использует родные графические элементы операционной системы, на которой запущена программа. Это заставляет приложения выглядеть более «родными»; например, на Windows, она будет использовать Windows графику.

(Для сравнения, Qt отрисовывает свои собственные виджеты на каждой платформе, хотя и старается выглядеть как можно ближе к платформе, используя некоторый низкоуровневый код для отрисовки полос прокрутки и кнопок.)

JUCE

Данная кроссплатформенная библиотека с открытым исходным кодом использует аналогичную лицензию, что и Qt. Она фокусируется на кроссплатформенных аудио, интерактивных, встроенных и графических приложениях.

Первоначально разрабатываемая британским разработчиком Жюлем Сторером, была приобретена компанией Raw Material Software, которая разрабатывает аудиопродукцию. В результате, JUCE обладает большим количеством функциональных возможностей при работе с аудио, поскольку она изначально разрабатывалась для создания аудиоприложений.

Библиотека JUCE также включает в себя множество графических элементов пользовательского интерфейса, графику, аудио, парсинг XML и JSON, работу с сетью, криптографию, многопоточность и встроенный интерпретатор, который работает с синтаксисом, имитирующим ECMAScript. Это уменьшает или устраняет необходимость в сторонних библиотеках и проблемы с зависимостями, которые те могут вызвать. Нет ничего ужаснее, чем обновление сторонних инструментов, которое ломает сборку проекта.

JUCE также включает в себя “introjucer”, инструмент IDE, который может генерировать проекты Xcode, проекты Visual Studio, Linux Makefile, сборки Android Ant и проекты CodeBlocks.

CEGUI

Crazy Eddie GUI (GUI сумасшедшего Эдди) разрабатывается, начиная с 2003 года, и вполне возможно, версия 1.0 выйдет уже к 2020 году, поскольку текущая версия 0.87. Как и другие в этом списке, она работает на Windows, Linux и Mac и поддерживает и 64, и 32-битные системы. В отличие от остальных GUI библиотек в этом списке, она фокусируется на разработке игр, но, как говорилось, дает разработчику пакет виджетов (кнопки, выпадающие списки и т.д.), поэтому вы не ограничены только игровыми приложениями.

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

Конфигурация CEGUI также широко использует XML файлы. Они служат не только для настройки скинов (то есть, как выглядят элементы управления, общая цветовая схема и т.д.), для всего остального, такого как анимация, изображения, компоновка и схема управления файлами данных игры. Все они опираются на XML.

CEF

Chromium Embedded Framework - это простой фреймворк для встраивания браузеров на базе Chromium в другие приложения. Это отличает его от других библиотек C++ в списке, которые предназначены для создания автономных приложений. Вы могли не слышать об этом, но согласно документации , существует более 100 миллионов экземпляров CEF, встроенных во множество продуктов. CEF уже 8 лет, и он дорос уже до версии 3.

Интеграция в браузер Chrome позволяет получить доступ к JavaScript, ускорению GPU через WebGL, рендерингу в закадровую память и, в ближайшее время, к речевому вводу

Заключение

Хотя все эти библиотеки написаны на C++, доступно множество привязок языков, поэтому стоит проверить, какие языки программирования вы можете использовать с ними. wxWidgets особенно хорош в этом отношении, как и Qt, который используется в нескольких специализированных операционных системах и автомобильном ПО. Qt кажется более популярным на предприятиях, по-видимому, из-за платной поддержки, в то время как ученые и независимые разработчики предпочитают wxWidgets, поскольку он бесплатен и соответствует Qt.

И Qt, и wxWidgets охватывают много одинаковых областей, и это, возможно, случай для выбора в зависимости от личного предпочтения. Оба фреймворка имеют множество сторонних инструментов для упрощения разработки.

Не так давно пришлось столкнуться с тривиальной задачей - найти решение, которое позволит рендерить рисунки графиков для.NET. Сразу оговорюсь, что меня интересовали только линейные графики. Камнем преткновения, который подтолкнул к переделыванию уже существующего решения (это были графики, встроенные в rdlc отчеты), было быстродействие. В целом, к искомому решению были предъявлены такие требования:

  1. Необходимо оставить данную оптимизацию незамеченной для конечного пользователя, следовательно, решение должно быть широко настраиваемым, чтобы, в конечном счете, выглядеть так же, как и предшественник.
  2. Работать быстро (ну понятно, пользователи не любят ждать).
  3. Желательно, быть бесплатным или с открытым исходным кодом. Покупка не стала бы большой проблемой, найди я отличное платное решение, но начать лучше с open source.
Что было сделано?
Погуглив, выяснилось, что существует достаточно много вариантов для решения данной задачи, и все они достаточно сильно отличаются по многим параметрам (размер сообщества, скорость работы, удобство). В процессе выбора решения было опробовано 8 бесплатных вариантов:


Ещё в самом начале я решил, что надо собрать как можно больше вариантов в одном месте и протестить их на быстродействие, а уже после этого было очень жалко выбрасывать в корзину проделанную работу. Поэтому было решено оформить эту статейку и выложить то, что получилось, на GitHub . Таким образом, если возникла необходимость, Вы можете настроить каждое решение под себя и сразу же его проверить. Лично мне очень не хватало такой статьи в начале. Может быть, исходники вызовут улыбку у гуру, но новичкам, которые только вникают в.NET и ASP, они однозначно будут очень полезны.
Для сравнения скорости работы берутся дефолтные настройки графика, указывается разрешение выходного рисунка и ему скармливается фиксированное количество точек. Каждое решение прогоняется несколько раз, и в качестве реальной скорости берется среднее. Опять же, это достаточно субъективно, и, если Вы можете предложить более красивый подход, я с интересом выслушаю.
На моем ПК (Intel Core I5 3.10 GHz, 8gb ОЗУ, Windows 7 x64) вышло следующее распределение скорости работы:

Решение
Количество итераций
Суммарное время (сек)
Среднее время на одну итерацию (сек)
1
Dislin charts
5
1.9071907
0.38143814
2
Zed Graph
5
2.750275
0.550055
3
NPlot
5
3.1833183
0.63666366
4
Web Chart Control
5
5.130513
1.0261026
5
Microsoft Chart Controls
5
6.8456845
1.3691369
6
Oxy Plot
5
7.0067006
1.40134012
7
Open minded plot
5
8.257
1.6514
8
Google Sharp charting
5
9.8049804
1.96099608

Для различных входных параметров (разрешение изображения, количество точек на графике, параметры ПК, скорость интернета, фаза Луны и т.д.) результаты немного отличаются, поэтому Вы можете протестировать быстродействие у себя.
Я специально не делал глубокое сравнения фич и возможностей кастомизации, так как это довольно субъективная информация, которая сильно зависит от конкретной задачи. При необходимости, каждый желающий может провести полчаса, подебажить, посмотреть архитектуру решений, прикинуть, насколько легко их настроить под конкретные требования.
Если кто-то знает ещё бесплатные решения для графиков под.NET, которые пропущены в статье, - пишите в комментариях, и я постараюсь их добавить.

В один из моментов, я задался вопросом как мне вывести графику используя C++ (С). Я не хотел использовать такие популярные среды Builder или MS Visual с их библиотеками окон. Мне была нужна просто библиотека для работы с простой графикой в консоли .

Если судить по запросам в интернете и на форумах, этот вопрос возникал не только у меня.

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

Список библиотек

1. WinBGIm — портированная «старая» библиотека от компании Borland для Windows . Изначально она разрабатывалась для отображения графики под DOS.

2. Cairo — библиотека под лицензий GNU, поддерживается многими языками программирования (Delphi, Factor, Haskell, Lua, Perl, PHP, Python, Ruby, Scheme, Smalltalk и т.п. ). Также поддержка большого количество операционных систем.

3. SDL — кроссплатформенная мультимедийная библиотека под лицензий GNU реализующая единый программный интерфейс к графической подсистеме , звуковым устройствам и средствам ввода для широкого спектра платформ.

Данная библиотека активно используется при написании кроссплатформенных мультимедийных программ (в основном игр). Поддерживается большим количеством языков программирования (C, C++, C#, VB.NET, D, Ada, Vala, Eiffel, Haskell, Erlang, Euphoria, Java, Lisp, Lua, ML, Pascal, Perl, PHP, Pike, PureBasic, Python и Ruby ) и операционных систем (Linux, Microsoft Windows, Mac OS X, iOS и Android ).

Из интересной особенности библиотеки, она позволяет работать с джостиком , CD-ROM и сетью.

4. SFML — простая и быстрая кроссплатформенная мультимедийная библиотека, доступная на языках: С++, C, D, Java, Python, Ruby, OCaml, .Net и Go. Является объектно ориентированный аналог SDL . Позволяет работать с аудио , сетью и окнами .

5. Allergo — кроссплатформенная библиотека позволяющая работать с 2D графикой, аудиофайлами, окнами, файловой системой, 3D графикой. Помимо этого библиотека предоставляет дополнительные функции по работе с числами с фиксированной, плавающей запятой и матрицами.

Изначально создавалась для разработки игр под Atari (Allergo расшифровывается как Atari Low-Level Game Routines), сейчас библиотека поддерживается языками: C , C++ , Pascal, Python, Lua, Scheme, D, Go, Ada, Lisp, Mercury, Perl, Scheme. Есть поддержка под следующие платформы: Windows , macOS , Unix -подобные системы, Android и iOS .

6. SKIA — компактная графическая библиотека. Её использует в Google Chrome, Chrome OS, Chromium OS, Mozilla Firefox, Android (до 3.0), Firefox OS и Sublime Text 3. Библиотека работает на С и Python .

7. OpenGL (или glut) —библиотека на которой основываются некоторые из выше указанных. Я заявил о ней в самом конце списка, т.к. многие о ней слышали и она достаточно мощна для простых задач вроде 2D графики, но реализовывать она это может. Точнее даже сказать, OpenGL это спецификация, т.е. набор правил описывающих интерфейс, а разработчик оборудования (видеокарты) на её основе разрабатывает библиотеку . Реализуется на большом количество операционных систем и языков программирования.