百科问答小站 logo
百科问答小站 font logo



为什么 Windows 上的第三方软件对高清屏支持这么差? 第1页

  

user avatar   be5invis 网友的相关建议: 
      

这里是第三方 app 更新报道区

  • Geforce Experience 更新 1.8.2 之后分辨率检测已经正确(ps. 界面是清楚的)
  • Chrome 37 Canary 开始,在注册表 HKCUSoftwareGoogleChromeProfile 写 DWORD high-dpi-support=1 即可开启支持,效果良好
  • Illustrator CS 2014 和 Photoshop CS 2014 已支持 200%

第三方 app 更新报道区结束

==========================================================

M$ 要说责任,只有三点

  1. 不垄断发行渠道,对第三方软件不强制品质。(因为一旦控制必然导致第三方倒戈。当年任天堂怎么死的知道没?)
  2. 没有 C/C++ 版的类 WPF 界面库。(因此如果第三方想要软件「清楚」,就必须自己处理界面缩放——这可不是个简单活。当然也可以用 .NET,问题是不是所有人都装了 .NET。)
  3. XP 退市太晚。(导致第三方不敢使用 Vista 以来的新功能。原因太多,当然在国内绝对是因为 Vista 和之后的 OS 不好破解。)

==========================================================

来补充

@pansz

的答案。

从 Windows Vista 开始微软引入了一套新 API 用来处理界面缩放(是 06 年提出的,比苹果早很多)。这套机制叫 DPI Virtualization。在 Windows 8.1 里 DPI Virtualization 被强化以让不同显示器有不同的 DPI 设定。DPI Virtualization 的目的是不让老程序在高 DPI 设置下出现界面错位,同时如果新程序可以处理缩放,则交给程序自己处理。

DPI Virtualization 依赖 dwm 实现。当 Windows 检测到你的程序(进程)不支持 DPI 缩放时(即运行非 DPI-Aware 程序),它直接放大窗口,因为有非整比的缩放所以可能会造成界面「模糊」(不信你在 8.1 里可以试试 200% 缩放,结果是锯齿状的,和 OSX 一模一样);而对于新应用则不作特别处理。这套机制的具体行为非常复杂(特别是在引入分屏 dpi 设置之后),就不多展开了。有兴趣可以参阅

High DPI Settings in Windows

。判断进程是否支持缩放的 API 很奇怪地在 8.1 之前的系统里一直没给,8.1 提供了,叫

GetProcessDpiAwareness

Windows 应用通知系统自己支持高 DPI 有两种方式,一种是向主进程的 manifest 中写入信息,另一种是使用

SetProcessDpiAwareness

函数。在 Windows 8.1 中应用程序对高 DPI 支持有三级,对应

PROCESS_DPI_AWARENESS

的三个属性,它们分别是:

  • Process_DPI_Unaware:此程序不支持高 DPI
  • Process_System_DPI_Aware:此程序支持在第一屏上按高 DPI 显示,不能处理多显示器的分别设置
  • Process_Pre_Monitor_DPI_Aware:此程序可以在不同显示器设置不同 DPI 时仍然工作良好

Vista 到 Win8 只有前两级,因为它们没分显示器的 DPI 设置。此时 API 稍有变化,是使用

SetProcessDPIAware

API。

对于那些被放大窗口的应用,系统会生成一系列的「假」数据给他们,包括屏幕分辨率和鼠标座标。这样就可以保证最大程度的兼容性。

从这种处理机制中可以看出微软在 Vista 的年代就提出了一套良好的系统来对付高 DPI 环境可能造成的兼容性问题。然而现在被很多人诟病的「Windows 不支持高分」原因在哪里呢?原因有三:

  1. DPI Virtualization 支持非整比缩放,导致被放大的窗口会变模糊。这是微软的责任,他们应该使用更好的缩放算法,例如 hqx 或者 xBRZ。但是记住,「模糊」是相对显示屏密度而言的,在高密度显示屏上它并没有那么「模糊」。更好的策略可能是像一些游戏机模拟器那样用两个缓冲,一个送显示一个给程序读屏用。
  2. 仍然有大量的应用程序不支持高 DPI。这是第三方的问题。下面详细展开。
  3. 和座标变换相关的问题。这个比较复杂,只会涉及一些跨窗口操作的应用程序和钩子程序,不展开了。

