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