Intereting Posts
Ошибка после обновления Samsung | Monogame | Обнаружение вида view.height как ширина устройства Разрешения для диспетчера местоположений Android, которые будут использоваться Является ли неизменяемым Bitmap быстрее, чем измененным? Синтаксис Android Sqlite IN, NOT IN FFMPEG нажал поток RTMP, не работающий на Android и iPhone Функция Android NDK __android_log_print andLogCat Выпадающая стрелка Android Spinner не отображается Vertex Buffer Objects (VBO) не работает на Android 2.3.3, используя GLES20 Android отменяет Toast при выходе из приложения и когда отображается тост Как включить или отключить GPS программно на Android? Как выполнить AsyncTask <>, расположенный в фрагменте из его родителя? Java.lang.RuntimeException: Невозможно создать экземпляр активности ComponentInfo Ошибки сборки Gradle при интеграции DroidAR в проект студии Android Включить / отключить USB или Wi-Fi-модем программно на Android Android: Theme.Material.Light требует уровня API 21 (текущий минимум 8)

Плагин PhoneGap: самый быстрый способ передачи данных JSON на родной

Я работаю над плагином PhoneGap, чтобы включить WebGL, предназначенный для публикации игр на HTML5 на мобильных устройствах. Это называется WebGLGap . Однако способ PhoneGap для вызова кода плагина (через exec) обычно включает в себя строгую все параметры для JSON, а затем снова разбирает его с другой стороны. Согласно этому вопросу , это не изменилось даже в PhoneGap 2.2, который рекламировался как имеющий более быстрый мост. Для чего-то вроде WebGL это абсолютно несостоятельно и убивает производительность (<10 FPS) даже для простых демонстраций. Это связано с тем, что во многих случаях, особенно в 2D играх, каждый кадр должен передавать большой блок данных JSON, представляющий все команды WebGL для запуска. Это включает в себя все данные вершин – представьте себе огромную строку «0.959455, 0.959595, 0.588575, 0.585858 …» и т. Д. Каждый кадр.

Очевидно, что строгая и синтаксическая обработка является ненужным и неэффективным шагом, но я изо всех сил пытаюсь найти способ передачи данных JSON из JS в native, что позволяет избежать этого. В идеале это должно работать как на Android, так и на iOS, но я счастлив придерживаться только Android-решения. Есть ли у кого-нибудь идеи относительно наиболее эффективного способа сделать это?

Solutions Collecting From Web of "Плагин PhoneGap: самый быстрый способ передачи данных JSON на родной"

Linkedin использует веб-сокеты для своего iPad-приложения. Возможно стоит посмотреть на: http://engineering.linkedin.com/mobile/linkedin-ipad-nativeweb-messaging-bridge-and-websockets

Некоторые из преимуществ, которые вы ищете

  • WebSockets может связываться асинхронно с JavaScript на native.
  • У WebSockets нет предела полезной нагрузки
  • WebSockets не требуют, чтобы мы кодировали наши строки JSON в качестве параметров URL
  • WebSockets должен быть быстрее навигации по схеме URL

Удовлетворение производительности

Глядя на 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, но из каких исследований я собрал, Кордова предоставляет конкретный интерфейс Javascript через addJavascriptInterface . Если бы вы могли реализовать свой собственный NativetoJSMessageQueue , вы могли бы NativetoJSMessageQueue все это вместе.

РЕДАКТИРОВАТЬ
Проведя немного больше исследований, я могу дать немного больше направлений. На самом деле актуальная часть NativetoJSMessageQueue – это различные BridgeModes, которые она реализует (см. Строку 92 ). В качестве примера вы можете посмотреть другие режимы моста.

К сожалению, на NativetoJSMessageQueue зарегистрировано ровно четыре режима моста; Предполагая, что вы можете реализовать свой собственный режим моста, вам все равно нужно каким-то образом зарегистрировать его как новый режим для NativetoJSMessageQueue .

Я не уверен, что именно вы хотите сделать, но я заметил, что в вашем проекте вы конвертируете JSON в String, а затем передаете его через плагин PhoneGap, конвертируете его в JSON, а затем конвертируете в Matrix!

Что, если вы сохраните свои данные в строке и преобразуете строку прямо в Matrix? Таким образом вы можете пропустить преобразование в часть JSON и из нее

На addJavascriptInterface вы можете попробовать использовать метод addJavascriptInterface ( ссылка на WebView ) WebView для «вставки объектов Java в WebView», что является подходом, который использует PhoneGap для добавления apis для геолокации, файловой системы и т. Д.

Я предполагаю, что это будет быстрее, чем использование подхода плагина (еще не проверили это).

Проверьте код PhoneGapView , который расширяет WebView : https://github.com/phonegap/phonegap/blob/3c7324ea8b3944b6e5d3d91e9e328c9c3939464b/android/framework/src/com/phonegap/PhoneGapView.java#L42

ОБНОВИТЬ

В конце концов, это работает только для простых типов, таких как int или String , как вы сказали в комментарии ниже.

Передача объекта JavaScript с помощью addJavascriptInterface () на Android

Попытка сделать иначе приведет к исключениям из классов 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()); } 

И, скорее всего, все параметры должны быть string'fied (или JSON'fied …)

Это может помочь вам, если у вас есть производительность, когда triying создает строки со стороны JavaScript: http://www.javascripture.com/ArrayBuffer

Я читал о данных кодирования в png. Вот оригинальная статья: http://cg.alexandra.dk/2012/11/26/webgl-tutorial-optimizing-data-transfer-for-webgl-applications/

Может быть полезно.

Учитывая, что json очень неэффективен, вы можете получить большую производительность, если вы выполните этот маршрут:

Серверная сторона: модель данных -> protobuf (build () to binary) -> encode base64 (двоичная строка) -> добавить как одно поле json или полезную нагрузку (лучше всего передать бинарный blob как полезную нагрузку, но я не уверен Если PhoneGap разрешает это)

Клиентская сторона: декодировать из base64 (строка в двоичный) -> protobuf (разбор из двоичного) -> использовать объекты protobuf как можно глубже, чем вы можете в своем коде – это чрезвычайно эффективная модель данных