Проблема рендеринга Java 8 Swing с Intel HD 3700 linux - PullRequest
0 голосов
/ 18 октября 2018

Я разработал приложение в Java 18 обновление 181 в Kubuntu 18.04.На моем ПК для разработки у меня Intel i3-6100 с Intel® HD Graphics 530. Вся графика выполняется с использованием Swing, и с этой аппаратной конфигурацией все работает как надо.

На рабочем ПК у меня естьПроцессор Intel® Celeron®® J1900 с технологией Intel® HD Graphics для процессоров Intel Atom® серии Z3700.Работая так же с той же ОС и версией Java, я заметил проблемы с моей графикой, сделанной в Swing.

  1. Компоненты Swing, такие как jLabels, jButton и т. Д., Не обновляются.Например, кадр A имеет метку B с текстом «Старый текст», я обновляю текст на метке B текстом «Новый текст», затем вызываю setVisible (true) для кадра A, рамка становится видимой с текстом «Старый».текст".Это происходит не каждый раз, иногда происходит обновление, иногда нет.Это все еще происходит в случае, когда я добавил SwingUtilities отдельно от своего решения, упомянутого ниже.
  2. В ярлыках, где у меня анимация .gif не работает нормально, или они зависают.
  3. Замена активнакадры (заметно изменяющиеся на втором значении true и на первом значении false) имеют некоторые задержки.
  4. Через некоторое время приложение с графическим интерфейсом зависает и продолжает работать через некоторое время, иногда через несколько минут.иногда через несколько секунд.

Поэтому, выполнив поиск на многих форумах, я внес следующие изменения в свое приложение

  1. Начал использовать SwingUtilities.invokeLater () или SwingUtilities.invokeAndWait () (где я хочу что-то изменить, прежде чем показывать это, например, если цена за услугу составляет 80,00 обновления, а затем показать ее) везде, где я обновляю свои компоненты GUI.
  2. После каждого обновления компонента iвызовите component.revalidate () и component.repaint () или repaint (50).
  3. Каждый раз, когда я вызываю frame.setVisible (status) Я жду сигнала из windowListener о том, что фрейм активирован и открыт, или деактивирован и закрыт в зависимости от вызова со значением true или false в качестве статуса.
  4. После того, как все еще возникают проблемы с компонентами свинга, не обновляемыми Iпопытался установить видимую рамку и затем обновить все ее компоненты.Это работает отлично в течение некоторого времени в начале, но через некоторое время я заметил, что иногда компоненты снова не обновляются.Это уродливый обходной путь, который иногда работает, потому что вы можете видеть, что содержимое меняется на кадре, когда рамка видна.
  5. Я читал, что есть проблема с графическим аппаратным ускорением на Intel HD 3000 Series, поэтому на некоторыхна форумах я прочитал, что я должен вызывать свое приложение с параметрами виртуальной машины -Dsun.java2d.d3d = false и -Dsun.java2d.opengl = True.Таким образом, изображение становится немного более плавным, но после (не идеального) промежутка времени между 12 и 24 часами изображение зависает примерно на 5 минут, ничего не обновляя.
  6. На некоторых форумах я видел, что пользователь удалилэта проблема с переходом с java 8 на java 7 (это требует модификации моего кода и других кодов от моих коллег, по моим оценкам, по крайней мере, 2 месяца), и на некоторых форумах я видел, что переход на java 8 update 25 помогает решить эту проблему.Я попытался выполнить понижение до java 8 update 25, и графика и анимация стали плавнее, но через некоторое время (24 часа в последний раз) приложение начало зависать.
  7. Я проверил, есть ли в моей ОСпоследняя версия графики Intel HD и имеет OpenGL версии 3.0 Mesa 18.0.5.

Кроме того, я видел много проблем с игрой Minecraft, работающей с Java 8 на Intel HD.

У меня нет большого опыта работы с java GUI, но я не понимаю, как он работает с одним графическим процессором Intel HD, а с другим - нет.Написать один раз запустить где-нибудь концепции Java не удалось мне на этот раз.

// РЕДАКТИРОВАТЬ 2018-11-02 FinПришла моя мини-карта pci-e на карту pci-e, которую я заказал на aliexpress, но графика все еще дает сбой.Не знаю, что попробовать дальше.Я предполагаю, что все графические изображения выполняются процессором, а не моей картой NVIDIA или Intel HD графика.

1 Ответ

0 голосов
/ 18 октября 2018

Существует известная ошибка: https://bugs.openjdk.java.net/browse/JDK-8067328. Oracle рекомендует отключить D3D (они отключили его по умолчанию в 8_40).

В этой статье описывается та же проблема и способ ее устранения наконец: https://yakovfain.com/2014/06/27/swing-rendering-seems-to-be-broken-in-java-8/

...