Hyperloop и Applelerator против простых титановых модулей

Я начал играть с Appcelerator Hyperloop. Хотя доступ к нативным API-интерфейсам из JS кажется прекрасным с самого нулевого дня, он поднимает несколько вопросов об архитектуре платформы и производительности.

В настоящее время (AFAIK) приложение Titanium имеет основной поток пользовательского интерфейса (который выполняет собственные контроллеры пользовательского интерфейса) и поток JS (который выполняет логику JS). Каждый вызов от JS к Native передается через "Мост" (который является расширенной операцией в приложении).

Кроме того, Titanium API не охватывает все нативные API и аннотации настолько, насколько это возможно. Но если будут введены новые API, Appcelerator может потребоваться время для их внедрения в платформу.

Одна из моих любимых вещей о Titanium - это возможность расширять его (используя target-c для iOS и java для Android) - позволяя использовать собственные API-интерфейсы, которые не охватываются Titanium, а также разрабатывать действительно нативные элементы управления производительностью в случае необходимости. делать все, что слишком "тяжело" для JS. И, как уже упоминалось, он разработан на 100% нативно для каждой платформы.

Теперь, когда Appcelerator представил Hyperloop, я сделал простое тестовое приложение и увидел, что Hyperloop не переводится в нативный код, а просто в обычный код JS:

var UILabel = require('hyperloop/uikit/uilabel');
var label = new UILabel();
label.text = "HELLO WORLD!";
$.index.add(label); 

И еще одна вещь о том, что вы должны работать в главном потоке.

Таким образом, у нас есть несколько вещей, которые приходят на ум, когда речь идет о архитектуре Hyperloop:

  1. У нас еще есть мост? если Hyperloop - это то, что JS, который вызывает "специальный" Hyperloop, требует, чтобы у нас все еще был мост, который теперь не только выступает в качестве моста, но и должен выполнять какое-то отражение (что также является экспансивной операцией)?
  2. До сих пор JS работал в своем собственном потоке - так что теперь выполнение в одном основном потоке, кажется, является потенциальным источником для дополнительной операции блокировки пользовательского интерфейса.
  3. Старомодные модули были по-настоящему родными (не считая мостового вызова) - так как же сравнивать приложения с поддержкой Hyperloop с этими?

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

2 ответа

Отвечая на ваши вопросы прямо:

  1. Кролл-прокси больше не задействован, поскольку реальные классы генерируются во время выполнения. Это делается с помощью гипер-петли-метабазы, которая выполняет рефлексию (как вы уже сказали) для создания AST, который захватывает реальные сигнатуры, типы, классы, методы, свойства и т. Д.
  2. Мы пока не видели проблем с производительностью при запуске в основном потоке. Если вы это сделаете, пожалуйста, отправьте JIRA-билет, чтобы мы могли исследовать вариант использования.
  3. Старые модули были "менее родными", чем сейчас, просто потому, что все они были обернуты прокси Kroll (расширяя каждое представление из TiUIView и каждый прокси от TiProxy / TiViewProxy, Hyperloop не работает с ними, что значительно ускоряет разработку модуля, позволяя разработчику тестировать его / ее процесс в своем приложении без необходимости упаковки и ссылки на модуль вручную. Модули Hyperloop - это не что иное, как модули CommonJS, которые уже часто используются в Alloy и других Ti-компонентах.

Я надеюсь, что это даст вам краткий обзор того, как работает Hyperloop. Если у вас есть дополнительные вопросы, дайте нам знать!

Hans

(Как подробный ответ на комментарий выше)

Допустим, у вас есть таблица в iOS. Родной класс UITableView а Titanium-API это Ti.UI.TableView / Ti.UI.ListView,

Хотя ListView уже обеспечивает значительное повышение производительности по сравнению с TableView, абстрагируя использование дочернего API от шаблонов, эти дочерние API (Ti.UI.Label, Ti.UI.ImageView,...) по-прежнему являются пользовательскими классами, которые упакованы и предоставляют пользовательскую логику (!), например, отслеживание родительских ссылок, внутренних структур данных и блокировок для перехода между потоками.

Если вы сейчас посмотрите пример Hyperloop нативного UITableViewвы получаете прямой доступ к нативному API, поэтому никакой прокси-сервер за ним не нуждается в управлении разделами, шаблонами, элементами и т. д. Конечно, мы предоставляем этот API через прокси-сервер kroll для его отображения в Titanium, но вы не "переходите между мост "с каждым звонком из SDK.

Самый простой способ убедиться в этом - запустить какой-то более крупный пример, такой как tableview, collectionview и view-animation. Если вы сделаете быструю прокрутку, вы уже почувствуете прирост производительности по сравнению с "классическим" API-интерфейсом Titanium, просто потому, что единственная связь между вашим прокси и (как Ti.UI.Window Вы хотите добавить это к) является .add() получить нативный API типа HyperloopClass,

Наконец, конечно, все еще имеет смысл использовать Ti.UI.ListView например, потому что он поставляется со встроенными утилитами, которые любят разработчики Titanium (события, простая настройка и обработка макетов). Но именно в этом и заключается преимущество Hyperloop, позволяя разработчику получить доступ к этим API самостоятельно.

Я надеюсь, что это поможет немного больше понять это.

Другие вопросы по тегам