1

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

“一个点相当于一英寸的1/72”

我从中了解到一点是物理距离。因此,如果我的屏幕是 20 英寸宽(例如),我将有 20 x 72 = 1440 个水平宽度来处理。换句话说,一个点与设备的分辨率无关。

这似乎不是那么...

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

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

用户空间中的每个点都由四个像素支持

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

4

1 回答 1

3

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

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

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

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

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

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

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

Screen size in points: 1280x800
Backbuffer in pixels: 2560x1600
Physical pixels: 2880x1800
This will actually make everything (text, buttons, etc.) appear larger since there are fewer points mapped to the same physical pixels. Each point will be physically larger. Note, though, that each point still maps to a 2x2-pixel square in the backbuffer. As before, the backbuffer is scaled by the hardware to the physical display. This time it's scaled up slightly rather than down. (This scaling is the same thing as happens on a non-Retina LCD display when you select a mode with fewer pixels than the physical display. Obviously, an LCD can't change the number of physical pixels it has, so the different resolution is accomplished by scaling a backbuffer.)

Etc.

于 2015-01-18T22:03:02.447 回答