Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 20

У вас же на Qt все, перестал устраивать?

На Qt написано приложение 2ГИС. API часть SDK не использует Qt.

Приветствую.

Написали кодогенератор, который позволяет вызывать C++ код напрямую из Dart с помощью FFI. Благодаря этому кодогенерируемое API полностью аналогично iOS и Android Mobile SDK

Такой вопрос. А проще путь если: клиент-сервер, клиент на Dart, сервер C++, обмен данными не обязательно через сокет, если быстрее надо можно пайпы использовать или шару. Чем такой вариант хуже?

Привет. Я так понимаю, что идея заключается в локальном развертывании клиент-серверного приложения. Теперь по порядку.

  1. При клиент-серверном взаимодействии данные передаются в виде, например, JSON. Сериализовать/десериализовать данные в JSON и обратно - явно будет медленнее, чем через FFI. Да, можно использовать protobuf, но тоже не уверен, что будет сильно производительнее JSON и точно хуже FFI.

  2. Поддержка и использование API пользователями нашего SDK будет сложнее. Сейчас пользователь может подписаться на CancelableOperation и получить в callback готовый для использования тип. Или передать класс в наш API. А так придется еще и через JSON/protobuf все это прогонять.

И ты имеешь ввиду, что проще - это не нужен кодогенератор? Ну при подходе в клиент-серверном взаимодействии нужно реализовать сериализаторы/десериализаторы. Плюс, кодогенератор один раз написали и все, он на CI работает и генерирует сборки.

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

Генератор - это наш внутренний продукт, недоступный для внешнего пользователя. Генерируемый файл мы поставляем вместе с FlutterSDk.
Да, из за того, что политика flutter требует предоставление всех dart исходников, получается, что сгенерированный файл мы выставляем наружу. Но пользователь сам себе выстрелит в ногу, если что-то там сломает))

  1. JSON только если для команд и метаданных, а обновленную карту из 3D движка прямо так и передавать в бинарном виде. Сериализация нужна будет, да, protobuf подойдет, но можно и самим написать не хитрый протокол, типа: в начале метаинфо в json, затем бинарные данные, если есть.

  2. Мне вот кажется наоборот у вас сейчас АПИ для юзера довольно сложное получилось, вы его в свои классы загоняете, которые создавать надо с помощью генератора.

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

Так у нас же не просто отображение карты. Наш продукт позволяет задавать перелеты и сложные алгоритмы для изменения параметров камеры во время слежения. Отслеживание разных параметров камеры.
У нас есть справочник со большим объемом данных и вложенными структурами.
Навигатор позволяет в реальном времени получать данные об оставшемся маршруте, о текущей скорости, потери GPS и прочим.

Для всех выше указанных и множества других сценариев постоянно гонять protobuf - накладно.

>его в свои классы загоняете, которые создавать надо с помощью генератора.

Самому пользователю ничего создавать не нужно) Готовые Dart классы и методы уже доступны из коробки вместе с дефолтными UI виджетами.

Для пользователя protobuf мбыть не всем удобен, да. (но протобуф быстре парсить есст-но, чем json, но это мелочь все).
Вот что имею ввиду, если json-ом пусть пользоваться (на самом деле любым можно текст протоколом, без разницы):

имеем в "С" апи такую ф-ю:
BOOL setParam(int ptype, char* jsonVal);

и для валидации json пусть ф-ю, пригодится чтобы проверить апи на изменение в будущем

BOOL checkParamValid(int ptype, char* jsonVal);


< задавать перелеты и сложные алгоритмы для изменения параметров камеры во время слежения:

setParam(CAM_TANG, "{"deg": 2, "posA": 1234, "posB" : 567...}");

Пользователю давать эти ф-ии в руки, а не сгенерирован классы, и он будет доволен.

Еще BSON как вариант использовать, если у вас там прямо большие стр-ры данных передваться будут. 

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

Ты сейчас рассматриваешь простой кейс - задать позицию камеры.
У нас есть метод Camera.move, который возвращает CancelableOperation с сигналом о том, что перелет камеры завершен. Или у нас есть канал positionChannel, который Stream и возвращает данные об изменении позиции камеры.
С этим как быть? Слушать конкретные сокеты?
Также у нас еще есть функционал с передачей платформенной реализации какого-то абстрактного класса - то же сложное задание слежения за позицией или углом наклона.

С этим как быть?

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

>Пусть юзер сам себе городит сверху что-то, если надо ему.

Цель то наша как раз и создать максимально удобный API, чтобы пользователю не нужно ничего "городить", а у него было бы максимально доступный и удобный набор ручек.

В поддержку нашего подхода скажу, что наши конкуренты также используют платформенное API над C++ кодом.

Вы и так могли бы на базе С-го интер-са создать (потом) вспом классы на конкретном языке, для удобства юзеру. И он бы сам выбирал, пользоваться ими, или спуститься пониже и свои написать обертки.

Сейчас у него один вариант только - использовать ваши ручки.

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

По твоему подходу следует, что ты предлагаешь заменишь наши типизированные классы на JSON/protobuf и тд. Но это лишь малая часть наших "проблем", которые решает кодогенератор.
Самая "мясная" часть кодогенератора связана с передачей CancelableOperation и Stream, с заданием реализации конкретного абстрактного класса.

И у нас кодогенератор еще позволяет генерировать именно платформенные сущности конкретного языка. Dart разработчикам удобно работать с CancelableOperation и Stream, потому что это все часть Dart.
В Swift и Kotlin у нас такой же подход - использовать по максимуму возможности платформенного языка.

Самая "мясная" часть 

Сложно у вас все я и говорю об этом.

Ладно, пользователь если доволен, и у вас есть (пока) столько сил тащить все эти языки (Swift, Kotlin, Dart, потом еще другие надо будет), то.. ну ок.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий