【发布时间】:2018-01-22 23:40:31
【问题描述】:
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 也用于游戏中,但纯粹用于音频。没有任何图形被初始化。我不确定这是否会导致问题或冲突。
总结:
我正在尝试仅对 Java2D 使用 OpenGL 管道,以便 Steam 覆盖将连接到 OpenGL 设备。 ddraw.dll(直接绘制)在使用 opengl32.dll 之前被使用(使得覆盖层尝试并未能连接到 ddraw.dll,因为它首先被使用)。我试图让它不使用ddraw.dll,这样它只会尝试连接到opengl32.dll。
旁注:我没有注意到使用 OpenGL 与标准 Java2D 的任何区别。我收到了启用 OpenGL 管道的消息(上图),但它是否可能仍然没有以某种方式使用它?
【问题讨论】:
标签: java swing opengl direct3d steam