学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

像素不对齐

像素不对齐是指物理像素(pixel)不对齐;出现像素不对齐,会导致GPU在渲染时,对没对齐的边缘,进行插值计算,造成性能损耗了。

Color Misaligned Images

Misaligned Image表示要绘制的点无法直接映射到频幕上的像素点,此时系统需要对相邻的像素点做anti-aliasing反锯齿计算,增加了图形负担,通常这种问题出在对某些View的Frame重新计算和设置时产生的。

像素不对齐

iOS设备上,有逻辑像素(point)和 物理像素(pixel)之分,像素对齐指的是物理像素对齐,对齐就是像素点的值是整数,如某视图的宽高是100pixel * 100 pixel。

不对齐:视图或图片的点数(point),不能换算成整数的像素值(pixel),导致显示视图的时候需要对没对齐的边缘进行额外混合计算,影响性能。

像素对齐 VS 像素不对齐

  • 逻辑像素(point)乘以2(2x的视网膜屏) 或3(3x的视网膜屏)得到整数值,或者说得到的浮点数且小数点后都是0的,这就像素对齐了,否则就是像素不对齐。

  • 出现像素不对齐的情况,会导致在GPU渲染时,对没对齐的边缘,需要进行插值计算,这个插值计算的过程会有性能损耗。

常见场景

图片像素不对齐

  • 网络图片一般不会有@2x@3x之分,通过SDWebImage库下载的图片不加以处理就直接显示。
  • 当图片的size和显示图片View的size不同 或 图片的scale和屏幕的scale不同,就会发生像素不对齐的问题。
  • label的font大小和frame不匹配 字体太大 控件size放不下
  • section header height返回 0.01f (CGFLOAT_MIN,CGFloat.leastNormalMagnitude)

检测

iPhone模拟器中的Debug -> Color Misaligned Images选项

Core Animation->Display Settings->Color Misaligned Images选项都可以将像素不对齐的部分显示出来

视图会有黄色或洋红色(Magenta)的图层标记,代表其像素不对齐

洋红色:UIView的frame像素不对齐,即不能换算成整数像素值。
黄色:UIImageView的图片像素大小与其frame.size不对齐,图片发生了缩放造成 /黄色覆盖是由拉伸引起的

解决

1.像素不对齐

要想像素对齐,必须保证image.size和显示图片view.size相等 且 image.scale和 [UIScreen mainScreen].scale相等。可以在网络图片下载完成后进行压缩裁剪等操作在进行渲染

针对frame像素不对齐,借助ceilf()、floorf()、CGRectIntegral()等将小数点后数据除去即可

像素不对称齐的元素一般为UILabel或UIImageView

参考

解决iOS中像素不对齐问题