在 Cocoa 绘图中了解点和用户 space,因为它们与屏幕分辨率交互

Understanding points and the user space in Cocoa Drawing as they interact with screen resolution

Cocoa 绘图尺寸(宽度和高度)以磅为单位指定,在 OS X Cocoa 绘图指南文档中定义如下:

"A single point is equivalent to 1/72 of an inch"

由此我明白了一个点就是一个物理距离。因此,如果我的屏幕是 20 英寸宽(例如),我将在 points 中使用 20 x 72 = 1440 点的水平宽度。换句话说,一个点与设备的分辨率无关。

好像不是这样的...

一个简单的 cocoa 应用程序使用 window 宽度作为测试表明: 1) 当我的分辨率设置为 1680x1050 时,它需要 1680 的宽度来跨越屏幕的宽度 2) 同样,如果我将分辨率更改为 2560x1440,则 window 宽度为 2560 以跨越屏幕宽度

同样令人困惑(以矛盾的方式)的是高分辨率指南 Apple 文档中的声明:

Each point in user space is backed by four pixels

以上测试似乎表明当我的显示分辨率设置为 1680x1050 时,我有一个 1680x1050 的用户 space。如果每个用户点有 4 个像素,那么这将指向 2 倍 (1680x1050) = 3360x2100 的有效 "real" 分辨率,这比我的 13 英寸视网膜 macbook pro 的原始分辨率 2560x1600 更高。

点是一个抽象的虚拟坐标系。目的是您通常设计和编写绘图代码以在点上工作并且与人类视觉大致一致,补偿不同的物理显示器像素密度和显示器与用户眼睛之间的通常距离。

点与物理距离单位(英寸、厘米等)或物理显示像素之间没有可靠的关系。

对于屏幕显示,至少有三种不同的度量。例如,Retina MacBook Pro 的屏幕具有 2880x1800 物理像素。在默认模式下,它映射到 1440x900 点,因此每个点都是一个 2x2 像素的正方形。这就是为什么 window 在此类系统上的视觉尺寸与非 Retina MacBook Pro 上的相同 window 具有相同的视觉尺寸,屏幕的 1440x900 物理像素映射到 1440x900 点。 window 以点为单位,因此占据了相同的屏幕空间。但是,在 Retina 显示屏上,像素更多,可以显示更精细的细节。

但是,还可能存在另一层复杂性。您可以配置 Retina 系统以牺牲一些细节为代价在屏幕上显示更多内容。您可以select 1920x1200 点的显​​示模式。在该模式下,渲染完成到 3840x2400 像素的后备缓冲区。这允许以更高级别的细节进行渲染,但保持数学简单;点仍然映射到 2x2 像素的正方形。 (这个简单的数学运算还避免了在绘制邻接位图图像时出现接缝问题。)但是 3840x2400 大于显示硬件中的物理像素数。因此,当实际在屏幕上绘制到物理 2880x1800 像素时,后台缓冲区会缩小。这从后台缓冲区中丢失了 一些 更高的细节,但结果仍然比物理 1920x1200 屏幕或将 1920x1200 渲染放大到物理 2880x1800 屏幕更精细。

因此,对于此配置:
以磅为单位的屏幕尺寸:1920x1200
内存像素中的后缓冲区:3840x2400
显示硬件中的物理像素:2880x1800

当然,其他配置也是可能的:

屏幕大小(点):2880x1800
以像素为单位的后备缓冲区:2880x1800
物理像素:2880x1800
一切都将非常小,但您将能够在屏幕上容纳很多东西(例如,多行文本)。

屏幕大小(点):1280x800
以像素为单位的后备缓冲区:2560x1600
物理像素:2880x1800
这实际上会使一切(文本、按钮等)看起来更大,因为映射到相同物理像素的点更少。每个点在物理上都会更大。但是请注意,每个点仍然映射到后备缓冲区中的 2x2 像素正方形。和以前一样,后备缓冲区由硬件缩放到物理显示器。这次它稍微放大了而不是缩小了。 (当你 select 像素比物理显示器少的模式时,这种缩放与非 Retina LCD 显示器上发生的事情是一样的。显然,LCD 不能改变它拥有的物理像素数量,所以不同的分辨率是通过缩放后备缓冲区来实现的。)

等等