[037]Choreographer Skipped含義再探

前言

[036]Choreographer Skipped真正含義中阵子,我介紹了一種可以產(chǎn)生Choreographer Skipped的情況达址。就是在onVsync被調(diào)用之前,往主線程post的一個(gè)Message。那還有沒有其他方式可以產(chǎn)生這個(gè)Choreographer Skipped呢涧狮?

一避归、仔細(xì)看看代碼

@Override
public void onVsync(long timestampNanos, long physicalDisplayId, int frame) {
    ...
    //onVsync方法將會(huì)在Vsync信號(hào)接收之后被回調(diào)
    //mTimestampNanos就是這次Vsync信號(hào)接收的時(shí)間
    mTimestampNanos = timestampNanos;
    mFrame = frame;
    //往主線程的Looper中投放一個(gè)Asynchronous的Message,callback為this
    //這個(gè)Message被處理的時(shí)候就會(huì)調(diào)用下面run-doFrame的方法
    Message msg = Message.obtain(mHandler, this);
    msg.setAsynchronous(true);
    mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS);
}

請(qǐng)注意onVsync參數(shù)中timestampNanos秃臣,這個(gè)值代表什么呢,其實(shí)代表的是Vsync信號(hào)到達(dá)App的時(shí)間哪工,Vsync信號(hào)在通過socket通信發(fā)給App時(shí)候奥此,會(huì)帶上這個(gè)時(shí)間戳timestampNanos,這個(gè)過程其實(shí)是不會(huì)受主線程影響的雁比。

在Vsync信號(hào)到來之后稚虎,onVsync方法沒有被立刻調(diào)用,也可以產(chǎn)生Choreographer Skipped

二偎捎、寫個(gè)Demo驗(yàn)證一下

public class Main2Activity extends AppCompatActivity implements View.OnClickListener {

    private TextView mTxtView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        mTxtView = findViewById(R.id.txt_view);
        mTxtView.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        mTxtView.setText("請(qǐng)求Vsync信號(hào)");//會(huì)觸發(fā)scheduleTraversals蠢终,所以16ms以內(nèi)會(huì)接受到Vsync信號(hào)
        try {
            Thread.sleep(1000);//這樣子onVsync會(huì)推遲1000ms,才能被調(diào)用
        } catch (Exception e) {

        }
    }
}

注意我這里采用的是TextView茴她,因?yàn)門extView點(diǎn)擊沒有UI刷新寻拂,所以不會(huì)觸發(fā)scheduleTraversals,我在onClick中主動(dòng)調(diào)用mTxtView.setText败京,會(huì)觸發(fā)scheduleTraversals兜喻,所以App會(huì)在16ms以內(nèi)會(huì)接受到Vsync信號(hào),請(qǐng)注意16ms以內(nèi)赡麦,時(shí)間不固定朴皆。

Vsync信號(hào)到來的時(shí)間點(diǎn)就是onVsync的形參timestampNanos帕识。

然后mTxtView.setText完了之后再sleep 1000ms,處理完onClick代碼遂铡。主線程會(huì)去處理onVsync的方法肮疗,由于Vsync信號(hào)早就到了,所以就算此時(shí)onVsync投放的Asynchronous的Message被立刻處理扒接,但是已經(jīng)晚了伪货,所以還是會(huì)出現(xiàn)Choreographer Skipped。

D KobeWang2: onClick : start
D KobeWang2: onClick : end
I Choreographer: Skipped 60 frames!  The application may be doing too much work on its main thread.

三钾怔、總結(jié)

其實(shí)有很多Demo可以產(chǎn)生Choreographer Skipped碱呼,但是不管你怎么寫,肯定是下面兩種場景之一宗侦。

3.1 場景一

[036]Choreographer Skipped真正含義里介紹的Demo愚臀,雖然Vsync信號(hào)到了,onVsync被及時(shí)調(diào)用矾利,但是主線程中有未開始處理的耗時(shí)Message姑裂,推遲了doFrame的執(zhí)行時(shí)間。

場景一

3.2 場景二

本文介紹的Demo男旗,Vsync信號(hào)早早到了舶斧,但是由于主線程的耗時(shí)操作,onVsync無法被及時(shí)調(diào)用

場景二

3.3 更正

更正一下我在[036]Choreographer Skipped真正含義說的話

Choreographer Skipped真正反映的是onVsync和doFrame兩個(gè)方法調(diào)用的時(shí)間間隔

修正為

Choreographer Skipped真正反映的是Vsync信號(hào)到達(dá)App的時(shí)間和doFrame方法調(diào)用的時(shí)間間隔

