Я создал приложение JavaFX (работающее в Ubuntu, Java(TM) SE Runtime Environment (сборка 1.8.0_131-b11)) и сделал простое тестовое приложение:
public class DelayedSceneApplication extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Test");
primaryStage.setResizable(false);
// Root.
BorderPane root = new BorderPane();
Scene scene = new Scene(root);
primaryStage.setScene(scene);
// Buttons box.
HBox buttonBox = new HBox();
buttonBox.setPadding(new Insets(10));
buttonBox.getChildren().addAll(new Button("Test"));
root.setBottom(buttonBox);
primaryStage.show();
}
}
Проблема в том, что иногда после показа сцены сцена не загружается. Иногда для отображения кнопки требуется одна секунда, иногда более 20 секунд. Когда сцена еще не была показана, и при нажатии на сцену кнопка отображается немедленно. Опять же, иногда кнопка отображается правильно при запуске. Происходит это, как упоминалось, случайно. Чтобы воспроизвести это поведение, необходимо несколько раз перезапустить приложение. Где я сделал ошибку? Это ошибка? Возможно, это невозможно воспроизвести в другой среде (Windows, другая версия JAVA, ...)?
Большое спасибо!
Обновление: вывод с параметром -Dprism.verbose=true
:
Prism pipeline init order: es2 sw
Using java-based Pisces rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
succeeded.
GLFactory using com.sun.prism.es2.X11GLFactory
(X) Got class = class com.sun.prism.es2.ES2Pipeline
Initialized prism pipeline: com.sun.prism.es2.ES2Pipeline
Maximum supported texture size: 16384
Maximum texture size clamped to 4096
Non power of two texture support = true
Maximum number of vertex attributes = 16
Maximum number of uniform vertex components = 16384
Maximum number of uniform fragment components = 16384
Maximum number of varying components = 128
Maximum number of texture units usable in a vertex shader = 32
Maximum number of texture units usable in a fragment shader = 32
Graphics Vendor: Intel Open Source Technology Center
Renderer: Mesa DRI Intel(R) Kabylake GT2
Version: 3.0 Mesa 17.0.3
vsync: true vpipe: true
ES2ResourceFactory: Prism - createStockShader: FillPgram_Color.frag
new alphas
ES2ResourceFactory: Prism - createStockShader: Texture_Color.frag
ES2ResourceFactory: Prism - createStockShader: Texture_LinearGradient_PAD.frag
ES2ResourceFactory: Prism - createStockShader: Solid_TextureRGB.frag
ES2ResourceFactory: Prism - createStockShader: Solid_TextureFirstPassLCD.frag
ES2ResourceFactory: Prism - createStockShader: Solid_TextureSecondPassLCD.frag
-Dprism.verbose=true
? Вы также можете попробовать обновить графические драйверы или отключить аппаратное ускорение с помощью-Dprism.order=sw
, чтобы посмотреть, поможет ли это. - person Itai   schedule 25.07.2017-Dprism.order=sw
as при упаковке приложения, чтобы гарантировать, что оно работает везде? Или это обескураживает? Вы можете опубликовать свой комментарий как ответ на этот вопрос, после чего я могу отметить его как правильный. Еще раз спасибо! - person Rolch2015   schedule 27.07.2017-Dprism.order=sw
полностью отключает аппаратное ускорение, поэтому производительность будет страдать — в лучшем случае это обходной путь, но, вероятно, его следует использовать только для диагностики. На мой взгляд, включать его в качестве варианта выпуска по умолчанию — не лучшая идея. Вы должны попытаться найти основную причину, чтобы действительно решить ее, однако я не совсем уверен, как это сделать. Включение вывода при работе с-Dprism.verbose=true
(но безorder=sw
) может дать дополнительные подсказки. - person Itai   schedule 27.07.2017-Dprism.verbose=true
- person Rolch2015   schedule 27.07.2017