Rendering views on the screen
来源:互联网 发布:设备分布图制作软件 编辑:程序博客网 时间:2024/05/20 10:14
很不错的一篇讲整体渲染的文章,这里记录一下,顺便当作记录一下作者blog。
来源于:http://nsomar.com/rendering-views-on-the-screen/
这里再多贴一篇关于setNeedsLayout和layoutIfNeeded区别的文章
http://www.iosinsight.com/setneedslayout-vs-layoutifneeded-explained/
In this article I will try to explain and review the path that the view takes from initialisation to display, and what part does the CPU and GPU take in that process.
Rendering overview
The application will create a CoreAnimation CALayer
Hierarchy using one of the following methods:
UIKit
which by creatingUIViews
will indirectly creates LayersCoreAnimations
By addingCALayers
manually
Application will then send the created hierarchy to the Render server (which is an external process) in Commit Transaction
Phase
The CA Hierarchy is submitted to the CA render server
, which render the hierarchy of Layers on screen using OpenGl
or Metal
Rendering UI
- Layout (2 Passes)
- Display
- Prepare Commit
- Commit
Layout
In this phase the view hierarchy is build by composing views either by [UIView addSubview]
or [CALayer addSublayer]
, Then the frames are set by calculating the constraints.
The layout phase is done in two consequent passes:
- Constraints pass (setting constraints)
- Layout pass (calculating frames)
Constraints Pass
Happens in updateConstraints
, subclasses can override updateConstraints
to add constraints to its subviews. This pass is executed bottom-up from the subviews to parent views.
The layout engine will call updateConstraintsIfNeeded
several times, however this method will only call updateConstraints
if the needs update flag is set by calling setNeedsUpdateConstraints
.
Calling setNeedsUpdateConstraints
will set the needs update flag so any consequent calls to updateConstraintsIfNeeded
(or the internal system layout pass methods). The constraints will be updated asynchronously.
Calling updateConstraintsIfNeeded
will cause the layout system to call updateConstraints
synchronously. However updateConstraints
is only called if setNeedsUpdateConstraints
have been called before.
Each time the Constraints pass happens is followed by the Layout pass.
Layout Pass
After the constraints are set from the previous pass, the Layout system can now process these constraints and calculate and set the correct frames for each view.
Happens in layoutSubviews
, subclasses can override layoutSubviews
to participate in the layout process and adjust the frames of the subviews. This pass is executed top-down from the parent view to the subviews. After this method the frame of the view is set.
Calling setNeedsLayout
will set the needs layout flag so any consequent calls to layoutIfNeeded
(or the internal system layout pass methods). The layout frames will be updated asynchronously.
Calling layoutIfNeeded
will cause the layout system to call layoutSubviews
synchronously. However layoutSubviews
is only called if setNeedsLayout
have been called before.
Display
In this phase the view will use GoreGraphics
to draw on the CALayer
that is backing the UIView
, this phase is also top-down.
The display phase take place in drawRect
and can be triggered by calling setNeedsDisplay
will will fire a future redraw.
Relation between Constraint, Layout and Display
Display
pass depends onLayout
pass which depends onConstraints
pass.- Adding/Removing/Updating Constraints will trigger changes to the layout by calling
setNeedsLayout
. - Layout pass (
layoutIfNeeded/layoutSubviews
) makes sure that the constraints are up-to data by calling an internal copy ofupdateConstraintsIfNeeded
.
Constraints/Layout rule of thumb
Prepare
In this phase the PNG/JPEG Images are decoded to bitmaps and are converted to a GPU optimised image in order to be served to the GPU.
Commit
Now that the layout is ready and the hierarchy is build, the layout system will package all the CALayer
hierarchy and send it to the rendering server
.
Animations
Rendering an animation is very similar to rendering a static UI with the distinction that when rendering the animations the animation also has to be package and sent to the render server
. The application will create the animation using animateWithDuration
or CABasicAnimations
and this animation will be package and sent ti the render server which in turn will render each frame for the animation.
CPU vs GPU bound operations
The CPU and CPU both participate in the rendering process each of them has its own role.
The main idea is to minimise the CPU involvement and increase the CPU one.
GPU operations
- Blending multiple images together
- Antialias images
- Composition of Image
CPU operations
- Masking of different views and images and clipping views to that mask
- Creating shadows around views
- Visual effects such as blurring
- Drawing with
CoreGraphics
- Rendering views on the screen
- On-screen Rendering vs. Off-screen Rendering
- pushbutton on the select-screen
- iOS开发之图形渲染分析、离屏渲染、当前屏幕渲染、On-Screen Rendering、Off-Screen Rendering
- Tap anywhere on the screen to continue
- Realtime Subsurface Scattering Skin Rendering On the GPU 演示视频
- An OpenGL ES renderer based on the GLSurfaceView rendering framework.
- How to: Filter List Views on the UI Specific Level
- Grab the color of the pixel on screen
- view slide as the user slides finger on the screen?
- Unity: Scaling the GUI based on the screen resolution
- print numbers on the screen.(show_str and dtoc function)
- Let the label display variable values on screen
- sikuli core: Finding GUI Patterns on the Screen
- Lesson 02 Getting an Image on the Screen
- SDL2入门教程(02_Getting an Image on the Screen)
- Menus' hover style's Rendering depends on the sequence of the css
- Loading Views On Demand
- C#程序将124.56转换成壹佰贰拾肆元伍角六分
- POJ 3273-Monthly Expense(二分法-最小化最高花费)
- [Android新手学习笔记09]-活动Activity启动模式
- [leetcode-二叉树层次遍历并统计每层节点数]--103. Binary Tree Zigzag Level Order Traversal
- 将youku的视频放到自己的网站上面播放
- Rendering views on the screen
- 利用百度tts 实现文字转语音(node)
- JS中的上下文this
- [NOIPOI2017]2.6日常训练解题报告
- Android插件化系列第(一)篇---Hook技术之Activity的启动过程的拦截
- Java中的多线程你只要看这一篇就够了
- Wireshark网络抓包(四)——工具
- 字面量、常量和变量之间的区别
- java动态代理记录