不知道该如何命名这篇文章,算做是工作多年的一些基础总结吧。短时间完成的,比较粗糙,也会有错误之处。最近太忙,没太多时间沉淀。
显示
人眼能够识别的帧率大概是60FPS,所以一帧的显示周期为16ms左右。客户端都是以消息队列的形式处理用户操作或系统回调,故我们在Activity的oncreate或�UIViewController的viewDidLoad等主线程回调中,代码的执行时间都不能超过16ms,否则会有丢帧的情况发生。
丢帧
CPU需要计算当前页面所有视图的大小、位置及图片解码等,然后交给GPU渲染成图像帧,最后提交帧缓冲区(现在系统大多采用双缓冲区,有点类似Android里的SurfaceView的机制)。液晶屏和早起的CRT显示屏原理类似,都是由视频控制器从帧缓冲区逐行读取数据,最终由显示器完成画面的显示,16ms后重复此操作 。在这个过程中,如果CPU和GPU没能将新的数据完成计算提交到帧缓冲区,那这一帧将被丢弃,就是所谓的丢帧。
内存与线程
内存分为堆和栈,线程是CPU执行的最小单元,每个线程都有自己的调用堆栈及各种寄存器的值、程序计数器和栈指针,所以线程创建的代价是挺大的,现在语言库都有自己的线程池(Android中的AsyncTask及Ios中的GCD等都是基于此)。栈的内存由操作系统管理,函数调用的时候将函数参数与函数内临时变量等压入栈,函数返回时会出栈自动释放(由栈指针等控制);而在这个过程中通过new或者alloc等实例化出来的对象会保存在堆上,由开发人员自己管理(垃圾回收或delete等)。
客户端优化
常见的优化手段有很多,比如减少View的嵌套层级,将大任务分解成多个小任务将由消息循环逐个处理。内存方面做到需要多少用多少,减少内存释放需要付出的代价。尽量减少阻塞主线程,Android与Ios中的系统Ui库都是在主线程中计算大小位置与绘制,如果业务产品需要,可以考虑SurfaceView和CoreText以及AsyncDisplayKit等优秀第三方库等。
感慨
计算机技术通过多年的发展,语言、编译器、SDK及Library极大的提高了开发效率,但降低门槛的同时也让优秀更加难以企及了。不论软件如何发展,硬件的构成依旧没什么变化,计算机的运行基础依旧,所以掌握了基础与原理,就可以不变应外变,迅速掌握新技术适应业务与产品的发展。