LWJGL glfwPollEvents блокирует основной цикл libGDX в macOS

Хотя моя игра на основе Lwjgl3Application отлично работает в Windows и различных дистрибутивах Linux, на macOS у меня появляется только черный экран. Похоже, вызов glfwPollEvents вообще не возвращает результат, что блокирует основной цикл (см. stacktrace).

Я попытался предоставить минимальный пример, но проблема не возникает в новом проекте libGDX, использующем те же версии.

Stacktrace (приложение не вылетает, но зависает):

invokeV:-1, JNI (org.lwjgl.system)
glfwPollEvents:3438, GLFW (org.lwjgl.glfw)
loop:199, Lwjgl3Application (com.badlogic.gdx.backends.lwjgl3)
<init>:167, Lwjgl3Application (com.badlogic.gdx.backends.lwjgl3)
main:43, DesktopLauncher

Версии:

  • Ява 11
  • macOS Сонама 14.5
  • libGDX 1.12.1
  • lwjgl 3.3.3

Редактировать:

  • Я использую -XstartOnFirstThread, чтобы запустить его, чтобы он работал в основном потоке.
  • Toolkit.getDefaultToolkit().systemClipboard не вызывается ни в проекте, ни что-либо еще для java.awt или подобного

Вы звоните из основного потока?

ALUFTW 04.07.2024 14:20

Кроме того, вы вызывали Toolkit.getDefaultToolkit().systemClipboard где-то до этого? Иногда на Mac с libgdx, когда вы вызываете его, зависают события следующего опроса.

ALUFTW 04.07.2024 14:22

спасибо, что спросили. В macOS для запуска мне нужно использовать аргумент командной строки -XstartOnFirstThread. Я адаптирую вопрос, так как это может быть важно

Sebastian 04.07.2024 14:23

Я не могу найти Toolkit.getDefaultToolkit().systemClipboard нигде в своем коде. Но я проведу расследование, если одна из библиотек каким-то образом позвонит.

Sebastian 04.07.2024 14:27

Попробуйте посмотреть звонки из этой библиотеки/района. Иногда один из этих вызовов может заблокировать следующее событие опроса. Я видел это слишком много раз.

ALUFTW 04.07.2024 14:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я удалил части приложения одну за другой и смог свести его к TexturePacker, который я запускал специально (только для целей разработки) в своем DesktopLauncher перед запуском игры. Пропуск этого шага решает проблему.

Я еще не отладил его достаточно глубоко, чтобы найти точное место в TexturePacker, вызывающее проблему, но я видел, что он использует пакет java.awt, который также предоставляет проблемный Toolkit.systemClipboard, упомянутый ALUFTW.

(Что касается голосов «за» и «против» по ​​этому вопросу. Я согласен, что для решения проблемы недостаточно информации, но, возможно, вопрос и мой ответ помогут кому-то решить подобные проблемы в будущем, поэтому я решил не удалять его. )

Другие вопросы по теме