thedeemon: (office)
[personal profile] thedeemon
Коробочный продукт, над которым сейчас работаю, подошел к стадии частной беты. Пишется он на D с гуем на DlangUI. Это довольно обширная кроссплатформенная библиотека (под 50к строк), и, линкуясь с ней, у меня не было уверенности, что в мой бинарник не попадет какой-нибудь ненужный слон. Сейчас главный ехе-шник у меня имеет размер 2.2 МБ. Вспомнил про онлайн утилиту Владимира Пантелеева TreeMap Viewer, сунул туда свой .map файл и получил красивую интерактивную карту. Довольно познавательно. Слонов не обнаружил, есть некоторое количество зайцев, но они небольшие, не жалко. Оказалось, что из тех 2.2 МБ две самых больших части, почти одинакового размера по 800+ КБ, это dlangui и Phobos, стандартная библиотека. Весь рантайм занял около 380 КБ, из которых GC всего 24, а остальное про исключения, рефлексию, массивы, форматирование строк, ну и C runtime, конечно. Очень много кода посвящено поддержке юникода. В целом, я доволен. Не то, чтобы размер имел большое значение, но все же приятно, когда общий размер распространяемых бинарников получается на порядок меньше чем с каким-нибудь Qt при схожей функциональности. И к вопросу о "языках с рантаймом".

Date: 2016-03-04 07:53 am (UTC)
From: [identity profile] yantayga.livejournal.com
Выглядит привлекательно.
А что там в DlangUI с красивостями интерфейса, типа градиентов на окнах (не картинками) и как оно по скорости?

Date: 2016-03-04 08:30 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Эта библиотека не использует нативных контролов и все рисует сама, поэтому там все максимально настраиваемо, как скажешь, так и нарисует. Хочешь градиент в фоне окошка или контрола - пожалуйста, просто помести в нужное поле подходящий Drawable объект, который умеет этот градиент нарисовать когда попросят. Например, если присмотреться на скриншотках к кнопкам, видно, что они градиентные. Это делается показом растягиваемых 9 patch картинок (подход взят из Андроида). За низкоуровневую отрисовку отвечает бэкэнд, коих там несколько на выбор - можно OpenGL, можно SFML, можно WinAPI/GDI. У меня продукт виндовый, я не стал на OpenGL полагаться, использую WinAPI бэкэнд. Скорости вполне хватает, тормозов не видно.

Date: 2016-03-04 08:37 am (UTC)
From: [identity profile] yantayga.livejournal.com
А встраивание ActiveX оно поддерживает?
Так как аналога QTшного Phonon по видимому нет (или не нашел в документации), то видимо для воспроизведения видео/аудио придется юзать или DirectShow или Flash…

Date: 2016-03-04 10:02 am (UTC)
From: [identity profile] thedeemon.livejournal.com
"Встраивание" обычно заключается в создании окошка и получении его hwnd, это тривиально. У меня тут как раз DirectShow используется, продукт про обработку видео. Правда, в моем случае все не так прямо делается, вся работа с DirectShow вынесена в отдельный процесс.

Date: 2016-03-04 10:44 am (UTC)
From: [identity profile] yantayga.livejournal.com
Спасибо!

Осталось выучить D и переписать все на нем :)

Date: 2016-03-04 03:42 pm (UTC)
From: [identity profile] gineer.livejournal.com
а фоновые картинки ака скины

еше -- сложные виджеты типа таблиц ;)

Date: 2016-03-04 03:52 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Картинки фоном легко там ставятся в любой виджет. Есть встроенная поддержка тем с переключением в рантайме без перезапуска приложения. Таблицы есть (на скриншотах по ссылке видно что-то экселеподобное), но не слишком навороченные.

Date: 2016-06-08 12:52 pm (UTC)
From: [identity profile] yantayga.livejournal.com
Что то я никак не въеду как этот самый бекенд сменить с опенгл на нативный виндовый...

Date: 2016-06-08 02:42 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Там есть волшебный флаг USE_WIN32. Его надо добавить, а USE_OPENGL и другие USE_* убрать.
При сборке библиотеки Dub'ом надо убедиться, что в dub.json он передается. Я в раздел "configurations" в ту, что содержит "name": "minimal", записал
"versions-windows": [ "Unicode", "USE_WIN32"],
"versions": [ "EmbedStandardResources", "USE_WIN32"]

