6

私はAppcelerator Hyperloopを使い始めました。 0日目からJSのネイティブAPIにアクセスすることは素晴らしいようですが、プラットフォームのアーキテクチャーとパフォーマンスについて、いくつか質問があります。Appcelerator HyperloopとPlain Titaniumモジュール

現在(AFAIK)Titaniumアプリケーションには、メインのUIスレッド(ネイティブUIコントローラを実行するスレッド)とJSスレッド(JSロジックを実行するスレッド)があります。 JSからNativeへの各呼び出しは、 "Bridge"(これはアプリの広範な操作です)を通過します。

また、Titanium APIはすべてのネイティブAPIと抄録を可能な限りカバーしていません。しかし、新しいAPIが導入されると、Appceleratorがそれらをプラットフォームに実装するのに時間がかかる可能性があります。

Titaniumに関する私の大好きなことの1つは、Titaniumで扱われないネイティブAPIを使用できるようにすること(iOSとJava用のobjective-cを使用して)を拡張する機能であり、 JSのためにあまりにも重いことをする必要がある場合に備えて。そして、前述のように、各プラットフォームで100%ネイティブに開発されています。今

は、Appceleratorのは、私は簡単なテストアプリをやったハイパーループを導入し、ハイパーループがネイティブコードにちょうど通常のJSコードに変換されていないことを見たこと:

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

、それについて別の事あなたが持っているということですメインスレッドで実行します。

だから我々は、基本的には、いくつかのことは限りハイパーループ・アーキテクチャが行くように、ここで心に来た:

  1. 我々はまだ橋がありますか?ハイパーループが "特別な"ハイパーループを必要とするJSなら、まだブリッジを持っているだけでなく、ブリッジとして機能するだけでなく、何らかのリフレクション(拡張オペレーションでもあります)を行う必要がありますか?
  2. これまではJSが独自のスレッドで実行されていました。つまり、1つのメインスレッドで実行すると、より多くのUIブロック操作の潜在的なソースになるようです。
  3. 旧式のモジュールは本当にネイティブで(ブリッジコールは含まれていませんでした)、ハイパーループ対応のアプリケーションとそれらのアプリケーションとの比較はどのようになっていますか?

にはまだ内部の作業を説明ハイパーループについて多くのドキュメントや記事はありません - 誰もが何らかの答えを持っている場合、それにアプリケーションをしようとしていることは非常に役に立つことができそう。ストレートなご質問に答える

答えて

6

  1. 実際のクラスは、実行時に生成されているので、何のクロール・プロキシは、もはや関与はありません。これは、実際のシグネチャ、タイプ、クラス、メソッド、プロパティなどを取得するASTを構築するために、リフレクションを行うハイパーループメタベースを使用して行われます。
  2. パフォーマンスに関する問題はありませんでした。今のところメインスレッドで走っています。その場合は、ユースケースを調べるためにJIRAチケットを提出してください。
  3. これまでのKrollプロキシですべてのラップが処理されていたため、古いモジュールは「ネイティブではありませんでした」(TiUIViewおよびすべてのプロキシをTiProxy/TiViewProxyから拡張しています。開発者がモジュールを手作業でパッケージ化して参照する必要なく、自分のプロセスを自分のアプリでテストできるようにすることで、モジュール開発をより迅速に行うことができます。ハイパーループモジュールは、合金や他のTi部品で頻繁に使用されているCommonJSモジュールです。

HyperClopの仕組みについて簡単にご紹介します。さらなるご質問がある場合は、お知らせください。

ハンス

(上記のコメントに詳細な回答として)
+1

ありがとうございました。 実際に私が得るオブジェクトは 'KrollCallback'と' HyperloopClass'です。 アーキテクチャについてさらに説明し、メインスレッドで実行することが何を意味するのでしょうか? 古いモジュールでは、画像とテキストを含むTableViewを作成するとします.TiViewを使ってTableViewをラップすることについて言えば、そのビューの子オブジェクト(ImageView $ Label)まではネイティブですあなたがそれらを結びつけるすべての出来事がありますように。あなたがJSに戻ったものだけが橋を渡ります - それで、反射を行うよりもパフォーマンスが良いのですか? – developer82

+0

ねえ、そこに!コメントは600文字しかないので、私は自分の答えを出しました。 –

+0

@ HansKnoechelハイパーループモジュールを作成することは可能ですか?私はあなたの提案された仕様を見て、どのように進歩/計画がこれのためにあるのだろうと思っています。明らかに、カスタムハイパーループビジネスロジックを毎回作成するだけではなく、プラグアンドプレイモジュールが必要です。 –

1

それでは、あなたがiOS版でテーブルビューを持っているとしましょう。ネイティブクラスはUITableViewで、チタンAPIはTi.UI.TableView/Ti.UI.ListViewです。

ListViewは、Child-APIの使用方法をテンプレートに抽象化することによって、TableViewと比較して既に大幅なパフォーマンス向上を実現していますが、それらの子API(Ti.UI.LabelTi.UI.ImageView、...)はラップされ、カスタムロジック(!)親参照、内部データ構造、スレッド間のジャンプをロックしています。

ネイティブUITableViewHyperloop exampleを確認した場合は、ネイティブAPIに直接アクセスするため、セクション、テンプレート、アイテムなどを管理するプロキシはありません。もちろん、そのAPIをkrollプロキシ経由で配信しますそれをTitaniumに表示しますが、SDKから呼び出すたびに "ブリッジ間をジャンプ"しないでください。

実際には、tableview、collectionview、view-animationのような大きな例を実際に実行するのが最も簡単な方法です。これらを高速にスクロールすると、プロキシと(たとえばTi.UI.Windowを追加したい)唯一の通信がネイティブを受け取るための.add()であるため、従来の「Titanium API」に比べてパフォーマンスが向上していますAPIタイプはHyperloopClassです。

最後に、もちろん、Ti.UI.ListViewは、Titanium開発者が愛用する組み込みユーティリティ(イベント、簡単な設定、レイアウト処理)が付属しているので意味があります。しかし、開発者がこれらのAPIにアクセスできるようにすることで、Hyperloopの利点が生まれる場所もそうです。

もう少し理解していただければ幸いです。

+0

ありがとうございます。私はこの答えにつながる私の質問で誤解されたと思う。私が意味することは、 "古典的な"モジュールを作成して、その要素についてのTableView(またはそのビュー)を作成し、コンテナビューのイベント(TiUIViewをラッピングする唯一のもの)がすべてラップされていない、反映されていない、要素。だから、理論的にはより良いパフォーマンスを出すはずです。 – developer82

+0

Gotcha。いくつかのベンチマークテストの時間:-)ネイティブモジュールとのやりとりがあれば、さらに多くのブリッジを経由してハイパーループが "勝つ"と考えています。しかし、実際にはテストが必要です。 –

+1

私はそれが実際にモジュールに依存し、モジュールとJSロジックとの間の設計された通信が何であるかと思います。ギャラリーを構築する例では、モジュールはイメージをロードし、クリックイベントに応答し、イメージをすべてのモジュールのネイティブ側で選択します。選択したイメージがJSに戻ってからブリッジを横断するときのみです。したがって、すべてのインタラクションは返された結果を除いてネイティブになります。つまり、すべてがモジュール定義に依存します。 – developer82

関連する問題