zoukankan      html  css  js  c++  java
  • iOS构建流畅的交互界面--卡顿产生的原因

    [iOS 保持界面流畅的技巧 | Garan no dou](http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/)

    确定好Vsync信号产生的时间点,由硬件或软件(某个线程)确定好时间点,然后通知各个模块,每个模块都以系统时间为基点。

     iOS设备双缓冲机制:

    显示系统通常会引入两个帧缓冲区,双缓冲机制。
    android设备的垂直同步机制:
    [Vsync垂直同步信号分发和SurfaceFlinger响应执行渲染流程分析(一) - 红旺永福
    - 博客频道 - CSDN.NET](http://blog.csdn.net/sinat_22657459/article/details/52733375)
    先判断是否有硬件模块支持,没有硬件模块支持,就启动一个VSyncThread来执行产生垂直同步信号。

    •  由硬件产生:执行初始化时注册硬件回调
    • 由软件产生:
      获取当前时间点和产生信号的时间,计算中间要休眠的时间。
      休眠的时间小于0,说明上一个Vsync信号已经被错过,需要重新计算下一次的Vsync的产生时间:1. 采用定时回调 2. 采用休眠的形式主动等待

    画面撕裂现象:
    当视频控制器还未读取完成时,即屏幕内容刚显示一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交换后,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂现象。
    GPU 垂直同步机制 V-Sync:解决画面撕裂现象:
    当开启垂直同步后,GPU 会等待显示器的 VSync 信号发出后,才进行新的一帧渲染和缓冲区更新。这样能解决画面撕裂现象,也增加了画面流畅度,但需要消费更多的计算资源,也会带来部分延迟。

    界面卡顿的原因:
    在Sync信号到来后,系统图形服务会通过CADisplayLink等机制通知App,App主线程开始在CPU中计算显示内容,比如视图的创建,布局计算,图片解码,文本绘制等。随后CPU会将计算好的内容提交到GPU去,由GPU进行交换,合成,渲染。随后GPU会把渲染结果提交到帧缓冲区,等待下一次VSync信号(垂直同步信号)到来时显示到屏幕上。由于垂直同步机制,如果在一个VSync时间内,CPU或者GPU没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏因为没有新的刷新,会保留之前的内容不变。这就造成了卡顿。
    总结:掉帧导致了卡顿,而CPU和GPU只要有一个计算速度慢都会导致掉帧(没有在相邻的两个垂直同步信号之间完成计算)。
    解决:分别对CPU和GPU压力进行评估和优化。

  • 相关阅读:
    Codeforce 270A
    Codeforce 513A
    Codeforce 834A
    51Nod 1433 0和5
    51Nod 1005 大数加法
    51Nod 1136 欧拉函数
    51Nod 1449 砝码称重 (二进制思想)
    Codeforce 459A
    Codeforce 515A
    Codeforce 474A
  • 原文地址:https://www.cnblogs.com/HackHer/p/6341675.html
Copyright © 2011-2022 走看看