小程序FMP優化實錄,大廠面試題匯總

前言

金九銀十面試季,相信大家肯定急需一套Android面試寶典,今天小編就給大家準備了我珍藏已久的Android高階面試寶典,一份超級詳細的Android面試必備知識點,供大家學習 !

想必每一個安卓程序員都有追求大廠的決心,但是想要進入大廠,我們需要掌握哪些知識點呢?這里,我為大家梳理了一個整體的知識架構。整體包括Java、Android、算法、網絡等。希望大家閱讀之后,能幫助大家完善與整理自己的知識體系。祝大家面試順利~~

文末還有給大家分享我整理的Android面試專題及答案可以拿去參考下~

注意,整篇文章是知識點的概括,不包含答案,需要大家多看源碼,知識只有自己去探索與發現,才會彌足珍貴!

二、顯示系統基礎知識

在一個典型的顯示系統中,一般包括CPU、GPU、Display三個部分, CPU負責計算幀數據,把計算好的數據交給GPU,GPU會對圖形數據進行渲染,渲染好后放到buffer(圖像緩沖區)里存起來,然后Display(屏幕或顯示器)負責把buffer里的數據呈現到屏幕上。如下圖:

2.1 基礎概念

  • 屏幕刷新頻率 一秒內屏幕刷新的次數(一秒內顯示了多少幀的圖像),單位 Hz(赫茲),如常見的 60 Hz。刷新頻率取決于硬件的固定參數(不會變的)。

  • 逐行掃描 顯示器并不是一次性將畫面顯示到屏幕上,而是從左到右邊,從上到下逐行掃描,順序顯示整屏的一個個像素點,不過這一過程快到人眼無法察覺到變化。以 60 Hz 刷新率的屏幕為例,這一過程即 1000 / 60 ≈ 16ms。

  • 幀率 (Frame Rate) 表示 GPU 在一秒內繪制操作的幀數,單位 fps。例如在電影界采用 24 幀的速度足夠使畫面運行的非常流暢。而 Android 系統則采用更加流程的 60 fps,即每秒鐘GPU最多繪制 60 幀畫面。幀率是動態變化的,例如當畫面靜止時,GPU 是沒有繪制操作的,屏幕刷新的還是buffer中的數據,即GPU最后操作的幀數據。

  • 畫面撕裂(tearing) 一個屏幕內的數據來自2個不同的幀,畫面會出現撕裂感,如下圖

明顯看出畫面錯位的位置,這就是畫面撕裂。

2.2 雙緩存

2.2.1 畫面撕裂 原因

屏幕刷新頻是固定的,比如每16.6ms從buffer取數據顯示完一幀,理想情況下幀率和刷新頻率保持一致,即每繪制完成一幀,顯示器顯示一幀。但是CPU/GPU寫數據是不可控的,所以會出現buffer里有些數據根本沒顯示出來就被重寫了,即buffer里的數據可能是來自不同的幀的, 當屏幕刷新時,此時它并不知道buffer的狀態,因此從buffer抓取的幀并不是完整的一幀畫面,即出現畫面撕裂。

簡單說就是Display在顯示的過程中,buffer內數據被CPU/GPU修改,導致畫面撕裂。

2.2.2 雙緩存

那咋解決畫面撕裂呢? 答案是使用 雙緩存。

由于圖像繪制和屏幕讀取 使用的是同個buffer,所以屏幕刷新時可能讀取到的是不完整的一幀畫面。

雙緩存,讓繪制和顯示器擁有各自的buffer:GPU 始終將完成的一幀圖像數據寫入到 Back Buffer,而顯示器使用 Frame Buffer,當屏幕刷新時,Frame Buffer 并不會發生變化,當Back buffer準備就緒后,它們才進行交換。如下圖:

2.2.3 VSync

問題又來了:什么時候進行兩個buffer的交換呢?

假如是 Back buffer準備完成一幀數據以后就進行,那么如果此時屏幕還沒有完整顯示上一幀內容的話,肯定是會出問題的。看來只能是等到屏幕處理完一幀數據后,才可以執行這一操作了。

當掃描完一個屏幕后,設備需要重新回到第一行以進入下一次的循環,此時有一段時間空隙,稱為VerticalBlanking Interval(VBI)。那,這個時間點就是我們進行緩沖區交換的最佳時間。因為此時屏幕沒有在刷新,也就避免了交換過程中出現 screen tearing的狀況。

VSync(垂直同步)是VerticalSynchronization的簡寫,它利用VBI時期出現的vertical sync pulse(垂直同步脈沖)來保證雙緩沖在最佳時間點才進行交換。另外,交換是指各自的內存地址,可以認為該操作是瞬間完成。

