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:
- У нас еще есть мост? если Hyperloop - это то, что JS, который вызывает "специальный" Hyperloop, требует, чтобы у нас все еще был мост, который теперь не только выступает в качестве моста, но и должен выполнять какое-то отражение (что также является экспансивной операцией)?
- До сих пор JS работал в своем собственном потоке - так что теперь выполнение в одном основном потоке, кажется, является потенциальным источником для дополнительной операции блокировки пользовательского интерфейса.
- Старомодные модули были по-настоящему родными (не считая мостового вызова) - так как же сравнивать приложения с поддержкой Hyperloop с этими?
Существует не так много документации или статей о Hyperloop, которые объясняют внутреннюю работу - так что, если у кого-то есть какие-либо ответы, пробовал приложения с ним, это может быть очень полезно.
2 ответа
Отвечая на ваши вопросы прямо:
- Кролл-прокси больше не задействован, поскольку реальные классы генерируются во время выполнения. Это делается с помощью гипер-петли-метабазы, которая выполняет рефлексию (как вы уже сказали) для создания AST, который захватывает реальные сигнатуры, типы, классы, методы, свойства и т. Д.
- Мы пока не видели проблем с производительностью при запуске в основном потоке. Если вы это сделаете, пожалуйста, отправьте JIRA-билет, чтобы мы могли исследовать вариант использования.
- Старые модули были "менее родными", чем сейчас, просто потому, что все они были обернуты прокси 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 самостоятельно.
Я надеюсь, что это поможет немного больше понять это.