Libgdx,在运行时设置全屏分辨率会导致应用程序以错误的大小渲染

Libgdx,在运行时设置全屏分辨率会导致应用程序以错误的大小渲染,libgdx,screen-resolution,Libgdx,Screen Resolution,我只使用桌面应用程序,没有手机 我正在尝试让用户在运行时设置屏幕分辨率。我给了他可用的显示模式,他应用了一种。这部分实际上是有效的。当我保存此模式并在下次启动游戏时尝试设置此显示模式时,问题就会出现 我正在使用首选项存储用户选择的模式。在我的游戏类中,或者在DesktopLauncher对象中,在创建方法之前,我无法访问首选项,您通常在其中设置配置文件并将其传递到应用程序中。所以我的DesktopLauncher看起来像这样 val config = Lwjgl3ApplicationConfi

我只使用桌面应用程序,没有手机

我正在尝试让用户在运行时设置屏幕分辨率。我给了他可用的显示模式,他应用了一种。这部分实际上是有效的。当我保存此模式并在下次启动游戏时尝试设置此显示模式时,问题就会出现

我正在使用首选项存储用户选择的模式。在我的游戏类中,或者在DesktopLauncher对象中,在创建方法之前,我无法访问首选项,您通常在其中设置配置文件并将其传递到应用程序中。所以我的DesktopLauncher看起来像这样

val config = Lwjgl3ApplicationConfiguration()
config.setFullscreenMode(Lwjgl3ApplicationConfiguration.getDisplayMode())
Lwjgl3Application(MainGame(), config)
我在创建应用程序时使用当前屏幕分辨率。然后在我的MainGame类中的Create方法中,我得到了他们从首选项中设置的模式,我这样设置它

override fun create() {
    var modes = Gdx.graphics.displayModes.toList()
    val mode = Gdx.graphics.displayMode   

    val preference: Preferences = Gdx.app.getPreferences("screenPreference")
    val screenWidth = preference.getInteger("width", mode.width)
    val screenHeight = preference.getInteger("height", mode.height)
    val refreshRate = preference.getInteger("refreshRate", mode.refreshRate)

    modes = modes.filter { it.width == screenWidth }
    modes = modes.filter { it.height == screenHeight }
    modes = modes.filter { it.refreshRate == refreshRate }

    if (modes.isNotEmpty()) {
        Gdx.graphics.setFullscreenMode(modes[0])
    }
    ....
}
总之,我得到了模式列表,我从首选项中提取最后设置的模式,并根据首选项中的模式过滤列表。这将在列表中留下一项,我将应用它。如果由于某种原因列表为空,那么我不会设置它,或者没有首选项集,我只会再次应用当前模式

这就是奇怪的事情发生的地方。我在创建屏幕和相机时检查了所有的数字,它们都是正确的。我确实收到了正确的分辨率,但应用程序渲染不正确。下面是发生了什么的几个例子

在第一个图像中,您可以看到应用程序与屏幕的界限。我的应用程序只在下角渲染,其余部分为黑色。实现这种效果的方法是,我以比本机分辨率更小的分辨率(1280x1024)启动应用程序,然后在创建方法中将应用程序全屏模式设置为1920x1080,然后再构建应用程序的其余部分。我检查了我的相机和视口,它们的分辨率都是1920x1080,但图像并没有填满整个屏幕

等一下

这是我反转设置时发生的情况。因此,我从本机分辨率1920x1080开始,在创建方法中将其设置为1280x1024,然后再创建应用程序的其余部分。这让我在图像的两侧都看到了像我所期望的那样的黑条,但是应用程序非常庞大,只有一部分可以放在窗口中,其余部分超出了范围,如虚线所示

整个过程都是这样,除非在应用程序运行时更改分辨率,否则它将在应用程序的剩余生命周期中进行自我纠正


我被我得到的这种效果弄糊涂了,我正在寻找一个关于为什么或者如何修复它的答案。

我发现了导致图像渲染错误的问题。我在主游戏类的create()函数中设置显示模式。此函数不在渲染线程上运行,并且您不希望在渲染线程以外的任何对象上使用Gdx.graphics,如libgdx wiki中所述

有一个函数,您可以在其中传递lambda以在渲染线程上运行

Gdx.app.postRunnable{
Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode(模式[0]))
}


将其传递到postRunnable后,游戏在启动时正确渲染。

您是否在屏幕的resize()方法中更新了视口或相机?@Morchul是的,我在resize()方法中更新了视口和相机。正如我在问题中所述,我的相机和视口在打印时具有正确的数据,但它们仍然渲染不正确。延迟
setFullScreenMode
对您有所帮助,但您说:“我在主游戏类的create()函数中设置了显示模式。此函数不是在渲染线程上运行的”这不是真的。游戏类中的所有内容都称为内部渲染线程。我刚刚在源代码中看到:-)