如何在JavaFX中禁用或绕过硬件图形加速(Prism)

Lal*_* J. 18 java opengl javafx

操作系统:OSX Mountain Lion.

系统:虚拟BOX 4.2.6.

Java:1.7.0.40-ea-b34

我想为我的JAVAFX应用程序禁用硬件加速,因为我的系统(mac)上没有硬件加速.因此,当没有硬件加速时,我在执行我的JAVAFX应用程序时遇到致命错误.这个错误与"Prism Engine管道"有关,它发生在java试图执行openGL本机库时.所以我想禁用棱镜.

我看到有一些控制棱镜行为的vm args就像...... Dprism.forceGPU = true;

是否有类似上面禁用棱镜或openGL请求的东西?

致命错误(openGl相关代码)

Stack: [0x000000016c8f9000,0x000000016c9f9000], sp=0x000000016c9f7f40, free space=1019k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libobjc.A.dylib+0x639f] objc_msgSend_fixup+0x5f
C [AppKit+0x28134c] -[NSOpenGLContext initWithFormat:shareContext:]+0xac
C [libprism-es2.dylib+0x4e9f] createContext+0x1b3
C [libprism-es2.dylib+0x4729] Java_com_sun_prism_es2_gl_mac_MacGLFactory_nInitialize+0xa2
j com.sun.prism.es2.gl.mac.MacGLFactory.nInitialize([I)J+0
j com.sun.prism.es2.gl.mac.MacGLFactory.initialize(Ljava/lang/Class;Lcom/sun/prism/es2/gl/GLPixelFormat$Attributes;)Z+73
j com.sun.prism.es2.ES2Pipeline.<clinit>()V+54 
Run Code Online (Sandbox Code Playgroud)

Pet*_*etr 32

j2d图形管道在JavaFX 8中已被弃用,因此最好使用软件管道:-Dprism.order=sw.要验证您实际使用它,您可以打开日志记录:-Dprism.verbose=true

  • 旧答案,但仍然非常有价值!在我的 JavaFx 应用程序上,通过设置 `-Dprism.order=sw` 在 Linux Debian 下的 Java 11 上,CPU 负载减少了大约 20%(在静止状态下 CPU 负载为 20-25%,现在低于 5%)。`-Dprism.verbose=true` 报告使用 `es2` 作为首选。 (2认同)

zen*_*eni 12

看看这个论坛:https://forums.oracle.com/message/11018975

将此添加到您的Java执行:

-Dprism.order=j2d
Run Code Online (Sandbox Code Playgroud)

这应该够了吧.

  • 请注意,从https://bugs.openjdk.java.net/browse/JDK-8095989开始不推荐使用,您应该使用`-Dprism.order = sw`,它使用软件仿真管道而不是DirectX 2D管道. (3认同)