为什么我的 VS SDL 2.0 window 比我指定的大 2 倍?
Why is my VS SDL 2.0 window 2x bigger than i specified?
我有一台 3840x2160 显示器,使用 Windows10。
我只是在创建一个 window 和一个渲染器。当我将 window 大小设置为 200x200 并将程序设置为 运行 时,window 出现并且我可以完美渲染。但是 window 实际上是 400x400 像素大,而一个点 (SDL_RenderDrawPoint()) 实际上是 2x2 像素大。此外,当我在 10,10 处绘制点时,它位于按像素计算的 20,20 位置。
当我将设置中的 Windows 10 分辨率设置为 1920x1080 时,window 具有正确的大小并且点只有一个像素大并且位于正确的位置。
如果有人知道该问题以及如何使用 3840x2160 设置使 window 达到完美像素大小,我将非常感激。 ;)
我的问题是我的 window 不支持 DPI,因此 windows 对其进行位图缩放。正常的解决方法是在创建 window 时将 SDL_WINDOW_ALLOW_HIGHDPI
标志提供给 window,但遗憾的是还没有 windows 支持 DPI 感知(或者我只是没有找到任何关于它的信息)所以它不起作用。 Some Poeple are working to get a windows Per-Monitor (V2) DPI Awareness 用于 windows 上的 SDL2。
不管怎样,我刚刚找到了一个奇怪的解决方法来解决我在上面的问题中描述的问题:
我可以只使用 SDL_WINDOW_FULLSCREEN
标志(宽度和高度不重要),将我的 window 映射到全屏,而忽略 windows 正在使用的比例因子,这在大多数情况下使我的 window 无法使用,因为拉伸。然后我关闭 window,取出 SDL_WINDOW_FULLSCREEN
标志并再次 运行 程序。现在 window 是真实的 1:1 像素大小,即使我的 windows 设置中有 200% 的比例因子。
我知道这是一个不干净且奇怪的修复程序,所以如果有人知道为什么这样做或知道更好的方法,请继续。
我猜你很久以前就解决了这个问题,但如果有人仍然有问题:
问题是 Windows 使用 UI 缩放设置(DPI 缩放)缩放 window,因为程序被标记为非 DPI 感知。
我在 Steam 上玩游戏时遇到了同样的问题。有两种方法可以让 Windows 8+ 不将缩放应用于您的游戏:
1)
右键单击您编译的.exe
select 属性
打开兼容性选项卡
select 更改高 DPI 设置
勾选底部框并选择:
覆盖高 DPI 缩放行为。
缩放执行者:
申请
此解决方案不够优雅,不适合分发,因为您需要每个用户都这样做。
- 如果使用 visual studio,请将您的清单文件设置为:DPI 感知、监视器感知(并尝试在您的程序中进行适当的缩放,或者让用户选择这样做)。
要访问清单,请在 Visual Studio 2013 年:
在解决方案资源管理器中右键单击您的目标程序,select:配置 Properties\Manifest 工具
将 DPI 感知设置为:每个监视器高 DPI 感知,
Windows 应该让你的游戏一个人呆着。
我有一台 3840x2160 显示器,使用 Windows10。 我只是在创建一个 window 和一个渲染器。当我将 window 大小设置为 200x200 并将程序设置为 运行 时,window 出现并且我可以完美渲染。但是 window 实际上是 400x400 像素大,而一个点 (SDL_RenderDrawPoint()) 实际上是 2x2 像素大。此外,当我在 10,10 处绘制点时,它位于按像素计算的 20,20 位置。 当我将设置中的 Windows 10 分辨率设置为 1920x1080 时,window 具有正确的大小并且点只有一个像素大并且位于正确的位置。 如果有人知道该问题以及如何使用 3840x2160 设置使 window 达到完美像素大小,我将非常感激。 ;)
我的问题是我的 window 不支持 DPI,因此 windows 对其进行位图缩放。正常的解决方法是在创建 window 时将 SDL_WINDOW_ALLOW_HIGHDPI
标志提供给 window,但遗憾的是还没有 windows 支持 DPI 感知(或者我只是没有找到任何关于它的信息)所以它不起作用。 Some Poeple are working to get a windows Per-Monitor (V2) DPI Awareness 用于 windows 上的 SDL2。
不管怎样,我刚刚找到了一个奇怪的解决方法来解决我在上面的问题中描述的问题:
我可以只使用 SDL_WINDOW_FULLSCREEN
标志(宽度和高度不重要),将我的 window 映射到全屏,而忽略 windows 正在使用的比例因子,这在大多数情况下使我的 window 无法使用,因为拉伸。然后我关闭 window,取出 SDL_WINDOW_FULLSCREEN
标志并再次 运行 程序。现在 window 是真实的 1:1 像素大小,即使我的 windows 设置中有 200% 的比例因子。
我知道这是一个不干净且奇怪的修复程序,所以如果有人知道为什么这样做或知道更好的方法,请继续。
我猜你很久以前就解决了这个问题,但如果有人仍然有问题: 问题是 Windows 使用 UI 缩放设置(DPI 缩放)缩放 window,因为程序被标记为非 DPI 感知。 我在 Steam 上玩游戏时遇到了同样的问题。有两种方法可以让 Windows 8+ 不将缩放应用于您的游戏: 1) 右键单击您编译的.exe select 属性 打开兼容性选项卡 select 更改高 DPI 设置 勾选底部框并选择: 覆盖高 DPI 缩放行为。
缩放执行者: 申请
此解决方案不够优雅,不适合分发,因为您需要每个用户都这样做。
- 如果使用 visual studio,请将您的清单文件设置为:DPI 感知、监视器感知(并尝试在您的程序中进行适当的缩放,或者让用户选择这样做)。 要访问清单,请在 Visual Studio 2013 年: 在解决方案资源管理器中右键单击您的目标程序,select:配置 Properties\Manifest 工具 将 DPI 感知设置为:每个监视器高 DPI 感知, Windows 应该让你的游戏一个人呆着。