powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевод приложения на мультиплатформенность.
25 сообщений из 68, страница 1 из 3
Перевод приложения на мультиплатформенность.
    #39336554
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все это делается только для фана. Образования специального нет, погромистом нигде не работал.
Delphi Seattle. Из обвесов DDev и EurekaLogs 7.4 (кстати вот за эту я бы заплатил, оно того стоит. Может и куплю в итоге, 150$ не такие большие деньги. А вещь реально отличная).

Моего кода - 320к строк, включая PAX.

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

В двух словах текущая архитектура приложения:
Есть ядро, не привязанное ни к чему - логгер, конфиги, скрипты (внутренние и внешние), простейший кешер, абстрактная сетевая часть.
Есть надстройки под конкретные игры - дочерние классы, перекрытые классовые методы, сетевая часть, кешер, добавленные скриптовые методы и все такое.

Сначала я без спешки где-то год разделял тот монолит, который у меня был на ядро + надстройка. Попутно максимально отделял от основной части приложения логгер, скрипты и прочее - вобщем делал то, что по-хорошему изначально должно было быть. Попутно, начитавшись рекомендаций по переходу на малтиплаформенность от ЕМ, убирал явные косяки в коде - обращение к символу строки по индексу и прочее такое очевидное.
В это же время был переезд с PascalScript на Pax, именно из-за мультиплатформенности пакса, но этот ад достоин отдельного поста, потом распишу подробнее.
На этом этапе я еще не выносил код гуя из юнита формы в отдельный юнит, про это тоже позже.

Потом, на удивление легко и просто, через пару дней допиливания напильником скомпилировалось ядро под андроид. Пока только скомпилировал, ничего не запускал.
Споткнулся разве что об WaitForMultiple - работает только в Win, и это была большая засада.
Сделал банально:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  while (not Terminated) and Char_Started do
  begin           
    try
      WR := FEvents.WaitFor(10);
      case WR of
        wrTimeout : CommonTimerProc;
        wrSignaled: ExecEvents;
        wrAbandoned,
        wrError:    Break;
      end;
    except
      on E : Exception do
      begin
        ShowMessageMultiplatform(E.ClassName + ' : ' + E.Message);
        Break;
      end;
    end;
  end;


а в CommonTimerProc (который в дочерних классах перекрывается при нужде) перебирать уже всё.



Взялся за надстройку.

Из того, что явно запомнилось по коду:
1) Как я уже писал пару недель тому в соседней теме - Не надо использовать System.ByteString. Вообще. У меня вдруг после включения этих байтстрингов в десятка полтора юнитов в одном месте вылетела ошибка что-то там, мол приложение скомпилировано с неправильной версией юнита variants, хотя я таким не баловался никогда. Гугл не помог. Отказался от System.ByteString - и все нормально стало, хотя ByteStrings были для сиэттла.
Правильный, но тяжелый путь - переводить все на юникод. Для анси использовать
//bytes := TEncoding.ANSI.GetBytes(str); и //str := TEncoding.ANSI.GetString(bytes);
Вначале кажется, что оно неприменимо везде никак, все равно мол. останется куча мест. Ан нет, в итоге перекрыл все ими. Приноровиться надо, тогда все просто оказывается :)
2) Перевод всех TList; на TList<X>; Их было очень много (только в одном юните около 30). Особенно навеселился с компараторами. Но сделал. Оно конечно можно было бы не трогать, это (пока?) лишь warnings, но когда их столько - начинает напрягать.
3) Классическое TStringList.Add('xxx',TObject(some_record)); перевел все структуры в классы, нормально.
4) от ZEROBASEDSTRINGS, настоятельно рекомендуемого ЕМ, я отказался - делать аудит ВСЕГО кода я охренею. Это добавило чуток сложностей в плане того, что надо все время держать в памяти, что в стрингхелпере оно включено, а у меня нет - но это некритично.
5) куча всяких мелочей, типа неподдерживаемого ZDecompress с указателями в параметрах (оставили только с TBytes) и прочее.

Явно что-то забыл, спрашивайте.



Про FMX позже.

