Skip to content

Latest commit

 

History

History
183 lines (120 loc) · 4.83 KB

CPU和内存优化面试题.md

File metadata and controls

183 lines (120 loc) · 4.83 KB

什么时Page Memory

查看答案

一段内存是有一个或者多个Page Memory组成的,一个Page Memory大小时16K.Page Memory刚申请的内存状态为Clean,当存储数据之后状态变成Dirty

iOS的内存有几种内存类型,分别对应什么

查看答案

iOS的内存类型分为三种

  • Clean Memory

    可以被Page Out的内存空间,通常.framework中的_DATA_CONST_

  • Dirty Memory

    被App写入输入的内存,同时是堆区的对象,图像解码空间,.framwork中的_DATA_段和_DATA_DIRTY_段。在.framework使用单利初始化可以有效减少Dirty Memory的占用

  • Compressed Memory

    当内存吃紧的时候,系统会将不适用的内存压紧。比如用Dictionary缓存数据占用三页内存,当内存吃紧被压缩为一页,当再次使用,再次被释放成三页。

为什么缓存数据要推荐用NSCache替换Dictionary?

查看答案

因为在内存吃紧的时候,NSCache会自动释放内存,但是Dirtionary不会。

一张500x500大小的图片在iOS占用多少内存?

查看答案

500x500x8 / (1024 * 1024) ~= 0.95MB

为什么界面会卡顿?

查看答案

因为设备的刷新频率时一秒60次,那么每次屏幕渲染的时间就是1/60秒大约0.0167秒时间。这0.0167秒时间需要CPU计算和GPU渲染完成,当两个时间大于0.0167秒时候就会显示上一显示的内容。从而形成卡顿的现象,GPU渲染完毕,就会在下一侦显示。

离屏渲染消耗性能原理

查看答案
  • 需要创建新的缓存区

  • 离屏渲染的过程需要多次切换上下文

离屏渲染出现的原因?

查看答案
  • layer.shouldRasterize = YES
  • 设置遮罩 layer.mask
  • 设置圆角
  • 设置阴影

一段动画的执行步骤

查看答案
  • 布局
  • 显示
  • 准备
  • 提交

介绍一下CPU和GPU负责的工作

查看答案
  • CPU
    • 对象的创建和销毁
    • 对象属性的调整
    • 布局计算
    • 文本的计算和排版
    • 图像格式的转码和解码
    • 图像的绘制
  • GPU
    • 纹理的渲染

iOS视频成像的原理

查看答案

image-20200331094005407

由CPU进行位图合成,交给GPU进行图层混合和纹理合成。GPU结果存放在缓冲区(Frame Buffer)中,再由视频控制器通过VSync信号在指定时间从缓冲区提取屏幕显示内容显示在显示器上。

UI卡顿掉帧原因

查看答案

image-20200331094935050

CPUGPU处理时间大于16.67ms时候就会造成掉帧和卡顿。

CPU优化

查看答案
  • 对象的创建
    • 尽量用轻量的对象代替重量的对象 比如不需要交互的可以用CALayer代替UIView
    • 尽量在子线程创建对象
    • 尽量代码创建对象替代StoryBoard创建对象
    • 懒加载创建对象
    • 尽可能的对象重用
  • 对象调整
    • 尽量避免不必要UIView对象的调整
    • 尽量避免移动UIView图层层次和添加或者移出
  • 对象销毁
    • 尽可能在后台线程销毁对象
  • 布局计算
    • 尽量提前计算好视图布局
    • 尽量布局复杂少用自动布局
    • 布局可以考虑添加缓存机制
  • 文本计算
    • 大量文本可以在子线程用[NSAttributedString boundingRectWithSize:options:context:]计算文本的宽度
    • 大量文本可以在子线程用[NSAttributedString drawWithRect:options:context:] 绘制文本
  • 文本渲染
    • 显示大量文本时候,可以自定义文本控制,通过缓存绘制信息提升绘制效率
  • 图片解码
    • 在子线程将图片绘制在CGBitmapContext,在Bitmap直接的创建图片
  • 图像的绘制
    • 图像的绘制可以放在后台线程中

GPU优化

查看答案
  • 纹理的渲染
    • 尽可能减少短时间内加载多张图片 比如多张图片合成一张
    • 图片的大小和视图大小不要超出纹理尺寸上线4096*4096
  • 图层混合
    • 尽量减少图层层次和数量
    • 在不需要透明的视图标记opaque属性
    • 可以将多张图片合成一张
  • 图形生成
    • 后台线程生成圆角图片代理layer.corner设置圆角
    • 开启layer.shouldRasterize属性将绘制可以转交给CPU分解压力