写在前面:很多东西还是得自己去计算一遍吧,很多关键词是以in来做测量的,但是我们熟悉的是cm,为了方便理解,有些地方我还是用cm来做说明
几个公式
- dpr : 物理像素点数/css逻辑像素点(取某一方向,水平或者是垂直,大部分的屏幕水平和垂直的点距都是一样的)
- 分辨率 : 水平物理像素个数 * 垂直物理像素个数,比如ip6的是1334 * 750,ip6plus(以下简称ip6p)的是1920 * 1080,下面我们也主要以这两个为研究设备
- ppi: 物理像素个数/in(英寸)(水平或者垂直都可以)
- dpi :css像素(逻辑像素)/ in (水平或者垂直都可以),dpi的作用很明显,dpi直接影响了我们在css中书写的同样尺寸的东西,会在实际的屏幕上呈现出多少的cm, 比如同样16px,高的dpi会在实际中显示更小的尺寸。
两个重要的观念
- 物理像素的点距是可变的
- css逻辑像素的点距更加是可变的
基本验证
-
拿ip6为例
-
375 * 667指的到底是什么?
答案: css逻辑分辨率; -
研究过程,我们把ip6的物理水平尺寸(也就是屏幕宽度)算出来:大概是5.9cm(尺子量的,不会特别精确),换算成in的话2.3228,先验证ppi:官方给出的ppi是326,用1334/2.3228大致就是322,验证成立。
接下来需要确定的点是我们的dpr是先有css逻辑像素,还是我们先确定了dpr,然后再有逻辑像素的确定。
css2.1的时候倒是建议了96ppi作为参考像素,不过我看dpr=2的ip6的dpi是163,也不是96的两倍。
当前总结下呢,我们书写在css中的px,对应的都是css逻辑像素,而css逻辑像素呢,又不和实际的尺寸相对应,也就是16px,在实际中并不是16cm或者是16mm,而因为dpi的不同,就会导致我们书写的css尺寸,并不会知道在实际中会看到多大。
ip6p: ip6p的ppi应该是没什么问题的,问题处在dpr上,这里的dpr按照公式计算:1080/414 = 2.6并不是3哦。
这里的问题就在于,我们如何在2.6个实际的像素点上描绘出css单位中的1pt(像素点),毕竟不可能投射到0.6个像素点上去的。
我这里给出的猜测是:直接当做3来,也就是直接投射到3个pt,这里的原理估计是和scale一样的,我们在使用scale的时候,scale计算后,必然也会导致一个css点,对应到0.5个像素点上去的结果,具体的实现这里暂不研究,猜测就是四舍五入。
理想情况下:我们的ppi完全没有必要达到401,保持326就行了,对于手持设备,太高的ppi,肉眼也是无法分辨出区别的。
这里对库克为什么会实现这种奇葩的方案做一个推测:1.首先我们需要先选定物理尺寸,先确定物理尺寸的宽和高
2.确定了这个尺寸后,我们需要考虑往这个尺寸里面填充进多少的像素点,先考虑dpi,最终希望达到的效果是怎么样的?是等比例把页面放大呢?还是希望看到页面上更多的内容(这里指的都是横向,以下相同),等比例放大必然不会是一个好的方案,苹果选择的方案应该是保持dpi相等的情况下,往里面塞入实际的物理像素点(dpi相等,屏幕大了,我们就能看到更多的东西),但是完全相等也不符合一个人的感官,应该是稍微字体稍微大一点,ip6的dpi是163,我们要在接近163的基础上,减小一点。
dpi确定后,我们就可以在这个基础上,填充进物理点了,但是要填多少呢?其实保持dpr=2的基础就好了,这样我们就能很方便的算出来dpr=2的基础上的物理分辨率(如果是163的dpi是878*1560),因为要比163小,所以,必然是比878*1560大的一个不怎么规则的数字。
如果这么做的话,保持dpi减小的话,dpr又一致,就相当于我们的ppi减小了,其实我的观点的话,300ppi和326ppi没什么差别,但是消费者不赞同啊,而且高的ppi必然是个噱头,库克是个商人,他需要告诉消费者我们的分辨率是高的,我们的ppi更大,你们才有动力去买plus,所以我们这里必须填充进比878*1560更大的一个物理像素点数,既然1920*1080是pc的一个大众接受的尺寸,那么我们也把这个拿来用
为什么不考虑更大的尺寸,来满足dpr=3呢?因为耗电!
我们必须也得使得6sp的待机时间比6s大
于是就导致了现在的奇葩的dpr=2.6的情况
但是这个会影响吗?
不会
具体的实现参考sacle,估计就是一样的实现方案
如果乔布斯在世,不可能会出现这种奇葩的dpr的,绝对的
最后的总结:
我们书写的css尺寸最终呈现在 移动设备上具体的大小取决于dpi
大屏幕的dpi应该更小,但是物理像素密度应该更大,这样就导致了更大的dpr,这个dpr必然是需要四舍五入, 很多实际上2.5往上的dpr,都是当做dpr=3来计算的,这种四舍五入必然是会导致一些问题的,这个问题的研究放到后续,这个问题应该是scale会导致的问题是一样的