P.S. У нас тут суета и паника, уже завтра-послезавтра могут всех домой отправить, так что не до интернета несколько. Зима пришла на месяц раньше ожидаемого :(
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336573
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

софт-то что делает в общих чертах?
Только для внутреннего потребления?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336579
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миграция PascalScript => Pax.

PS, при всей его вылизанности - увы, не поддерживает ничего кроме Win в принципе. Пришлось переходить на Pax.
Ну и плюс Пакс поддерживает хелперы, классы в коде, overload, default param и прочее. Да и сам по себе движок очень мощный.

Вначале, прочитав что PaxProgram (компилятор в байт-код) работает намного быстрее, чем PaxInterpreter - начал заниматься им. Багов там не то, чтобы много - их там невероятное кол-во. Я вылизывал его две недели, и все равно, новые всплывали без конца и края.
Почему я сразу не стал использовать PaxInterpreter, который, собственно, и есть мультиплатформенный - вопрос без ответа.
В итоге перешел на него. Скорость поменьше, чем у PaxProgram - но мне с головой хватает. Багов, по сравнению с PaxProgram - крайне мало, и те скорее из-за невозможности протестировать автором всё. Вообще у меня сложилось ощущение, что с какого-то момента все внимание автора пакса уделялось только PaxInterpreter, а разработка PaxProgram была прекращена, а сам движок пакса развивался, фичи добавлялись - оттуда и все эти баги. Так, в комлекте идет, но работать с ним почти невозможно.
В PaxInterpreter'е тоже багов хватало, и потери от кривого перевода типов, и неправильное освобождение строк, а работа с массивами - это вообще что-то.

Потом выложу свой вариант исходников куда-то на гитхаб или еще куда. Предлагал автору, автор не захотел отвечать (хотя пару лет тому сквозь зубы пару строк выдал). Ну нет так нет.

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

Впилил в него полноценную отладку - получение и установку переменных, полей классов и структур и прочее, прочее. Где-то в соседних темах показывал скрин редактора в момент отладки.

Из поддерживаемых языков - VB работает так же хорошо, как и паскаль.
А вот JS сырой. Совсем сырой, от кривых массивов, до отсутствия подхвата-на-лету строк вида '{Count: 1, Items: [{ClilocID: x, Params: [''str1'', ''str2'']}]}'. А кому оно в таком обрезанном виде надо?



P.S. Это кстати вторая попытка впихивания пакса, удачная. Первая была года 3 тому, но неудачно. Багов было больше, знаний меньше.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336583
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanVizit0r,

софт-то что делает в общих чертах?
Только для внутреннего потребления?

Скриптовый клиент для игр. Т.е. никакой графики вообще.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336584
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rwadmanVizit0r,

софт-то что делает в общих чертах?
Только для внутреннего потребления?

Скриптовый клиент для игр. Т.е. никакой графики вообще.

Поправлю себя - графика есть. В UO-надростойке вычитываются дата-файлы игры, и в одной из вкладок рисуется простейшая 2д-карта, по ней удобно бегать и вообще понимать что и где.
Вот собственно и вся графика.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336619
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про FMX.

В Seattle его уже хоть как-то, пусть с оговорками, но можно использовать. До этого пробовал XE7 - все было уныло начиная уже со старта.

Из больших подводных камней:

1) Самый большой, встреченный мною - это TBitmap. В VCL ты спокойно задаешь pixelformat и вперед. А в FMX так нельзя. Там нельзя задать pixelformat вообще, он задается сам в зависимости от движка отрисовки. А даже если бы можно было (до XE8, насколько помню) - pf15bit там вообще нет. И вот фиг знает что мне делать, конвертировать 800 мб арта в 32б формат меня как-то не радует.
А по остальному - пикселы мапятся, и через GetScanline читаются.

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

2) Неплохой набор подводных камней сидит в стандартных компонентах. Например для TEdit и TComboBox нельзя сделать высоту меньше чем 32, оказывается это фича такая.
Лечение тоже в духе FMX
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  TEdit = class(FMX.Edit.TEdit)
  protected
    procedure AdjustFixedSize(const Ref: TControl); override;
  end;
...
procedure TEdit.AdjustFixedSize(const Ref: TControl);
begin
  SetAdjustType(TAdjustType.None);
end;

.
Да и шрифт в TComboBox так просто не изменишь, но это уже мелочи.
А вот то, что у TComboBox отсутствует ивент OnSelect - это уже не мелочи. Теперь приходится при операциях с ComboBox ставить OnChange в nil, потом возвращать обратно. Та же история с CheckBox, кстати.
Измененные названия проп типа Caption\Text - это ерунда. Правильно поменяли, кстати. А то эти пропы с типом "TCaption" меня всегда напрягали.

Загрузку из ресурсов я еще не успел проверить.

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

3) Попереименовывать все цвета в TColors.XXX (напр. TColors.Green) - невелика проблема.

