Java2D图形只能通过OpenGL管道渲染

问题描述:

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

我创建了一个使用Java和Swing的游戏,目的是在蒸汽上发布。出现了一个问题:蒸汽覆盖层没有出现。在询问这个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被编程为使能,因为这是蒸汽API可在此之前一个OpenGL装置的初始化被初始化的唯一方式:

//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也用于游戏,但纯粹用于音频。没有图形被初始化。我不确定这是否会导致问题或冲突。

总结:

我想只能使用Java2D的OpenGL的管线使蒸汽覆盖将钩在OpenGL的设备。 ddraw.dll(直接绘制)正在使用之前opengl32.dll使用(使覆盖尝试和无法挂接到ddraw.dll,因为它被首先使用)。我试图让它不使用ddraw.dll,所以它只会试图挂钩到opengl32.dll

备注:使用OpenGL和标准Java2D时我没有注意到任何差异。我得到了OpenGL管道启用的消息(上图),但它有可能还没有使用它?

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

+0

这并没有解决问题。 'draw.dll'仍然被某些东西使用。我需要以某种方式找出正在使用它的东西。以某种方式删除“ddraw.dll”是否合理?这样,无论什么需要,它都会抛出一个堆栈跟踪,让我追溯并找出正在使用它的东西。 – olta8