Java2D图形仅通过OpenGL管道呈现

时间:2017-08-15 04:00:06

标签: java swing opengl direct3d steam

TL; DR:有没有办法迫使Java2D图形只通过OpenGL管道,完全完全忽略Direct3D和DirectDraw(期望的效果:opengl32.dll应该在ddraw.dll之前使用) ?

我创建了一个使用Java和Swing的游戏,目的是在Steam上发布。出现了一个问题:蒸汽覆盖层没有出现。在询问discussion(大多数人无法查看,继续阅读要点)之后,确定了问题的可能来源。游戏正在OpenGL之前初始化Direct3D和DirectDraw,并且叠加层正在连接到第一个,但OpenGL是蒸汽叠加层支持的加速类型。

如果不使用Direct3D和DirectDraw,有望解决问题。这样蒸汽覆盖层不会首先尝试挂钩它们,只是挂钩到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管道进行Java2D,以便蒸汽覆盖层将挂钩到OpenGL设备。在使用ddraw.dll之前正在使用opengl32.dll(直接抽奖)(这使得叠加尝试并且无法挂钩到ddraw.dll,因为它首先被使用) 。我试图让它不使用ddraw.dll,因此它只会尝试挂钩opengl32.dll

旁注:在使用OpenGL与标准Java2D时,我没有注意到任何差异。我正在获取支持OpenGL管道的消息(上图),但是它有可能仍然没有以某种方式使用它吗?

1 个答案:

答案 0 :(得分:1)

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