И потом собирал командой
dub build --build=release --config=minimal

Дальше ссылался на сгенеренный lib файл из своего проекта, который у меня без даба собирается. Если же проект собирается дабом, то при упоминании dlangui там надо указать нужную конфигурацию:
  "subConfigurations": {
    "dlangui": "minimal"
}

Date: 2016-06-14 08:29 am (UTC)
From: [identity profile] yantayga.livejournal.com
Да я без dub пытаюсь, а VisualD...
Будем смотреть, куда там это флаг

Date: 2016-03-04 10:56 am (UTC)
From: [identity profile] sober-space.livejournal.com
Да, хорошая гуя это боль. Я все себя успокаиваю, что мол "все делать надо на хтмл и скоро так все и будет", но как-то не сильно успокаивается. Хочу легкую, кроссплатформенную гую.

Date: 2016-03-06 09:49 am (UTC)
From: [identity profile] pravic ehysta (from livejournal.com)
> Хочу легкую, кроссплатформенную гую.

Таких много (было) разных, из кросс-платформенных мне в своё время нравился fox-toolkit из-за легвовесности и нативных контролов, wxWidgets — тяжелее, но качественнее, хотя в последнее время развитие у них снизило темпы (субъективно) по сравнению с тем же Qt.

А сейчас "подсел" на Sciter — легковесный html/css UI с интересными плюшками. Использовал его ещё как HTMLayout, это был ну очень легкий рантайм и гибкая интеграция, а сейчас он стал ещё удобнее со скриптами и интеграцией с нативной графикой/видео/directx, да и мультиплатформенным стал. Ещё бы OpenGL-бэкенд ему, вообще шикарно стало бы.

Date: 2016-03-06 09:51 am (UTC)
From: [identity profile] pravic ehysta (from livejournal.com)
Кстати, под Sciter есть binding'и и под D, и под С#/Delphi/Python, но качество под сомнением.

Date: 2016-03-06 10:12 am (UTC)
From: [identity profile] sober-space.livejournal.com
Sciter выглядит хорошо, концептуально правильно. Но все-таки я жду такого момента, когда поддержка html/css gui будет во всех операционках родная. Т.е. чтобы вся тяжеловесность шла уже с операционкой.

Date: 2016-03-06 12:12 pm (UTC)
From: [personal profile] zaharchenko
А сейчас она какая?

Date: 2016-03-06 12:21 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Видимо, правильный ответ такой: ее просто нет. Т.е. нет поддержки десктопных html/css приложений, доступной кроссплатформенно. Если не считать таковой предустановленный браузер, а я не считаю.

Date: 2016-03-06 03:23 pm (UTC)
From: [personal profile] zaharchenko
Почем не считаете? Где начинаете поддержка html в OS?

Date: 2016-03-06 03:38 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Я говорил не о поддержке html в OS, а о поддержке десктопных html-приложений в OS. А она начинаете там, где есть кроссплатформенная C-библиотека для взаимодействия с DOM, видимо так. Причем имеющая доступ не только к DOM конкретного окна приложения, но и трея, всяческих доступных по умолчанию панелей рабочего стола и т.п.

Date: 2016-03-04 11:16 am (UTC)
From: [identity profile] fas-tm.livejournal.com
А мне вот приглянулась https://github.com/ocornut/imgui
не знаю есть ли для D биндинги.

Date: 2016-03-04 04:53 pm (UTC)
From: [identity profile] binf.livejournal.com
выглядит кошерно

Date: 2016-03-04 04:53 pm (UTC)
From: [identity profile] binf.livejournal.com
гут. сколько примерно времени длится полная сборка самописного кода, когда все зависимости вытянуты?

Date: 2016-03-04 05:31 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
7 секунд. Компиляция и линковка.

Date: 2016-03-04 05:48 pm (UTC)
From: [identity profile] binf.livejournal.com
вау!
Вы ещё рефлексию упомянули, много её? в смысле в D
Edited Date: 2016-03-04 05:57 pm (UTC)

