21

私は、HTML5ゲームをモバイルに公開することを目的としたWebGLを有効にするPhoneGapプラグインに取り組んでいます。これはWebGLGapと呼ばれます。ただし、PhoneGapがプラグインコードを(execを介して)呼び出す方法では、通常、すべてのパラメーターをJSONに文字列化してから、反対側で再度解析する必要があります。この質問によると、これは、より高速なブリッジを持つと宣伝されていたPhoneGap2.2でも変更されていません。WebGLのようなものの場合、これは絶対に受け入れられず、単純なデモでもパフォーマンス(<10 FPS)を低下させます。これは、多くの場合、特に2Dゲームでは、すべてのフレームが、実行するすべてのWebGLコマンドを表すJSONデータの大きなブロックを送信する必要があるためです。これにはすべての頂点データが含まれます。フレームごとに「0.959455、0.959595、0.588575、0.585858...」などの巨大な文字列を想像してください。

明らかに、文字列化と解析は不必要で非効率的な手順ですが、それを回避するJSからネイティブにJSONデータを渡す方法を見つけるのに苦労しています。理想的には、これはAndroidとiOSの両方で機能するはずですが、今のところAndroidのみのソリューションに固執することを嬉しく思います。これを行うための最も効率的な方法について誰かが何かアイデアを持っていますか?

4

6 に答える 6

12

Linkedin は、iPad アプリに Web ソケットを使用しています。調べる価値があるかもしれません: http://engineering.linkedin.com/mobile/linkedin-ipad-nativeweb-messaging-bridge-and-websockets

あなたが探している利点のいくつか

  • WebSocket は、JavaScript からネイティブに非同期で通信できます。
  • WebSocket にはペイロード制限がありません
  • WebSocket では、JSON 文字列を URL パラメーターとしてエンコードする必要はありません
  • WebSocket は URL スキームのナビゲーションよりも高速である必要があります
于 2012-11-27T22:58:40.217 に答える
3

アドレッシング性能

あなたが言及したように、 CordovaPlugin.javaを見ると、すべてが次のようになりますString

public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException {
    JSONArray args = new JSONArray(rawArgs);
    return execute(action, args, callbackContext);
}

たとえば、 からStringへの変換JSONArrayが唯一のボトルネックである場合は、プラグインでこのメソッドをオーバーライドして、独自の逆シリアル化を実行できます。これは小さなパフォーマンスの改善ですが、調査する価値があるかもしれません。

代替ブリッジの作成

代替ブリッジの作成に関しては、よりトリッキーです。Cordova / PhoneGap についてはよくわかりませんが、収集した調査によると、Cordova は特定の Javascript インターフェイスaddJavascriptInterface. 独自の を実装できればNativetoJSMessageQueue、すべてをまとめて配線できるかもしれません。

編集
もう少し調査を行った後、もう少し方向性を提供できます。NativetoJSMessageQueue の本当に関連する部分は、それが実装するさまざまなBridgeModesです (行 92を参照)。例として、他のブリッジ モードを見ることができます。

残念ながら、 にNativetoJSMessageQueueは正確に 4 つのブリッジ モードが登録されています。独自のブリッジ モードを実装できると仮定しても、それを の新しいモードとして何らかの方法で登録する必要がありますNativetoJSMessageQueue

于 2012-11-24T22:15:48.247 に答える
2

正確に何をしたいのかわかりませんが、プロジェクトでJSONをStringに変換し、PhoneGapプラグインを通過させ、JSONに変換してから、Matrixに変換することに気付きました。

データを文字列に保持し、その文字列を直接Matrixに変換するとどうなりますか?このようにして、JSON部分との間の変換をスキップできます

于 2012-11-27T22:54:35.213 に答える
2

Android では、addJavascriptInterface( WebView のドキュメントへのリンク) メソッドを使用してWebView、「Java オブジェクトを WebView に挿入する」ことを試みることができます。これは、PhoneGap がジオロケーション、ファイルシステムなどの API を追加するために使用するアプローチです。

これは、プラグイン アプローチを使用するよりも高速になると思います (まだテストしていません)。

PhoneGapView拡張する のコードを確認してくださいWebView:

アップデート

結局のところ、以下のコメントで述べたように、これはintorなどの単純な型に対してのみ機能します。String

Android で addJavascriptInterface() を使用して JavaScript オブジェクトを渡す

それ以外のことをしようとすると、android.webkit.WebViewCoreおよびandroid.webkit.JWebCoreJavaBridgeクラス内から例外が発生します。

更新 2

このアプローチを使用して達成する最良のコードは、次のようなものになります ( https://github.com/commonsguy/cw-advandroid/blob/master/WebView/GeoWeb1/src/com/commonsware/android/geowebから) /GeoWebOne.java#L80 ):

public String getLocation() throws JSONException {
  Location loc=myLocationManager.getLastKnownLocation(PROVIDER);

  if (loc==null) {
    return(null);
  }

  JSONObject json=new JSONObject();

  json.put("lat", loc.getLatitude());
  json.put("lon", loc.getLongitude());

  return(json.toString());
}

そしてほとんどの場合、すべてのパラメータは文字列化(またはJSON化...)する必要があります

これは、javascript 側から文字列を作成しようとしたときにパフォーマンスが低下した場合に役立ちます: http://www.javascripture.com/ArrayBuffer

于 2012-11-28T17:11:22.123 に答える
1

png でのデータのエンコードについて読みました。元の記事は次のとおりです: http://cg.alexandra.dk/2012/11/26/webgl-tutorial-optimizing-data-transfer-for-webgl-applications/

役に立つかもしれません。

于 2012-11-29T16:14:30.933 に答える
1

json は非常に非効率的であるため、次の方法を使用すると、多くのパフォーマンスが得られる可能性があります。

サーバー側: データ モデル -> protobuf (build() からバイナリへ) -> base64 のエンコード (バイナリから文字列へ) -> 1 つの json フィールドまたはペイロードとして追加 (バイナリ blob をペイロードとして渡すのが最善ですが、よくわかりません) PhoneGap がこれを許可する場合)

クライアント側: base64 からデコード (文字列からバイナリへ) -> protobuf (バイナリから解析) -> コード内でできる限り深く protobuf オブジェクトを直接使用 - これは非常に効率的なデータ モデルです

于 2012-11-29T18:32:26.817 に答える