【问题标题】:How is it possible to determine the correct drawable size of a window on Windows 10? (SDL2)如何确定 Windows 10 上窗口的正确可绘制大小? (SDL2)
【发布时间】:2018-06-07 08:36:07
【问题描述】:

我正在开发一个 OpenGL 应用程序。我使用高 dpi 屏幕,Windows GUI 被缩放到 125%,以使程序看起来像在普通屏幕上。

如果我使用 SDL2 创建一个 800*600 的窗口,它会显示为与常规屏幕相同的大小,但它是 1000*750 像素。由于我使用延迟渲染,所以我必须创建与可绘制区域大小相同的缓冲区,所以我想找出窗口的实际大小(以像素为单位)

如果我打电话给SDL_GL_GetDrawableSize,我会错误地得到 800*600 而不是 1000*750。 我在创建窗口时添加了标志SDL_WINDOW_ALLOW_HIGHDPI

我做错了什么?


编辑

如果我将 Visual Studio 中的 DPI Awareness 更改为 Per Monitor High DPI Aware,则窗口实际上是 800*600,但看起来很小。它应该是 1000*750,因为 Windows 设置中的缩放因子是 125%

【问题讨论】:

  • SDL2 版本?自建或来自 libsdl.org 的二进制文件? minimal reproducible example?
  • 我使用的是最新的稳定版 SDL2,2.0.7
  • 也许发布一个错误报告,说SDL_GL_GetDrawableSize 坏了?即使它按预期工作,您也可能会被告知如何正确获取尺寸。

标签: window scale sdl-2 highdpi


【解决方案1】:

您的帖子来自 2017 年 12 月,您的 SDL 版本 (2.0.7) 评论来自 2018 年 1 月。您的赏金是最新的,但没有更新的信息。

主要问题是,SDL2.0.7 在 Windows 上没有正确支持 HighDPI。 2017年5月他们prepared打了一个更大的补丁,但是2018年2月是merged,所以是在SDL2.0.7版本之后。据我看,它是在SDL2.0.8中引入的。主要更改是在文件src/video/windows/SDL_windowswindow.c 中进行的。我比较了来源和变更日志。肯定是上游,但是有人忘记写在WhatIsNew.txt里了,很烦。

我强烈建议将 SDL 升级到至少 2.0.8,最好是 2.0.10。

顺便说一句。补丁作者提到,你需要使用新的提示SDL_HINT_VIDEO_HIGHDPI_ENABLED

在最坏的情况下,如果您仍然遇到问题,您可以使用 GLFW 代替 SDL。

编辑: 提问者今天提供了新信息。

您可以通过GetDpiForMonitor 在 Windows 上查询每个监视器的 DPI 值,并据此计算大小。

由于您使用的是带有延迟着色的 OpenGL:确保为每个渲染通道正确设置 glViewPort

【讨论】:

  • 我使用的是 SDL 2.0.10,但我仍然有这个问题。并且SDL_HINT_VIDEO_HIGHDPI_ENABLED 没有定义。
  • 我针对您的问题研究了一个小时。对不起,我没有更多的想法。你没有写你现在使用的是 2.0.10!我很乐意投票。
  • @IterAtor 以防万一,你确定你的程序没有选择过时的SDL2.dll吗? SDL_GetVersion 是否显示 2.0.10?如果不是这样,您可以尝试自己构建 SDL2,并对其进行调试。
  • @HolyBlackCat SDL_VERSIONSDL_GetVersion 都返回 2.0.10 看起来提到的补丁从未合并。
  • @IterAtor 考虑提交错误报告。
猜你喜欢
  • 1970-01-01
  • 2014-11-29
  • 2012-07-31
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多