Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 了解Cocoa图形中的点和用户空间与屏幕分辨率的交互_Objective C_Cocoa_Resolution_Ppi - Fatal编程技术网

Objective c 了解Cocoa图形中的点和用户空间与屏幕分辨率的交互

Objective c 了解Cocoa图形中的点和用户空间与屏幕分辨率的交互,objective-c,cocoa,resolution,ppi,Objective C,Cocoa,Resolution,Ppi,Cocoa绘图尺寸(宽度和高度)在OS X Cocoa绘图指南文档中定义如下的点中指定: “单点相当于1/72英寸” 我由此理解,一个点是一个物理距离。因此,如果我的屏幕是20英寸宽(例如),我将在点中使用20 x 72=1440个水平宽度的点。换句话说,点与设备的分辨率无关 这似乎不是那么 使用窗口宽度作为测试的简单cocoa应用程序显示: 1) 当我的分辨率设置为1680x1050时,需要1680点的宽度来跨越屏幕的宽度 2) 类似地,如果我将分辨率更改为2560x1440,则需要2560点

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

“单点相当于1/72英寸”

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

这似乎不是那么

使用窗口宽度作为测试的简单cocoa应用程序显示: 1) 当我的分辨率设置为1680x1050时,需要1680点的宽度来跨越屏幕的宽度 2) 类似地,如果我将分辨率更改为2560x1440,则需要2560点的窗口宽度来跨越屏幕宽度

同样令人困惑的是(以一种矛盾的方式)苹果高分辨率指南文件中的声明:

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


上述测试似乎表明,当我的显示分辨率设置为1680x1050时,我的用户空间为1680x1050。如果每个用户点有4个像素,则表示有效的“真实”分辨率为2倍(1680x1050)=3360x2100,比我的13英寸retina macbook pro 2560x1600的本机分辨率高。

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

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

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

然而,可能还有另一层复杂性。您可以配置视网膜系统,以在屏幕上显示更多内容,但代价是一些细节。您可以选择1920x1200点的显示模式。在该模式下,将对3840x2400像素的backbuffer进行渲染。这允许在更高层次的细节渲染,但保持数学简单;点仍然映射到2x2像素的正方形。(这个简单的数学也避免了在绘制邻接位图图像时出现接缝问题。)但3840x2400大于显示硬件中的物理像素数。因此,当在屏幕上实际绘制到物理2880x1800像素时,backbuffer将缩小。这会从backbuffer中丢失一些更高的细节,但结果仍然比物理1920x1200屏幕或将1920x1200渲染放大到物理2880x1800屏幕更详细

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

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

屏幕大小(以点为单位):2880x1800
Backbuffer(像素):2880x1800
物理像素:2880x1800
所有的东西都很小,但是你可以在屏幕上放很多东西(比如很多行文字)

以点为单位的屏幕大小:1280x800
Backbuffer(像素):2560x1600
物理像素:2880x1800
这实际上会使所有内容(文本、按钮等)看起来更大,因为映射到相同物理像素的点更少。每个点的物理尺寸都会更大。但是请注意,每个点仍然映射到backbuffer中的2x2像素正方形。与以前一样,backbuffer由硬件缩放到物理显示。这一次,它的比例略有上升,而不是下降。(这种缩放与选择像素数少于物理显示器的模式时在非视网膜LCD显示器上发生的情况相同。显然,LCD无法更改其物理像素数,因此不同的分辨率是通过缩放backbuffer来实现的。)


我认为每英寸72点大多是指默认的PDF和打印上下文,在物理屏幕方面有一定的范围,考虑iPad和iPad Mini,在运行时看起来是一样的。我知道你标记了cocoa,而不是cocoa touch,但在那里是一样的,更重要的是,很多Mac电脑正在推出苹果甚至没有推出的屏幕manufacture@Jef那么“点”的定义是什么呢?实际上,它是一个抽象单位,与像素没有固定的相关性,也与任何物理测量没有固定的相关性。这也是quartz绘制的东西:)在我上面的测试中,工作定义可能是:一个单独的单元,垂直或水平,屏幕的分辨率是多少。我在努力弄清楚这是否正确。听起来不错,是的。我确信72dpi是一个很好的“大概”数字,但有一个范围(在屏幕上)不是一个明确的值。但是当他们释放一个比以前有更多像素的屏幕时,他们会增加“比例”,以便将“点”保持在这个范围内。。。(而不是发布一个新的屏幕,其中有两倍多的“点”需要绘制,这将使现有应用程序中的许多内容(例如每个NSWindow上的最小、最大大小)以次优方式呈现。)首先,感谢您提供了全面的答案