iOS面試題:什麼是離屏渲染?什麼狀況下會觸發?該如何應對?

更多:iOS面試題大全git

離屏渲染就是在當前屏幕緩衝區之外,新開闢一個緩衝區進行操做。github

離屏渲染出發的場景有如下:面試

  • 圓角 (maskToBounds並用纔會觸發)
  • 圖層蒙版
  • 陰影
  • 光柵化
爲何要有離屏渲染?

你們高中物理應該學過顯示器是如何顯示圖像的:須要顯示的圖像通過CRT電子槍以極快的速度一行一行的掃描,掃描出來就呈現了一幀畫面,隨後電子槍又會回到初始位置循環掃描,造成了咱們看到的圖片或視頻。性能

爲了讓顯示器的顯示跟視頻控制器同步,當電子槍新掃描一行的時候,準備掃描的時發送一個水平同步信號(HSync信號),顯示器的刷新頻率就是HSync信號產生的頻率。而後CPU計算好frame等屬性,將計算好的內容交給GPU去渲染,GPU渲染好以後就會放入幀緩衝區。而後視頻控制器會按照HSync信號逐行讀取幀緩衝區的數據,通過可能的數模轉換傳遞給顯示器,就顯示出來了。具體的你們自行查找資料或詢問相關專業人士,這裏只參考網上資料作一個簡單的描述。code

離屏渲染的代價很高,想要進行離屏渲染,首選要建立一個新的緩衝區,屏幕渲染會有一個上下文環境的一個概念,離屏渲染的整個過程須要切換上下文環境,先從當前屏幕切換到離屏,等結束後,又要將上下文環境切換回來。這也是爲何會消耗性能的緣由了。視頻

因爲垂直同步的機制,若是在一個 HSync 時間內,CPU 或者 GPU 沒有完成內容提交,則那一幀就會被丟棄,等待下一次機會再顯示,而這時顯示屏會保留以前的內容不變。這就是界面卡頓的緣由。圖片

[](https://github.com/liberalism...

CPU GPU 在繪製渲染視圖時作了大量的工做。離屏渲染髮生在 GPU 層面上,會建立新的渲染緩衝區,會觸發 OpenGL 的多通道渲染管線,圖形上下文的切換會形成額外的開銷,增長 GPU 工做量。若是 CPU GPU 累計耗時 16.67 毫秒尚未完成,就會形成卡頓掉幀。get

圓角屬性蒙層遮罩 都會觸發離屏渲染。指定了以上屬性,標記了它在新的圖形上下文中,在未癒合以前,不能夠用於顯示的時候就出發了離屏渲染。同步

  • 在OpenGL中,GPU有2種渲染方式it

    • On-Screen Rendering:當前屏幕渲染,在當前用於顯示的屏幕緩衝區進行渲染操做
    • Off-Screen Rendering:離屏渲染,在當前屏幕緩衝區之外新開闢一個緩衝區進行渲染操做
  • 離屏渲染消耗性能的緣由

    • 須要建立新的緩衝區
    • 離屏渲染的整個過程,須要屢次切換上下文環境,先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結束之後,將離屏緩衝區的渲染結果顯示到屏幕上,又須要將上下文環境從離屏切換到當前屏幕
  • 哪些操做會觸發離屏渲染?

    • 光柵化,layer.shouldRasterize = YES
    • 遮罩,layer.mask
    • 圓角,同時設置 layer.masksToBounds = YES、layer.cornerRadius大於0
    • 考慮經過 CoreGraphics 繪製裁剪圓角,或者叫美工提供圓角圖片
    • 陰影,layer.shadowXXX,若是設置了 layer.shadowPath 就不會產生離屏渲染
相關文章
相關標籤/搜索