PhoneGap plugin: la forma más rápida de transferir datos JSON a nativo

He estado trabajando en un complemento PhoneGap para habilitar WebGL, destinado a publicar juegos HTML5 para móviles. Se llama WebGLGap . Sin embargo, la manera de PhoneGap de llamar a código de plugin (a través de exec) suele implicar la asignación de todos los parámetros a JSON, luego analizarlo de nuevo en el otro lado. De acuerdo con esta pregunta , esto no ha cambiado incluso en PhoneGap 2.2 que se anunció como tener un puente más rápido. Para algo como WebGL, esto es absolutamente insostenible y mata el rendimiento (<10 FPS) incluso para demos simples. Esto se debe a que en muchos casos, especialmente los juegos 2D, cada trama debe transmitir un gran bloque de datos JSON que representan todos los comandos WebGL para ejecutar. Esto incluye todos los datos de vértice – imagina una cadena enorme de "0.959455, 0.959595, 0.588575, 0.585858 …" etc cada marco.

Obviamente stringifying y analizar es un paso innecesario e ineficaz, pero estoy luchando para encontrar una manera de pasar los datos de JSON de JS a nativo que evita eso. Idealmente, esto debería funcionar tanto en Android como en iOS, pero estoy feliz de seguir una solución sólo para Android por ahora. ¿Alguien tiene alguna idea sobre la forma más eficiente de hacer esto?

Linkedin utiliza Web Sockets para su aplicación iPad. Podría ser digno de mirar en: http://engineering.linkedin.com/mobile/linkedin-ipad-nativeweb-messaging-bridge-and-websockets

Algunos de los beneficios que está buscando

  • WebSockets puede comunicarse asincrónicamente de JavaScript a nativo.
  • WebSockets no tiene un límite de carga útil
  • WebSockets no nos obliga a codificar nuestras cadenas JSON como parámetros de URL
  • WebSockets debería ser más rápido que la navegación de esquema de URL

Abordar el rendimiento

Mirando CordovaPlugin.java , como mencionaste, todo es un String :

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

Si, por ejemplo, la conversión de String a JSONArray es el único cuello de botella, entonces podría anular este método en su complemento y realizar su propia deserialización. Es una pequeña mejora de rendimiento, pero puede ser que valga la pena investigar.

Creación de un puente alternativo

En cuanto a la creación de un puente alternativo, eso es más complicado. No sé mucho sobre Cordova / PhoneGap, pero de qué investigación he reunido, Cordova expone una interfaz específica de Javascript a través de addJavascriptInterface . Si pudieras implementar tu propio NativetoJSMessageQueue , podrías conectarlo todo.

EDITAR
Después de realizar un poco más de investigación, puedo proporcionar un poco más de dirección. La parte realmente relevante de NativetoJSMessageQueue es los diversos BridgeModes que implementa (véase la línea 92 ). Usted podría mirar los otros modos del puente como ejemplo.

Desafortunadamente, el NativetoJSMessageQueue tiene exactamente cuatro modos de puente registrados; Suponiendo que usted podría poner en práctica su propio modo de puente, usted todavía necesitaría algún cómo registrarlo como nuevo modo para el NativetoJSMessageQueue .

No estoy seguro de qué es exactamente lo que quieres hacer pero me doy cuenta de que en tu proyecto estás convirtiendo el JSON en String y luego lo pasarás a través del complemento PhoneGap, lo convertirás en JSON y luego lo convertirás en Matrix!

¿Qué pasa si mantiene sus datos en una cadena y convertir la cadena directamente a Matrix? De esta manera puede omitir la conversión ay desde la parte JSON

En android, puedes intentar usar el addJavascriptInterface ( link to WebView's documentation ) del WebView para "inyectar objetos Java en el WebView", que es el enfoque que PhoneGap usa para agregar los apis para la geolocalización, el sistema de archivos, etc.

Supongo que esto será más rápido que usar el enfoque de complemento (no probar esto todavía).

Compruebe el código del PhoneGapView , que amplía WebView : https://github.com/phonegap/phonegap/blob/3c7324ea8b3944b6e5d3d91e9e328c9c3939464b/android/framework/src/com/phonegap/PhoneGapView.java#L42

ACTUALIZAR

Después de todo, esto sólo funciona para tipos simples como int o String , como dijiste en un comentario a continuación.

Pasar un objeto JavaScript usando addJavascriptInterface () en Android

Intentar hacerlo de lo contrario resultará en excepciones dentro de las clases android.webkit.WebViewCore y android.webkit.JWebCoreJavaBridge .

ACTUALIZAR 2

Bueno, el mejor código que lograrás utilizando este enfoque será algo así (desde 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()); } 

Y muy probablemente, todos los parámetros deben ser string'fied (o JSON'fied …)

Esto podría ayudarle si tiene un rendimiento de éxito cuando triying para crear cadenas de javascript lado: http://www.javascripture.com/ArrayBuffer

He leído sobre la codificación de datos en PNG. Aquí está el artículo original: http://cg.alexandra.dk/2012/11/26/webgl-tutorial-optimizing-data-transfer-for-webgl-applications/

Podría ser útil.

Dado que json es muy ineficiente, puede ganar mucho rendimiento si toma esta ruta:

Lado del servidor: modelo de datos -> protobuf (construir () a binario) -> codificar base64 (binario a cadena) -> añadir como un campo json o payload (lo mejor es pasar blob binario como una carga útil, pero no estoy seguro Si PhoneGap lo permite)

Lado del cliente: decodificar desde base64 (cadena a binario) -> protobuf (analizar desde binario) -> utilizar los objetos protobuf directamente tan profundo como puedas en tu código – es un modelo de datos extremadamente eficiente

  • Deshabilitar los botones de zoom en el inappbrowser de Phonegap
  • Notificación local repetida cada día en PhoneGap Android
  • Phonegap Conexión de red - No se puede leer la propiedad 'tipo' de undefined
  • gap_init llamado de origen restringido
  • Cordova error (ERROR construyendo una de las plataformas)
  • Mensajes de QTAGUID del spam de proyecto Android phonegap
  • Error en la aplicación Phonegap: módulo no capturado cordova / plugin_list ya definido
  • Plugin de geolocalización de Phonegap no agrega para android
  • notificaciones push de Google Chrome android
  • Error: ENOENT, ningún archivo o directorio de este tipo - PhoneGap
  • Phonegap NFC no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.