Javafxports, androidNativeAudio и gluon для игр для Android с сильным режимом реального времени

Я доработал видеоигру для Android-смартфонов, которая отлично работает, когда Real Time не слишком силен (т.е. игрок предоставляет событие каждую секунду). Но, когда я использую его «с решимостью как гик», возникает ошибка вне моего кода JavaFX (примерно каждые 15-20 минут).

Архитектура моего ПО проста: цикл активируется каждые 110 мс, датчик акселерометра и класс AndroidNativeAudio для звуков.

Я добавил некоторые трассировки отладки:

  • в начале и в конце цикла,

  • некоторые следы в AndroidNativeAudio и датчике (необязательно).

В этих условиях я заметил, что трассировка ошибки находится ВНЕ моего кода (цикл + акселерометр) и кода AndroidNativeAudio: в трассировке упоминается, что мой код полностью выполнен до возникновения ошибки. Итак, я застрял.

Вы уже сталкивались с такой проблемой с Javafx в игре в реальном времени, работающей на Android-смартфоне?

Где я могу получить исходный код JavaFxPorts (включая MediaPlayer) с трассировкой отладки javafxports, чтобы попытаться понять источник проблемы?

Если я не найду источник проблемы, перенос моего кода JavaFX (20 000 строк Javafx) на Java в студии Android может стать возможным (но это будет тяжелая работа, которой я бы хотел избежать).

Спасибо за ваш отзыв

Примечание. Параметр компилятора для обнаружения некоторой утечки памяти в моем коде установлен, и в настоящее время проблем с кодом нет.


Дополнительная информация: исключение FATAL систематически возникает с этим сообщением (вне моего кода, т.е. после окончания обработки внутри цикла 110 мс):

E/AndroidRuntime (14369): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: поток приложения JavaFX

E/AndroidRuntime(14369): Процесс: com.gluonapplication, PID: 14369

E/AndroidRuntime (14369): java.lang.ArrayIndexOutOfBoundsException: длина = 20; индекс=-1

E/AndroidRuntime(14369): в java.util.ArrayList.get(ArrayList.java:310)

E/AndroidRuntime (14369): в javafx.scene.Parent.updateCachedBounds (Parent.java:1583)

E/AndroidRuntime(14369): в javafx.scene.Parent.recomputeBounds(Parent.java:1527)

E/AndroidRuntime(14369): в javafx.scene.Parent.impl_computeGeomBounds(Parent.jav


person Pascal DUTOIT    schedule 03.08.2017    source источник
comment
Вы можете найти исходный код конкретного JavaFXPorts здесь, но на Android нет JavaFX Media, поэтому вы используете класс AndroidNativeAudio. Вы можете добавить туда отладочную информацию.   -  person José Pereda    schedule 07.08.2017
comment
Хосе: Я ищу исходный код JavaFXPorts, уже включающий системный вывод для отладки. Моя цель — заменить API отладочным API. Таким образом, я мог протестировать свою игру со ВСЕМИ отладочными слоями и определить местонахождение проблемы. У меня недостаточно навыков для понимания всех концепций, используемых в исходном коде JavaFXports, полезного для добавления разумного println   -  person Pascal DUTOIT    schedule 12.08.2017
comment
Такого отладочного API нет (вся отладочная информация уже добавлена ​​и доступна, например, см. тег FXEntity). Вы можете разветвить репо и добавить его перед сборкой, но это далеко не тривиальная задача. Вместо этого вы можете отлаживать приложение (см. это) , добавляя в свой код как можно больше журналов.   -  person José Pereda    schedule 12.08.2017
comment
После многих исследований кажется, что когда я искусственно замедляю обработку, добавляя много отладочных трассировок, проблема (исключение FATAL) исчезает. Итак, я подозреваю проблему в реальном времени в API JavaFX, когда два параллельных потока обращаются к одним и тем же данным, что связано с проблемой индекса таблицы (см. добавленную трассировку выше). Идея поиска в этом направлении?   -  person Pascal DUTOIT    schedule 18.08.2017
comment
Хосе: вы знаете, сколько потоков на уровне JavaFX и каковы они (имя, приоритет, ...)?   -  person Pascal DUTOIT    schedule 18.08.2017
comment
Я не могу сказать. Вы постоянно находите это исключение AIOOB. Возможно, стоит еще раз проверить причины, по которым это может произойти.   -  person José Pereda    schedule 18.08.2017
comment
Я использую jfxdvk-8.60.8 и jre1.8.0_66.   -  person Pascal DUTOIT    schedule 20.08.2017
comment
Хосе: похоже, патч для JavaFX8 решает аналогичную проблему. См. раздел bugs.openjdk.java.net/browse/JDK-8096304. : E/AndroidRuntime (16193): java.lang.ArrayIndexOutOfBoundsException: длина = 45; index=-1 ..... E/AndroidRuntime(16193): at java.util.ArrayList.get(ArrayList.java:310)..... E/AndroidRuntime(16193): at javafx.scene.Parent. updateCachedBounds(Parent.java:1583). Если вы согласны, какая официальная версия jar JFX может решить эту проблему ИЛИ (что сложнее) как создать собственный jar JavaFX, как указано в hg.openjdk.java.net/openjfx/8u-dev/rt/rev/eb251121a360? Спасибо   -  person Pascal DUTOIT    schedule 20.08.2017
comment
Упомянутый вами патч уже добавлен в файл jfxdvk. Таким образом, эта проблема не связана, но исключение может произойти по другим причинам.   -  person José Pereda    schedule 21.08.2017
comment
Я согласен с вами: я заменил jdk 66 на jdk 141, .. безуспешно   -  person Pascal DUTOIT    schedule 21.08.2017
comment
Я использую версию javafxports 8.60.8. Может ли версия 8.60.9 решить проблему?   -  person Pascal DUTOIT    schedule 21.08.2017
comment
В любом случае вам следует использовать 8.60.9, так как он содержит последние изменения, но, как я указал выше, он по-прежнему зависит от 8u60. Кроме того, ваш локальный JDK не имеет значения, JavaFX добавляется из jar-файла jfxdvk.   -  person José Pereda    schedule 21.08.2017
comment
Проблема решена :) TimerTask и периодическая обработка использовали один и тот же экземпляр, но иногда этот экземпляр удалялся обработкой, тогда как TimerTask все еще хотел его использовать. Немного сложно исследовать эту ошибку среди 20 000 строк кода Java, потому что подробная трассировка не указывала на источник проблемы, а только на общую ошибку индекса массива. Возможно, это связано с тем, что этот экземпляр использовался двумя разными типами классов. В любом случае, спасибо за вашу помощь. Теперь моя игра может работать более 8 часов без ошибок :)   -  person Pascal DUTOIT    schedule 03.09.2017
comment
Рад, что вы наконец решили это!   -  person José Pereda    schedule 03.09.2017
comment
Хосе: Я могу закончить об использовании JavaFX в играх для Android. Переходы JavaFX (Parallel, Path, Scale, Fade, Sequential, Rotate, Translate) немного нарушают реальное время. Я могу это утверждать, потому что создавал игру на ПК со всеми этими переходами. Итак, когда я перенес его на Android, я заметил некоторые проблемы со временем отклика. Постепенно, изменяя все эти переходы (кроме Rotate и Translate) последовательной обработкой (110 мс), время выполнения было улучшено с 360 мс до 60 мс. Возможно, в JavaFxPorts было бы интересно создать классы переходов, которые работают последовательно. –   -  person Pascal DUTOIT    schedule 12.09.2017