首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Libgdx,在运行时设置全屏分辨率会导致应用程序以错误的大小呈现

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

Stack Overflow用户
提问于 2019-05-26 04:01:37
回答 1查看 827关注 0票数 2

我只使用桌面应用程序,没有移动设备。

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

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

代码语言:javascript
复制
val config = Lwjgl3ApplicationConfiguration()
config.setFullscreenMode(Lwjgl3ApplicationConfiguration.getDisplayMode())
Lwjgl3Application(MainGame(), config)

我在创建应用程序时使用当前的屏幕分辨率。然后在我的MainGame类的Create方法中,我得到了他们从preferences中设置的模式,我这样设置它……

代码语言:javascript
复制
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,但是应用程序很大,只有一部分可以放在窗口中,其余的超出了边界,如虚线所示。

它将一直保持这种状态,除非我在应用程序运行时更改了分辨率,否则它将在应用程序的剩余生命周期中进行自我修正。

我对我所得到的这种影响感到困惑,我正在寻找一个答案来解释为什么,或者如何修复它。

EN

回答 1

Stack Overflow用户

发布于 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中之后,游戏在启动时会正确呈现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56308283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档