所以說V-sync這個概念并不是Google首創的,它在早年的PC機領域就已經出現了。

三、Android屏幕刷新機制

3.1 Android4.1之前的問題

具體到Android中,在Android4.1之前,屏幕刷新也遵循 上面介紹的 雙緩存+VSync 機制。如下圖:

以時間的順序來看下將會發生的過程:

  1. Display顯示第0幀數據,此時CPU和GPU渲染第1幀畫面,且在Display顯示下一幀前完成
  2. 因為渲染及時,Display在第0幀顯示完成后,也就是第1個VSync后,緩存進行交換,然后正常顯示第1幀
  3. 接著第2幀開始處理,是直到第2個VSync快來前才開始處理的。
  4. 第2個VSync來時,由于第2幀數據還沒有準備就緒,緩存沒有交換,顯示的還是第1幀。這種情況被Android開發組命名為“Jank”,即發生了丟幀
  5. 當第2幀數據準備完成后,它并不會馬上被顯示,而是要等待下一個VSync 進行緩存交換再顯示。

所以總的來說,就是屏幕平白無故地多顯示了一次第1幀。

原因是 第2幀的CPU/GPU計算 沒能在VSync信號到來前完成 。

我們知道,雙緩存的交換 是在Vsyn到來時進行,交換后屏幕會取Frame buffer內的新數據,而實際 此時的Back buffer 就可以供GPU準備下一幀數據了。 如果 Vsyn到來時 CPU/GPU就開始操作的話,是有完整的16.6ms的,這樣應該會基本避免jank的出現了(除非CPU/GPU計算超過了16.6ms)。 那如何讓 CPU/GPU計算在 Vsyn到來時進行呢?

3.2 drawing with VSync

為了優化顯示性能,Google在Android 4.1系統中對Android Display系統進行了重構,實現了Project Butter(黃油工程):系統在收到VSync pulse后,將馬上開始下一幀的渲染。即一旦收到VSync通知(16ms觸發一次),CPU和GPU 才立刻開始計算然后把數據寫入buffer。如下圖:

CPU/GPU根據VSYNC信號同步處理數據,可以讓CPU/GPU有完整的16ms時間來處理數據,減少了jank。

一句話總結,VSync同步使得CPU/GPU充分利用了16.6ms時間,減少jank。

問題又來了,如果界面比較復雜,CPU/GPU的處理時間較長 超過了16.6ms呢?如下圖:

  1. 在第二個時間段內,但卻因 GPU 還在處理 B 幀,緩存沒能交換,導致 A 幀被重復顯示。
  2. 而B完成后,又因為缺乏VSync pulse信號,它只能等待下一個signal的來臨。于是在這一過程中,有一大段時間是被浪費的。
  3. 當下一個VSync出現時,CPU/GPU馬上執行操作(A幀),且緩存交換,相應的顯示屏對應的就是B。這時看起來就是正常的。只不過由于執行時間仍然超過16ms,導致下一次應該執行的緩沖區交換又被推遲了——如此循環反復,便出現了越來越多的“Jank”。

為什么 CPU 不能在第二個 16ms 處理繪制工作呢?

原因是只有兩個 buffer,Back buffer正在被GPU用來處理B幀的數據, Frame buffer的內容用于Display的顯示,這樣兩個buffer都被占用,CPU 則無法準備下一幀的數據。 那么,如果再提供一個buffer,CPU、GPU 和顯示設備都能使用各自的buffer工作,互不影響。

3.3 三緩存

三緩存就是在雙緩沖機制基礎上增加了一個 Graphic Buffer 緩沖區,這樣可以最大限度的利用空閑時間,帶來的壞處是多使用的一個 Graphic Buffer 所占用的內存。

  1. 第一個Jank,是不可避免的。但是在第二個 16ms 時間段,CPU/GPU 使用 第三個 Buffer 完成C幀的計算,雖然還是會多顯示一次 A 幀,但后續顯示就比較順暢了,有效避免 Jank 的進一步加劇。

  2. 注意在第3段中,A幀的計算已完成,但是在第4個vsync來的時候才顯示,如果是雙緩沖,那在第三個vynsc就可以顯示了。

三緩沖有效利用了等待vysnc的時間,減少了jank,但是帶來了延遲。 所以,是不是 Buffer 越多越好呢?這個是否定的,Buffer 正常還是兩個,當出現 Jank 后三個足以。

以上就是Android屏幕刷新的原理了。

最后

