有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    据我所知,您使用的选项仅适用于AWT,而不适用于JavaFX。所以JavaFX确实可能是这里的问题。由于您没有使用任何JavaFX图形,因此通过-Dprism.order=sw关闭JavaFX的硬件加速可能会有所帮助。为了验证您实际上没有使用它,您也可以通过-Dprism.verbose=true打开日志记录。我不确定这是否有用,但至少值得一试