6

我已经开始玩Appcelerator Hyperloop。尽管从零开始从JS访问本地API似乎很不错,但它确实提出了一些关于平台体系结构和性能的问题。Appcelerator Hyperloop与普通钛模块

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

此外,Titanium API并未涵盖所有原生API和摘要。但是,如果引入新的API,Appcelerator可能需要一些时间才能将这些API实施到平台中。

关于Titanium我最喜欢的一件事是扩展它的能力(使用objective-c for iOS和java for Android) - 允许使用Titanium未涵盖的本机API,并开发真正的本机性能控制以防我们需要为JS做任何过于“沉重”的事情。而且,如前所述,它是针对每个平台开发的100%原生的。

现在的Appcelerator推出超回路列车我做了一个简单的测试应用程序,看到超回路列车不被翻译为本地代码,但只是正常的JS代码:

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

而它的另一件事是,你必须在主线程上运行。

所以我们基本上有几件事想到这里就超回路列车架构云:

  1. 我们仍然有一个桥梁?如果Hyperloop是调用“特殊”Hyperloop需求的JS,那么我们仍然有一个桥梁,现在不仅可以充当桥梁,而且还需要做某种反射(这也是一种扩展操作)?
  2. 直到现在,JS运行在它自己的线程中 - 所以现在在单个主线程中运行似乎是更多UI阻塞操作的潜在来源。
  3. 老式的模块真的是本地的(不包括桥接电话) - 那么如何使用支持Hyperloop的应用程序与那些应用程序相比?

没有太多有关Hyperloop的文档或文章可以解释内部工作 - 所以如果任何人有任何答案一直在尝试应用程序可能是非常有用的。

回答

6

回答你的问题直接:

  1. 没有Kroll公司的代理参与了,因为正在运行时产生的实际的类。这是通过使用反射(如你已经说过的)构建一个抓取实际签名,类型,类,方法,属性等的AST的超环形元数据库来完成的。
  2. 我们没有看到任何性能问题现在在主线程上运行。如果您这样做,请提交JIRA票据,以便我们调查用例。
  3. 那么旧模块现在“不太原生”,只是因为它们全都被Kroll代理包裹(通过延伸每个视图从TiUIView和每个代理TiProxy/TiViewProxy。Hyperloop不与这些工作,使得通过允许开发人员在他们的应用程序中测试他/她的流程,而无需手动打包和引用模块,模块开发速度会更快。Hyperloop模块就是那些已经在Alloy和其他Ti组件上频繁使用的CommonJS模块。

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

汉斯

+1

谢谢。 事实上,我看到我得到的对象是“KrollCallback”和“HyperloopClass”。 你能否进一步解释这个架构以及它在主线程上运行的含义? 在旧模块中,假设我创建了一个包含图像和文本的TableView - 关于使用TiView包装TableView的说法是真实的 - 但是就该视图的子对象而言(ImageView $ Label) - 它们是原生的作为一个 - 所有你绑定他们的事件。只有你带回JS的东西才能跨越桥梁 - 所以不是比做反射更高效? – developer82

+0

嘿!我为此做了一个自己的回答,因为评论只能有600个字符。 –

+0

@HansKnoechel是否可以创建一个Hyperloop模块?我看到了你提出的规范,并且想知道如何为此进行计划。很显然,人们希望即插即用模块不仅仅是每次创建定制的Hyperloop业务逻辑。 –

1

(作为一个详细的解答上述评论)

所以我们可以说你在iOS版的tableview。原生类是UITableView,而钛-APP是Ti.UI.TableView/Ti.UI.ListView

虽然已经的ListView通过抽象的儿童API使用情况的模板提供相比的TableView一个巨大的性能提升,这些儿童的API(Ti.UI.LabelTi.UI.ImageView,...)是被包裹,并仍然提供自定义类定制逻辑(!)例如跟踪其父引用,内部数据结构和锁定以在线程之间跳转。

如果您现在检查本机UITableViewHyperloop example,那么您可以直接访问本地API,因此它后面的代理服务器无需管理节,模板,项目等。当然,我们通过kroll代理交付该API以便将它显示在Titanium中,但是您不会在每次通过SDK进行的调用时“在桥梁之间跳跃”。

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

最后,当然,例如使用Ti.UI.ListView也是有意义的,因为它附带了Titanium开发人员喜欢的事件(事件,简单配置和布局处理)。但是,这也是Hyperloop的好处,允许开发人员访问这些API的他/她自己。

我希望能够帮助更多人了解它。

+0

谢谢。我想我的问题导致了这个答案,我被误解了。我的意思是,如果我创建一个“经典”模块,并创建一个TableView(或任何视图),那么子元素和容器视图的事件(这是唯一被TiUIView包装的人)都是本地化,未包装,未反映元素。所以理论上他们应该会产生更好的表现。 – developer82

+0

Gotcha。一些基准测试的时间:-)虽然我仍然认为任何与本地模块的交互会再次经历更多的桥梁,所以Hyperloop会“赢”。但那实际上需要测试。 –

+1

我认为它确实取决于模块以及模块和JS逻辑之间设计的通信是什么。比方说,我们正在构建一个图库 - 模块加载图像,并响应点击事件,并选择图像 - 在所有模块本机端 - 只有当选定的图像应该返回到JS然后穿过桥。所以除了返回结果之外,所有的交互都将是本地的 - 所有交互都依赖于每个模块定义。 – developer82