簡歷首選內推方式,速度快,效率高啊!然后可以在拉鉤,boss,脈脈,大街上看看。簡歷上寫道熟悉什么技術就一定要去熟悉它,不然被問到不會很尷尬!做過什么項目,即使項目體量不大,但也一定要熟悉實現原理!不是你負責的部分,也可以看看同事是怎么實現的,換你來做你會怎么做?做過什么,會什么是廣度問題,取決于項目內容。但做過什么,達到怎樣一個境界,這是深度問題,和個人學習能力和解決問題的態度有關了。大公司看深度,小公司看廣度。大公司面試你會的,小公司面試他們用到的你會不會,也就是崗位匹配度。

面試過程一定要有禮貌!即使你覺得面試官不尊重你,經常打斷你的講解,或者你覺得他不如你,問的問題缺乏專業水平,你也一定要尊重他,誰叫現在是他選擇你,等你拿到offer后就是你選擇他了。

另外,描述問題一定要慢!不要一下子講一大堆,慢顯得你沉穩、自信,而且你還有時間反應思路接下來怎么講更好。現在開發過多依賴ide,所以會有個弊端,當我們在面試講解很容易不知道某個方法怎么讀,這是一個硬傷…所以一定要對常見的關鍵性的類名、方法名、關鍵字讀準,有些面試官不耐煩會說“你到底說的是哪個?”這時我們會容易亂了陣腳。正確的發音+沉穩的描述+好聽的嗓音決對是一個加分項!

最重要的是心態!心態!心態!重要事情說三遍!面試時間很短,在短時間內對方要摸清你的底子還是比較不現實的,所以,有時也是看眼緣,這還是個看臉的時代。

希望大家都能找到合適自己滿意的工作!
如果需要PDF版本可以在GitHub中自行領取!

進階學習視頻

附上:我們之前因為秋招收集的二十套一二線互聯網公司Android面試真題?(含BAT、小米、華為、美團、滴滴)和我自己整理Android復習筆記(包含Android基礎知識點、Android擴展知識點、Android源碼解析、設計模式匯總、Gradle知識點、常見算法題匯總。)

題**?(含BAT、小米、華為、美團、滴滴)和我自己整理Android復習筆記(包含Android基礎知識點、Android擴展知識點、Android源碼解析、設計模式匯總、Gradle知識點、常見算法題匯總。)

