我只使用桌面应用程序,没有移动设备。
我正在尝试让用户在运行时设置屏幕分辨率。我给了他可用的显示模式,他应用了一种。这部分实际上是有效的。当我保存此模式并尝试在下次启动游戏时设置此显示模式时,会出现问题。
我使用首选项来存储用户选择的模式。在我的游戏类中的Create方法之前,或者在DesktopLauncher对象中,我无法访问首选项,您通常在这些对象中设置配置文件并将其传递到应用程序中。所以我的DesktopLauncher看起来像这样。
val config = Lwjgl3ApplicationConfiguration()
config.setFullscreenMode(Lwjgl3ApplicationConfiguration.getDisplayMode())
Lwjgl3Application(MainGame(), config)我在创建应用程序时使用当前的屏幕分辨率。然后在我的MainGame类的Create方法中,我得到了他们从preferences中设置的模式,我这样设置它……
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])
}
....
}总而言之,我得到了模式列表,我从preferences中提取上一次设置的内容,并根据preferences中的内容过滤列表。这应该会在列表中留下一项,我会应用它。如果由于某种原因列表是空的,那么我不会设置它,或者没有设置首选项,我只是再次应用当前模式。
这是奇怪的事情发生的地方。我在创建屏幕和相机时检查了所有的数字,它们都是正确的。我确实收到了正确的分辨率,但应用程序不能正确呈现。下面是发生了什么的几个例子。

在第一张图片中,您可以看到应用程序在屏幕上的边界。我的应用程序只在下角渲染,其余的是黑色的。为了实现这个效果,我以比我的原始分辨率更小的分辨率启动了应用程序,因此在我的create方法中,在构建应用程序的其余部分之前,我将应用程序的全屏模式设置为1920x1080。我检查了我的相机和视口,它们的分辨率都是1920x1080,但图像并没有填满整个屏幕。
还有一秒。

这是我反转设置时发生的情况。因此,我从本机分辨率1920x1080开始,在我的create方法中,再次将其设置为1280x1024,然后再创建应用程序的其余部分。这在图像的两边都有黑条,比如id expect,但是应用程序很大,只有一部分可以放在窗口中,其余的超出了边界,如虚线所示。
它将一直保持这种状态,除非我在应用程序运行时更改了分辨率,否则它将在应用程序的剩余生命周期中进行自我修正。
我对我所得到的这种影响感到困惑,我正在寻找一个答案来解释为什么,或者如何修复它。
发布于 2019-08-18 06:25:12
我找到了导致图像渲染不正确的问题。我在我的主游戏类的create()函数中设置了显示模式。此函数不在呈现线程上运行,并且您不希望在呈现线程以外的任何线程上使用Gdx.graphics,如libgdx wiki https://github.com/libgdx/libgdx/wiki/Threading中所述
有一个函数,你可以传入一个在渲染线程上运行的lambda。
Gdx.app.postRunnable { Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode(modes[0])) }
在将其传递到postRunnable中之后,游戏在启动时会正确呈现。
https://stackoverflow.com/questions/56308283
复制相似问题