Так сходу из общих проблем FMX ничего не вспоминается.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336621
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rПользуясь случаем - никто не встречал на своем пути сторонних мультиплатформенных классов по работе с графикой, и чтоб бм поддерживала? гугл не признается.Graphics32 не катит разве?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336627
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatVizit0rПользуясь случаем - никто не встречал на своем пути сторонних мультиплатформенных классов по работе с графикой, и чтоб бм поддерживала? гугл не признается.Graphics32 не катит разве?
качну, посмотрю что там, спасибо.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336632
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FMX применительно к Андроиду.

Мне вот надо, чтоб приложение работало только в landscape режимах - обычном и перевернутом. Portait - нафиг.
И вот идешь в опции проекта, там смотришь в Application-Orientation, включаешь, выбираешь 2 нужных галки. Вроде все классно и очень просто. Вот только не работает. При повороте приложение все равно хочет повернуться в portrait и тупо крашится.
А работает как надо только при сочетании двух вещей -
1)
в .dpr проекта сразу после
Application.Initialize;
добавить
TAndroidHelper.Activity.setRequestedOrientation(TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
ну и
Androidapi.Helpers,
Androidapi.JNI.App,
Androidapi.JNI.GraphicsContentViewText,
в uses

2) в файле AndroidManifest.template.xml поменять android:configChanges на
android:configChanges="orientation|keyboard|keyboardHidden|screenSize" .

Второй фикс - для решения вопроса краша при повороте, первый - для использования только двух landscape режимов.


Радует, что в Сиэттле "изкаропки" нормально работают в андроиде контролы, получающие фокус, раньше в андроиде 5 вешали приложение наглухо.

Из интересных моментов - вот есть в FMX классические Open\Save dialogs. Все отлично вроде как. Вот только на андроиде никакого диалога не показывает, а сходу возвращает False. Почему было не реализовать его при наличии всех необходимых апи - то вопрос вопросов. Причем ЕМ про этот факт скромно забыло упомянуть в инфе про диалоги. Впрочем, в инете народ уже выложил несколько вариантов, потом буду смотреть, что там да как.

Вообще разработка гуя, или фикс чего-то в андроиде - это отдельная песня, причем очень грустная. Это в VCL просто - поменял, запустил, посмотрел результат, закрыл и по кругу. В Андроиде, когда компиляция + deploy + запуск приложения занимает минуты по 3 (на i7-то!) - разработка превращается в нечто невероятное.
После нескольких экспериментов оказалось, что никакого выигрыша в скорости при использовании андроид-эмуляторов нет, с реальным получается быстрее всего.

Еще вспомнилось "двойное завершение" приложения, когда при закрытии оного происходит двойной заход в деструктор главного окна. Причину я так и не понял, корни уходили в глубину явы, так что поставил простой семафор и забыл.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336639
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rЕще вспомнилось "двойное завершение" приложения, когда при закрытии оного происходит двойной заход в деструктор главного окна. Причину я так и не понял, корни уходили в глубину явы, так что поставил простой семафор и забыл.
Не в яву, а в FMX, который бинарником идет в apk.
Там мрак полный, вплоть до того, что явно рубят по версии андроида и прочим атрибутам.
Ощущение, что сделано осознанно и специально для покупки следующих версий делфи.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336642
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на текущий момент:
1) приложение запускается, все настройки подхватывается, к серверу подключается нормально, (по отзывам нескольких юзеров скорость такая же как и на компе - 1-2с на коннект. Здесь же интернет через спутник - коннект может и полминуты идти), скрипты запускаются.
2) Для полноценной работы всех дата-файлов надо впилить класс MMF для андроида - сейчас 5 юнитов из 13 фактически отрезаны.
3) разобраться с битмапами
4) опен-диалоги и прочее, это уже текучка.

Вот как-то так.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336985
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
было чуть времени, заценил 2 реализации списка каталогов\файлов - одну на основании банального TDirectory.GetDirectories и TDirectory.GetFiles, вторую на основании крохотного java-класса. Вторая чуть быстрее, но чувствуется это только на реально больших списках - напр. 200 фоток через дельфийские методы получал чуть-чуть дольше, чем через ява-класс. Мне такие каталоги не нужны, а значит можно сказать что скорость одинакова.
А вот с импортом все оказалось намного сложнее. Надо прицепить .jar, в деплоймент прицепить все нужные файлы от него, правильно прописать им RemotePath. В офиц. инструкции все красиво и легко - просто импортируйте все нужные файлы в проект. всё.

Итог - использую самописный список, на основе первого варианта. К нему и фильтра дописать можно и вообще настроить как хочется.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337059
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

к слову, лазарь не рассматривается в качестве платформы для сборки совсем? он там вроде под андроид что-то мог. fmx'а нет, lcl - нечто типа vcl, может перевести проще будет?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337146
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

