6

我已经开始玩 Appcelerator Hyperloop。虽然从零开始从 JS 访问本机 API 似乎很棒,但它确实引发了一些关于平台架构和性能的问题。

目前(AFAIK)一个 Titanium 应用程序有一个主 UI 线程(运行本机 UI 控制器)和一个 JS 线程(运行 JS 逻辑)。从 JS 到 Native 的每个调用都通过“Bridge”(这是应用程序中的扩展操作)传递。

此外,Titanium API 并没有尽可能多地涵盖所有本机 API 和抽象。但是,如果引入了新的 API,Appcelerator 可能需要一些时间才能将这些 API 实施到平台中。

我最喜欢 Titanium 的一件事是能够扩展它(iOS 使用 Objective-c,Android 使用 java)——允许使用 Titanium 未涵盖的本机 API,并开发真正的本机性能控件以防万一做任何对 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 是调用“特殊”Hyperloop 要求的 JS,那么我们还有一个桥,它现在不仅充当桥,还需要进行某种反射(这也是一个扩展操作)?
  2. 到目前为止,JS 在它自己的线程中运行 - 所以现在在单个主线程中运行似乎是更多 UI 阻塞操作的潜在来源。
  3. 老式模块是真正的原生模块(不包括桥接调用)——那么启用 Hyperloop 的应用程序与那些相比如何?

目前还没有太多关于 Hyperloop 的文档或文章来解释内部工作 - 所以如果有人有任何答案一直在尝试使用它的应用程序可能会非常有帮助。

4

2 回答 2

7

直接回答您的问题:

  1. 不再涉及 Kroll-Proxies,因为实际的类是在运行时生成的。这是通过使用进行反射的超循环元数据库(如您已经说过的)来构建一个 AST 来完成的,该 AST 可以获取实际的签名、类型、类、方法、属性等。
  2. 目前我们没有看到在主线程上运行有任何性能问题。如果您这样做,请提交 JIRA-ticket,以便我们调查用例。
  3. 旧模块现在“不那么原生”了,仅仅是因为它们都被 Kroll-proxy 包装了(通过从/扩展每个视图TiUIView和每个代理。Hyperloop 不适用于这些,使模块开发更快还允许开发人员在他们的应用程序中实时测试他/她的进程,而无需手动打包和引用模块。Hyperloop 模块与已经在 Alloy 和其他 Ti 组件中经常使用的 CommonJS 模块一样。TiProxyTiViewProxy

我希望这能让您快速了解 Hyperloop 的工作原理。如果您还有其他问题,请告诉我们!

汉斯

于 2016-08-16T09:00:45.057 回答
1

(作为对上述评论的详细回答)

因此,假设您在 iOS 中有一个 tableview。本机类是UITableView,Titanium-API 是Ti.UI.TableView/ Ti.UI.ListView

虽然与 TableView 相比,ListView 通过将 Child-API 的使用抽象为模板,已经提供了巨大的性能提升,但那些 child-API ( Ti.UI.Label, Ti.UI.ImageView, ...) 仍然是包装的自定义类并提供自定义逻辑 (!) 例如跟踪它的父引用、内部数据结构和锁以在线程之间跳转。

如果您现在查看native的Hyperloop 示例UITableView,您可以直接访问本地 API,因此它背后的代理不需要管理部分、模板、项目等。当然,我们通过 kroll 代理提供该 API,以便在 Titanium 中显示它,但您不会在每次从 SDK 调用时“在桥之间跳转”。

最简单的方法是实际运行一些更大的示例,例如 tableview、collectionview 和 view-animation。如果您快速浏览这些内容,您已经感受到与“经典”Titanium API 相比的性能提升,这仅仅是因为您的代理和(如Ti.UI.Window您想要添加它的)之间的唯一通信是.add()接收本机 API类型HyperloopClass

最后,当然使用它仍然是有意义Ti.UI.ListView的,因为它带有 Titanium 开发人员喜欢的内置实用程序(事件、简单的配置和布局处理)。但这也是 Hyperloop 的优势所在,它允许开发人员自己访问这些 API。

我希望这有助于更多地理解它。

于 2016-08-17T15:53:15.720 回答