在第三方应用程序这边,因为系统得知应用是否支持高 DPI 是,应用程序通知系统的,因此就会出现四种情况:

  1. 应用在高 DPI 下运作正常,并通知系统:很好,应用清晰显示,行为正确。微软许多原厂应用(包括 Word 2013、VS2013 等)都能做到这一点。Sublime Text 3 也属于这一类。
  2. 应用在高 DPI 下运作正常,然未通知系统:窗口被放大,应用程序显示模糊但是行为正确。这种应用数量不多,一些 CAD 软件有可能属于这一类(CAD 界使用高分屏已久,不少软件都有不错的高 DPI 支持)。
  3. 应用不支持高 DPI 却错误通知系统:系统不对应用作特别处理导致界面错位或者大小不正确。类似题主中 WPS、Photoshop、Chrome 的情况。还有一种可能是用于启动程序的快捷方式里设定了「在高 DPI 下禁用界面缩放」,QQ 应当是这个问题。(因为写这个答案的时候我同时开着 QQ 和高 dpi,而我能明显看见 QQ 窗口是被放大的。WPS 也可能是这种情况。)
  4. 应用不支持高 DPI 也未通知系统:窗口被放大,显示模糊但没有错位,大多数老应用都在这种情况里。题主的 Geforce Experience 就属于这种,因为被系统放大界面了所以获取到了用于兼容用的,被「缩小」的屏幕分辨率。

然后怎么才能解决这种问题?。如果软件有 Issue Tracker 就上去报 bug,并且给出复现方式。让既有应用程序支持高 DPI 是个很困难的过程,尤其是许多 Windows 软件年龄都非常老,很多还使用了自己的 GUI 库,像 Chrome 说要支持高 dpi 弄了好几个版本都没搞定。在这些应用中情况 (3) 更是害群之马,因为它们欺骗系统获取了原始分辨率,却无法正确处理界面缩放。我不清楚 Adobe 为什么会这么干,但自从 Adobe 弄出这种事情后我就拒用了 Adobe 的一切程序。

ps. Adobe 的 Acrobat XI 完美支持高清但是 Photoshop 就不支持,给我个理由先?

对于开发人员:

  • 请一定要诚实,应用不支持高 DPI 坚决不通知系统。避免错位和错误行为是第一大事。
  • 想办法让它支持高 DPI。
  • 对 XP 做「优雅降级」,反正用 XP 的机器都不会改 DPI 设置。

user avatar   pansz 网友的相关建议: 
      

这个是历史原因。Windows 的一个大优势是什么?是兼容性,是成千上万上亿的软件。Windows 诞生了这么多年,这些软件全部都是在不支持高分辨率的情况下写的,当初的所有编程接口也都没有考虑像素密度改变的情形。

所以,如果无法要求所有的历史应用程序重新为可变像素密度重新编程适配,或者至少是重新编译,那么就没有办法让那些应用程序支持高清屏幕。

Windows 想了一个什么办法让那些没有使用新的支持可变像素密度的应用程序支持放大呢?大家看到了,就是强制缩放,而这导致的结果就是应用程序仿佛是被高斯模糊滤镜渲染了一样的结果。

现实是这样的:对于一些不能识别 Windows 可变 dpi 的应用,在 高于 100%dpi 的情况下 Windows 会对该应用强制放大。对用户而言,这个应用变模糊了;对这些应用而言,相当于整个系统的分辨率降低了。例如 1920x1080 的分辨率,加上 150% dpi,在这个应用程序看起来系统的分辨率是 1280x720。

我们知道 Windows 7 内置的应用,以及微软自己的应用(例如 Office 2013)都不会出现模糊的问题,说明其实微软自己的应用已经能够支持高清屏了,要更大范围内解决这个问题只能让第三方应用程序的开发方去识别可变 dpi,然后进行相关的处理。

我这个答案没有太大帮助,希望有个懂 Windows 编程的人现身说法一下调用什么 API 能够做到。




  

相关话题

  使用微软历代 Windows 版本是怎样的一番体验? 
  为什么同样是8G运行内存,Windows能同时开一大堆后台进程和前台应用,而Android不可以? 
  为什么 Windows 操作系统开很多应用和游戏都不会杀后台? 
  3070Ti选2K 144Hz还是4K 60Hz? 
  如何优雅地同时使用 Linux 和 Windows 两个系统? 
  为什么 Windows 笔记本很少有光线传感器? 
  Windows命令行和Linux差在哪里? 
  Windows 有哪些用户体验细节处理得比 macOS 好? 
  Windows 为什么要有注册表而 Unix 就不需要? 
  怎样看待中国黑客通过Edge跳转到IE从而拿下Win10这一事件? 

前一个讨论
历史上,当一个新朝代建立时,其命名是如何决定的?
下一个讨论
插件机制实现的原理是什么?





© 2024-11-08 - tinynew.org. All Rights Reserved.
© 2024-11-08 - tinynew.org. 保留所有权利