【问题标题】:Java2D Graphics Render Only Through OpenGL PipelineJava2D 图形仅通过 OpenGL 管道渲染
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 这并没有解决问题。 draw.dll 仍在被某些东西使用。我需要以某种方式弄清楚它在使用什么。以某种方式删除ddraw.dll 是否合理?这样无论什么需要它都会抛出一个堆栈跟踪,让我可以追溯它并识别正在使用它的东西。
    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2020-12-21
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2011-12-08
    • 2011-11-13
    相关资源
    最近更新 更多