場景一和場景二察皇,只不過是通過兩種方式增大了這個(gè)時(shí)間間隔而已茴厉。

3.4 onVsync被調(diào)用

我無數(shù)次的提到onVsync被調(diào)用,那到底o(hù)nVsync是怎么被調(diào)用的让网,其實(shí)主線程的Looper.loop中一次循環(huán)會(huì)先處理native層監(jiān)聽的vsync信號(hào)和Input事件呀忧,處理一次java層的Message师痕,就是類似這樣子的偽代碼溃睹。

public void loop() {
    for(;;) {
        //處理native層的任務(wù),處理完所有vsync信號(hào)胰坟,input事件因篇。
        //如果發(fā)現(xiàn)Vsync信號(hào)已經(jīng)抵達(dá)APP,就會(huì)通過JNI回調(diào)onVsync方法
        doNativeTasks();
        //處理java層的Message笔横,一次處理只能處理一個(gè)Message
        doJavaTasks();
    }
}

從主線程的Looper角度分析場景一和場景二的流程圖如下:
充分展示了Vsync黃色塊和doFrame紫色塊之間的時(shí)間間隔是怎么被增大的竞滓。

尾巴

還記得神雕俠侶中找到情花毒解藥的天竺神僧嘛,他先讓自己中毒吹缔,才找到解藥商佑。所以我們?cè)诮鉀Q一些疑難BUG的時(shí)候,需要學(xué)會(huì)如何制造BUG厢塘,才能了解BUG產(chǎn)生的原理茶没,才能找到解決BUG的方案肌幽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抓半,隨后出現(xiàn)的幾起案子喂急,更是在濱河造成了極大的恐慌,老刑警劉巖笛求,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廊移,死亡現(xiàn)場離奇詭異,居然都是意外死亡探入,警方通過查閱死者的電腦和手機(jī)狡孔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜂嗽,“玉大人步氏,你說我怎么就攤上這事⊥降” “怎么了荚醒?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長隆嗅。 經(jīng)常有香客問我界阁,道長,這世上最難降的妖魔是什么胖喳? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任泡躯,我火速辦了婚禮,結(jié)果婚禮上丽焊,老公的妹妹穿的比我還像新娘较剃。我一直安慰自己,他們只是感情好技健,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布写穴。 她就那樣靜靜地躺著,像睡著了一般雌贱。 火紅的嫁衣襯著肌膚如雪啊送。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天欣孤,我揣著相機(jī)與錄音馋没,去河邊找鬼。 笑死降传,一個(gè)胖子當(dāng)著我的面吹牛篷朵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婆排,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼声旺,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼控硼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艾少,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤卡乾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缚够,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幔妨,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年谍椅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了误堡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雏吭,死狀恐怖锁施,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杖们,我是刑警寧澤悉抵,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站摘完,受9級(jí)特大地震影響姥饰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孝治,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一列粪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谈飒,春花似錦岂座、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓤介,卻和暖如春吕喘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刑桑。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留募舟,地道東北人祠斧。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像拱礁,于是被迫代替她去往敵國和親琢锋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辕漂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 前言 我相信大家肯定遇到過下面這個(gè)LOG,表面意思是在主線程做了太多的事吴超,但是可能你們不知道這條LOG的真實(shí)含義钉嘹。...
    王小二的技術(shù)棧閱讀 2,321評(píng)論 1 3
  • 這篇博文是參考別人的博客哥桥,結(jié)合源碼自己又走了一遍钻弄,僅供自己記錄學(xué)習(xí)捶牢。 我們要掌握android房蝉,那么關(guān)于andro...
    scarecrowtb閱讀 2,178評(píng)論 1 3
  • 1边涕、概述 不論電腦掏击,電視丰滑,手機(jī)惯吕,我們看到的畫面都是由一幀幀的畫面組成的细诸。FPS是圖像領(lǐng)域中的定義沛贪,是指畫面每秒傳輸...
    高丕基閱讀 12,038評(píng)論 6 34
  • 一、概述 在 Logcat 中使用關(guān)鍵詞 Choreographer 進(jìn)行過濾震贵,對(duì) App 做一些操作利赋,一般能看到...
    風(fēng)風(fēng)風(fēng)箏閱讀 19,007評(píng)論 6 49
  • 為了理解App是如何進(jìn)行渲染的,我們必須了解手機(jī)硬件是如何工作猩系,那么就必須理解什么是VSYNC隐砸。 在講解VSYNC...
    Viking_Den閱讀 4,751評(píng)論 1 8