незнаю как сейчас, но года два тому свежеустановленный лазарь, начавший сыпать тонны ошибок на компиляции пустого проекта - вызвал у меня неудержимое желание удалить его и забыть навсегда. Да и размер итогового приложения, 40 мб под винду если не изменяет память - вообще не радует. Под андроид наверное не меньше получается.

А насчет андроидного варианта - да вобщем-то мне и FMX подходит, тем более что он не только под андроид идет. Размер они по сравнению с первыми версиями FMX уменьшили, скорость работы вобщем-то пристойная - пока что все устраивает.




Сегодня кстати выложу скриншотов, как закончу делать ownerdraw для listboxItem.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337172
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

:) всё так жестко было? 1.7 (транковый) точно так не делает. 40 мб - в дебаг режиме. если без - размер будет меньше.

авторПока что все устраивает

Если работает - то отлично! Показывайте, рассказывайте. LCL, к слову, тоже везде работает.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337314
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonVizit0r,

:) всё так жестко было? 1.7 (транковый) точно так не делает. 40 мб - в дебаг режиме. если без - размер будет меньше.

авторПока что все устраивает

Если работает - то отлично! Показывайте, рассказывайте. LCL, к слову, тоже везде работает.

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

Через пару часов буду на работе и скину скринов.



P.S. Рисование на канвасе в FMX отличается от VCL, но ничего такого абсолютного иного. Хелп + примеры нормально помогают. Самый сложный момент оказался с цветами - там TAlphaColor используется, который есть $FF or TColor. Сразу не обратил внимания - и не мог понять, чего это ничего не рисуется. А оно просто прозрачное всё было.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337344
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rСкриптовый клиент для игр. Т.е. никакой графики вообще.
А что за игра?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337355
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Vizit0rСкриптовый клиент для игр. Т.е. никакой графики вообще.
А что за игра?

основная - это та, под которую упор делается, есть много народу, который приложением пользуется (и тестит, соответственно) - это Ultima Online.

Так-то переделывалось и под Perfect World, и под несколько VK игр - еще до разделения на ядро и игровую надстройку.
Уже несколько заявок есть на другие игры, но пока не до них.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337395
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два скрина - вин и андроид.
Эти цветные полоски убивают тонну времени - я часа два потратил на то, чтобы правильно подобрать их положение. И то не до конца, но это уже мелочи. Да и цвета явно не те, что должны быть - виндовые цвета на андроиде извратились до совершенно других. Пока взял Red Blue Green, потом подберу покрасивее.



...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337396
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а черт, 2 скрина с нета под спойлером, и еще 1 приложился файлом - продублировался.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337406
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в FMX, в отличие от VCL, для TListBox в событии OnClick еще старый ItemIndex листбокса. Новый установлен дальше, ловить можно в OnItemClick.

один из мелких незаметных моментов, которые при этом могут осложнить жизнь.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337443
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С таким стилем и сложностью интерфейса проще было бы все на FMX сделать.

ИМХО.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337446
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) размер - 52 мб exe - как-то меня не очень радует. Против 13 VCL.
2)В редакторе много чего чисто VCL-ного задействовано.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337465
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовал отказаться от Memory mapped files в пользу обычного TFileStream - получил на винде при просчете маршрута замедление в три раза.
Пришлось на коленке состряпать порт MemMapFile на Posix

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
constructor TMMFStream.Create(_FileName : String);
begin
  inherited Create;
  FMemory := nil;
  FFileName := _FileName;

  FSize := GetFileSizeByFileName(_FileName);
  // Open the file
  FileHandle := Fileopen(_FileName, fmOpenRead + fmShareDenyNone );

  if FileHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;

  // Map it!
  FMemory := mmap(nil,FSize,PROT_READ, MAP_SHARED,FileHandle,0);

  if FMemory = Nil then RaiseLastOSError;
end;

destructor TMMFStream.Destroy;
begin
  if FMemory <> Nil then
    if munmap(FMemory, FSize) <> 0 then
      RaiseLastOSError;
  inherited Destroy;
end;


остальное вроде не меняется.

все оказалось проще, чем казалось сначала.

потом проведу тесты на андроиде, чтобы сравнить время.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337481
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

эх..., ностальгия ... сколька драйва, когда выходишь на ещё непроверенном, только написанном клиенте

LCL - да, неплохо рулит, сам свой клиент переписывал. Правда мой для ещё более древних игр

а Мапер на каком принципе сделан? я сам до мапера не добрался
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевод приложения на мультиплатформенность.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]