在Windows 10上如何确定窗口的正确绘制大小?(SDL2)

15
我正在开发一个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 下载二进制文件?[mcve]? - genpfault
我使用最新的稳定版SDL2,即2.0.7版本。 - Iter Ator
1
也许可以发布一个错误报告,说 SDL_GL_GetDrawableSize 函数有问题?即使它按预期工作,你可能会被告知如何正确获取大小。 - HolyBlackCat
1个回答

3

您的帖子是2017年12月发布的,您的SDL版本(2.0.7)评论是在2018年1月发布的。您的赏金是最新的,但缺少更新的信息。

主要问题是,SDL2.0.7在Windows上没有正确支持HighDPI。在2017年5月,他们准备了一个更大的补丁,但在2018年2月合并,因此在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。
编辑:问答者今天提供了新信息。
在Windows上,您可以通过GetDpiForMonitor查询每个监视器的DPI值,并从中计算出大小。
由于您正在使用延迟着色的OpenGL,请确保为每个渲染通道正确设置glViewPort

1
@IterAtor 如果可以的话,您确定您的程序没有选择一个过时的SDL2.dll吗? SDL_GetVersion显示的是2.0.10吗?如果不是这样的话,您可以尝试自己构建SDL2,并进行调试。 - HolyBlackCat
1
@IterAtor 考虑提交错误报告。 - HolyBlackCat
即使问题不能完全解决,获得一个被接受的答案或投票也是不错的。请记住,我花了相当多的时间进行仔细的研究。 - Arakis
@Arakis,我无法接受这个答案,因为它是错误的。补丁从未合并。而SDL_HINT_VIDEO_HIGHDPI_ENABLED没有定义。 - Iter Ator
不管你最初的问题是什么,让我困扰的是假设这个补丁从未合并(可能是),我想要检查符号添加/删除时的提交历史记录。我刚克隆了SDL的镜像库,并在检出时得知SHA 2dbd68d8972f59ce690598f17bd5bbbecb26902a不是一个有效的树引用。所以,为什么GitHub可以显示一个在克隆的库中不存在的引用? - Arakis
显示剩余7条评论

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