如何使用SDL2获取屏幕分辨率?

7
我正在使用像素完美的源图像和SDL2制作程序。当设置为全屏时,我希望它使用本地分辨率(SDL_WINDOW_FULLSCREEN_DESKTOP标志),但只在某个最小分辨率和合理的最大分辨率之间,之后它将从最大的合法分辨率进行拉伸。问题是我只能在SDL2文档中找到有关程序自身窗口或程序大小的参考。
SDL中是否有任何函数可以至少几乎直接检索屏幕的宽度和高度?
或者我应该像使用SDL_WINDOW_FULLCREEN_DESKTOP然后SDL_GetWindowSize(),再重新调整窗口吗?这样做是否符合预期?我想找到比那更优雅的解决方案。它感觉很不好。
1个回答

12
在SDL 2的维基百科中,有一个名为“显示和窗口管理”的类别。它列出了关于SDL 2管理显示器(屏幕)和窗口的所有需要了解的内容。
你可以有多个选择,最通用的是使用SDL_GetCurrentDisplayModeSDL_GetDesktopDisplayMode。在维基百科中解释了它们之间的差异:

当SDL运行全屏并更改分辨率时,SDL_GetDesktopDisplayMode()和SDL_GetCurrentDisplayMode()之间存在差异。在这种情况下,SDL_GetDesktopDisplayMode()将返回先前的本机显示模式,而不是当前的显示模式。

使用其中之一设置SDL_DisplayMode后,就可以检索其属性 wh
然而,另一个更适合且直接的函数是SDL_GetDisplayBounds。如果我没有弄错,它会给出显示器相对于计算机上所有可用显示器的坐标,以及显示器的大小。
两种方法都需要你知道要查询的显示器的索引。我没有玩过SDL 2的这一部分,但我猜想您可以使用SDL_GetNumVideoDisplays来获取显示器数量(并检查是否至少有一个?-我认为如果没有可用的显示器,则SDL_Window部分可能无法工作),然后选择一个。或者您可以选择索引为0的第一个。

哦,而且你可以查看SDL_GetCurrentDisplayMode页面上的示例,它们可以有效地检索显示器的大小。


我在提问之前进行了研究,但是我的新手水平不允许我看到那正是我正在寻找的。我将尝试明天应用它,并将响应标记为有效,尽管它听起来比我预期的解决方案更好。 - Oxy
它运行得很好,非常顺畅,正如预期的那样。现在我甚至可以免费调整帧率到本地设置! - Oxy
当SDL运行全屏并更改分辨率时,此函数与SDL_GetDesktopDisplayMode之间存在差异。在这种情况下,此函数将返回当前显示模式,而不是先前的本机显示模式。但是,在Android上,SDL_GetCurrentDisplayMode仍然会发生这种情况。感谢SDL_GetDisplayBounds,我不知道这一点,但它返回相同的结果。只有data1data2成员是准确的,但它们似乎只是事件持续时间。 - John
最好在此处提供一个MWE - C++函数及其工作流程与Golang方式并不完全相同。 - piotao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接