Date: 2016-03-04 07:52 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Тут стоит пояснить, что это время полной сборки моего проекта: компилятору даются пути к библиотекам, и он их парсит, но там где это возможно исполняемый библиотечный код каждый раз не генерит, берет из предварительно созданного .lib файла. Т.е. в эти 7 секунд входит разбор десятков тысяч строк, но кодогенерация лишь из нескольких тысяч.

Рантайм-рефлексия в D не очень популярна, используется в основном при кастах между родственными классами, при создании объектов по имени класса, да еще в нескольких местах. Зато развитая компайл-тайм рефлексия это фирменная фишка языка, ее используют активно. Их сочетание позволило dlangui легко заиметь DML - аналог QML. Потом еще отдельно напишу о ее применении, например, как делал смарт поинтеры, автоматически проверяющие коды возврата.

Date: 2016-03-04 08:41 pm (UTC)
From: [identity profile] binf.livejournal.com
Да, я именно это имел ввиду

Ну рантайм-рефлексия - это не то что может кому-то понравится. Способность D решать проблемы без неё огромный плюс. А то в F# я даже json не могу нормально перегонять без рефлексии, и это ужасно.

И пропертибиндинг есть, или в DML только константы можно вставлять в разметку?

Date: 2016-03-05 05:42 am (UTC)
From: [identity profile] thedeemon.livejournal.com
В DML пока лишь константы, вся динамика добавляется кодом.

Date: 2016-03-04 08:36 pm (UTC)
From: [identity profile] sleepy-drago.livejournal.com
смотрю на 120М исполняемого файла вышедшего при моем участии продукта и ... не хочу смотреть на картинки =)
А про ui там в новых вин win32/gdi поломали так что на 4к разрешении будет тормозить. Поиграетесь и сделаете себе правильный бэкенд =)

Date: 2016-03-18 02:39 pm (UTC)
From: [identity profile] yantayga.livejournal.com
А что вы посоветуете, как человек, видимо, уже прошедший по граблям в D, с чего начать изучение D?

Date: 2016-03-18 05:27 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Самая доступная (в нескольких смыслах) книжка для знакомства с языком есть тут:
http://ddili.org/ders/d.en/index.html (я, правда, подряд читать ее не пытался)

Мне в свое время очень-очень понравилась книжка Александреску The D Programming Language. Она в паре мест может быть устарела или отклоняется от современной версии, но на 95% остается актуальной, при этом очень здорово написана, приятно почитать. Могу поделиться электронной копией, если надо.

Следующим шагом весьма полезен этот материал:
https://github.com/PhilippeSigaud/D-templates-tutorial

Официальная документация по языку довольно разрознена, раскидана по куче страниц и статей на сайте, лучше с нее не начинать, но после некоторого первоначального знакомства с языком она уже становится понятной и даже полезной, в качестве справки.

Еще по https://wiki.dlang.org/ полезно полазить, открывая что покажется интересным.

Тем, кто как я проводит большую часть времени под виндой, рекомендую поставить VisualD - плагин для Visual Studio. Это не решарпер и не Visual Assist, конечно, но все ж довольно приятный, и всяко лучше того, что студия из коробки делает в С++.

Date: 2016-03-18 05:59 pm (UTC)
From: [identity profile] yantayga.livejournal.com
Спасибо огромное :)
А какой компилятор лучше? Например для совместимости с вышеупомянутой GUI библиотекой.
Edited Date: 2016-03-18 06:01 pm (UTC)

Date: 2016-03-18 06:12 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Распространено мнение, что в процессе разработки хорошо использовать DMD, т.к. он быстрее всех компилирует, а релиз собирать LDC или GDC - они трудятся дольше, но сгенеренный код часто процентов на 30 быстрее. Выигрыш по скорости нестабильный: иногда в разы быстрее, а иногда и медленнее получается. К тому же эти два обычно несколько отстают по версиям от DMD. Я бы посоветовал взять DMD, и только если ну очень нужно еще разогнать код, брать LDC, например.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 28th, 2026 07:13 pm
Powered by Dreamwidth Studios