[外鏈圖片轉存中…(img-pZ8o97qN-1619769952918)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/386583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386583.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386583.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件CRC和MD5校驗

文件CRC和MD5校驗 CRC和MD5用于文件和數據的傳輸校驗,以確認是否接收成功。 unit CRCMD5;interface { 獲取文件CRC校驗碼 } function GetFileCRC(const iFileName: string): String; { 獲取字符串CRC校驗碼 } function GetStringCRC(const Str: string): Cardinal; …

Oracle字符分隔函數(split)

為了讓 PL/SQL 函數返回數據的多個行,必須通過返回一個 REF CURSOR 或一個數據集合來完成。REF CURSOR 的這種情況局限于可以從查詢中選擇的數據,而整個集合在可以返回前,必須進行具體化。Oracle 9i 通過引入的管道化表函數糾正了后一種情況。…

已成功拿下字節、騰訊、脈脈offer,吐血整理

為什么想跳槽? 簡單說一下當時的狀況,我在這家公司做了兩年多,這兩年多完成了一個大項目,作為開發的核心主力,開發壓力很大,特別是項目上線前的幾個月是非常辛苦,幾乎每晚都要加班到12點以后&a…

復雜HTML解析

#再端一碗BeautifulSoup #獲取《戰爭與和平》中的人物名字from urllib.request import urlopen from bs4 import BeautifulSouphtml urlopen("http://www.pythonscraping.com/pages/warandpeace.html") bsObj BeautifulSoup(html,html.parser)#namelist bsObj.fin…

java main方法里調用mapper

在main方法中調用mybatis的mapper,一次性執行導入數據功能package com.runxsoft.test;import com.runxsoft.iutils.common.utils.UserUtils; import com.runxsoft.superwe.base.SqlVo; import com.runxsoft.superwe.base.mapper.ProtogenesisMapper; import com.run…

已成功拿下字節、騰訊、脈脈offer,滿滿干貨指導

開頭 籠統來說,中年程序員容易被淘汰的原因其實不外乎三點。 1、輸出能力已到頂點。這個人奮斗十來年了,依舊碌碌無為,很明顯這人的天花板就這樣了,說白了,天賦就這樣。 2、適應能力越來越差。年紀大,有家…

ServletRequest HttpServletRequest 請求方法 獲取請求參數 請求轉發 請求包含 請求轉發與重定向區別 獲取請求頭字段...

原文地址:ServletRequest HttpServletRequest 請求方法 獲取請求參數 請求轉發 請求包含 請求轉發與重定向區別 獲取請求頭字段ServletRequest 基本概念 JavaWeb中的 "Request"對象 實際為 HttpServletRequest 或者 ServletRequest, 兩者都為接口服務器接收請求…

c#掃描圖片去黑邊(掃描儀去黑邊)

/// <summary> /// 自動去除圖像掃描黑邊 /// </summary> /// <param name"fileName"></param> public static void AutoCutBlackEdge(string fileName) { //打開圖像 Bit…

已成功拿下字節、騰訊、脈脈offer,算法太TM重要了

一、背景介紹 從實用角度梳理一篇能夠幫大家快速掃盲的CMake基礎教程&#xff0c;也是對我目前負責項目的一次學習總結。既然選擇從項目實用性考慮&#xff0c;下面的講解內容可能并不一定完整&#xff0c;更多的是符合項目目前使用到的一些特性。 接下來正面回答這個問題&am…

SpringBoot2.0 Actuator 監控參數說明

主要內容更 監控參數說明 Maven坐標 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer</groupId>&…

帶你一步一步深入Handler源碼,醍醐灌頂!

開頭 最近有粉絲反應&#xff0c;不想做安卓了&#xff0c;有朋友轉到前端了&#xff0c;安卓不行了&#xff0c;問我怎么辦&#xff1f; 自從RN&#xff0c;Weex這種跨平臺編程語言出來以后&#xff0c;安卓將死的言論總是不絕于耳。隨著頗有摧枯拉朽之勢Flutter的出現&…

Spring基于狀態機squirrel-foundation簡單使用

squirrel-foundation的一些使用方法在百度上資料還是比較少&#xff0c;我是根據以下三個大佬寫的文章借鑒的&#xff0c;在這里記錄一下。 1、squirrel-foundation-demo 2、Squirrel使用&#xff08;中文文檔&#xff09; 3、squirrel-foundation狀態機的使用細節 我在這里直接…

記得把每一次面試當做經驗積累,深夜思考

開頭 Android開發&#xff0c;假如開始沒有任何的開發經驗的話&#xff0c; 千萬不要著急&#xff0c;不要想著在短時間內就把一個語言學習好&#xff0c; 因為你之前沒有任何的學習經驗&#xff0c; 在這個過程中需要有耐心地學習完JAVA的基礎知識&#xff0c; 然后才開始踏上…

squirrel-foundation-demo

一個簡單的squirrel-foundation-demo 利用狀態機模擬一個訂單的支付過程。 squirrel-foundation沒有任何嚴重的依賴關系&#xff0c;因此基本上它應該是高度可嵌入的。squirrel-foundation沒有整合spring框架&#xff0c;所以首先要用spring集成squirrel-foundation。spring集成…

MongoDB學習目錄

MongoDB基礎篇 MongoDB 之 $ 關鍵字 python操作MongoDB 轉載于:https://www.cnblogs.com/yanzhi-1996/p/11095016.html

講的真透徹!還有人不知道什么是AndroidX的嗎?已拿offer入職

前言 春招已經接近尾聲了&#xff0c;不知道各位小伙伴有沒有收獲自己心儀的offer呢。筆者疫情被裁后在家LeetCode狂刷了800多題&#xff0c;加之自己以為工作總結的知識、經驗&#xff0c;系統化的整理了一下。在五一期間已經收獲了字節的offer。廢話不多說&#xff0c;下面是…

docker 啟動的 jenkins 中調用宿主機docker進行build

前言 期初有這個需求感覺就跟套娃一樣&#xff0c;你在docker 中調用docker&#xff0c;笑哭……這個也太逗了。 不過的確遇到了&#xff0c;因為jenkins 容器中沒有docker &#xff0c;所以在編譯 docker build 的時候 會出現 docker command 不存在。 好吧&#xff0c;解決他…

Codeforces 773D Perishable Roads 最短路 (看題解)

Perishable Roads 智商題&#xff0c; 不會啊。。 貼個官方題解 https://codeforces.com/blog/entry/51883 #include<bits/stdc.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_p…

Rancher中的服務升級實驗

創建一個空的應用myAPP&#xff0c;在myAPP 應用中&#xff0c;創建一個服務nginx-test&#xff0c;包含2個容器副本&#xff0c;使用nginx:1.13.0鏡像。假設使用一段時期以后&#xff0c;nginx的版本升級到1.13.1了&#xff0c;如何將該服務的鏡像版本升級到新的版本&#xff…

該如何高效實用Kotlin?看這一篇就夠了!

前言 說起程序員人們的第一印象就是工資高、加班兇、話少錢多頭發少。再加上現在科技互聯網公司太吃香&#xff0c;bat、華為小米等公司程序員加班情況被廣泛傳播&#xff0c;程序員用生命在敲代碼的印象刻在了很多人的心里。 與其它行業一樣&#xff0c;凡是有高級和普通&…