SDL_GetWindowDisplayScale与SDL_GetWindowPixelDensity差异及应用疑问
SDL_GetWindowPixelDensity与SDL_GetWindowDisplayScale差异问题解答
一、差异产生的原因
你遇到的数值差异,核心是两个函数的定义完全不同:
SDL_GetWindowPixelDensity:仅返回显示器硬件对应的系统DPI缩放因子,这个值和显示器绑定,和当前窗口无关。你的系统里全局DPI缩放设置是100%(对应1.0),所以返回1.0。SDL_GetWindowDisplayScale:返回的是窗口实际生效的综合缩放比例,是「显示器DPI缩放」和「窗口内容额外缩放」的乘积。在Mate+X11环境下,这个0.979的异常值,大概率是X11分数缩放的计算误差,或者Mate桌面的窗口管理器对当前窗口应用了微调的缩放设置(比如为兼容老程序自动调整了窗口缩放比例)。
二、「显示内容缩放比例」的设置来源
这个额外的缩放比例可以通过以下几种方式设置:
- 系统桌面设置:Mate桌面的「显示」设置面板里,部分版本支持手动设置窗口缩放比例(包括分数值);
- X11环境变量:比如
GDK_SCALE、QT_SCALE_FACTOR这类针对GUI工具包的缩放变量,SDL会读取这些全局缩放设置; - 窗口管理器手动调整:右键点击窗口标题栏,部分窗口管理器提供「缩放」选项,可以手动调整当前窗口的缩放比例;
- 程序自身API调用:通过
SDL_SetWindowDisplayMode、SDL_SetWindowSize等API,在程序内部调整窗口的逻辑尺寸与物理像素的对应关系。
三、逻辑坐标转物理像素的选择
如果是为了实现控件逻辑坐标到窗口物理像素位置的转换,必须使用SDL_GetWindowDisplayScale。因为这个值是当前窗口实际生效的缩放比例,直接反映了逻辑坐标和物理像素的对应关系;而SDL_GetWindowPixelDensity只是显示器的基础缩放,不代表当前窗口的实际缩放状态。
内容的提问来源于stack exchange,提问作者jiandingzhe
相关产品推荐
相关产品推荐

