java Java2D图形仅通过OpenGL管道渲染
TL;DR:有没有办法强迫Java2D图形只通过OpenGL管道,完全忽略Direct3D和DirectDraw(理想效果:opengl32.dll
应该在ddraw.dll
之前使用)
我用Java和Swing创建了一个游戏,目的是在steam上发布。出现了一个问题:蒸汽覆盖层没有出现。在本discussion中询问(大多数人无法查看,请继续阅读要点)后,确定了问题的可能来源。游戏在OpenGL之前初始化了Direct3D和DirectDraw,覆盖层与第一个连接,但是OpenGL是steam覆盖层支持的加速类型
如果不使用Direct3D和DirectDraw,问题有望得到解决。这样一来,steam覆盖层就不会首先尝试连接到它们,而只是连接到OpenGL
我尝试了以下标志来禁用Direct3D和DirectDraw:
-Dsun.java2d.d3d=false -Dsun.java2d.ddoffscreen=false -Dsun.java2d.noddraw=true
这没有产生明显的效果(仍在使用ddraw.dll
)
OpenGL是以编程方式启用的,因为这是在OpenGL设备初始化之前初始化steam API的唯一方法:
//init steam api here. api init is required before OpenGL device init
System.out.println("The api was initialized successfully")
System.setProperty("sun.java2d.opengl", "True");
//continue with the game initialization, creates a frame, game loop, callbacks, etc.
控制台输出:
The api was initialized successfully
OpenGL pipeline enabled for default config on screen 0
值得注意的是,JavaFX也用于游戏中,但纯粹用于音频。没有初始化任何图形。我不确定这是否会导致问题或冲突
总之:
我正在尝试只使用OpenGL管道for Java2D,以便steam覆盖将连接到OpenGL设备ddraw.dll
(直接绘制)是在使用opengl32.dll
之前使用的(这样做是为了让覆盖层尝试连接到ddraw.dll
,因为它是先使用的)。我试图让它不使用ddraw.dll
,这样它只会尝试连接到opengl32.dll
旁注:我没有注意到使用OpenGL和标准Java2D有什么不同。我收到了OpenGL pipeline enabled消息(见上图),但它是否仍然没有以某种方式使用它
# 1 楼答案
据我所知,您使用的选项仅适用于AWT,而不适用于JavaFX。所以JavaFX确实可能是这里的问题。由于您没有使用任何JavaFX图形,因此通过
-Dprism.order=sw
关闭JavaFX的硬件加速可能会有所帮助。为了验证您实际上没有使用它,您也可以通过-Dprism.verbose=true
打开日志记录。我不确定这是否有用,但至少值得一试