在眾多效能指標中,完成頁面載入所需的時間是非常重要的,尤其是對於關鍵頁面,例如詳情頁,1秒開啟和3秒開啟有很大的差異,直接影響GMV。
我們來談談頁面載入完成的定義,不是頁面布局完成,不是請求完成,而是 ** 和 text 都已經呈現出來了。 更常見的做法是在頁面上viewdidappear
而請求完成並將資料轉換為模型後,前者表示頁面出現的時間,後者表示獲取資料的時間,基本可以反映頁面載入時間。 但也存在一些問題,例如:
業務經常調整,所以埋點也需要調整,在這個過程中容易出現誤埋漏的問題。 有些頁面會有多個請求,只有這些請求都完成後才能呈現頁面,然後資料請求跟蹤會有點麻煩。 這些時間點仍然會與使用者實際看到的時間不同,這還不夠準確。 因此,非侵入性檢測機制很重要。 我碰巧看到使用影象識別自動確認掘金上網頁載入成功,我受此啟發,覺得這條路上有很多戲劇性。 推送呈現頁面時,每隔一段時間擷取一次螢幕截圖,並分析當前頁面空白(實心)部分的比例,如果超過某個閾值,則認為該頁面尚未載入。 這裡有幾點需要注意:
需要主動檢視截圖,載入完成時無法告知。不同之處在於,沒有辦法確切地知道負載何時完成。 有些頁面被刻意設計成有很多空白,這不容易判斷。 未載入 完成 不同的頁面會有不同的行為。 當使用者滑動時,有可能上一頁已經載入好了 最簡單的解決辦法就是把**上的每乙個畫素都拿出來放進字典裡,然後如果有顏色值相同的畫素,那麼count++
。問題也很明顯,乙個螢幕上有幾十萬個點,這一輪還沒分析,使用者已經開啟了第二頁。
回到你想要實現的目標:純色的比例。 將**壓縮到更小的尺寸不是很好嗎? 老套路,鋪開畫布,把**倒在上面。
+ (uiimage *)imagewithimage:(uiimage *)image scaledtosize:(cgsize)newsize現在是真正的計算,這是乙個相對簡單的過程:
將 uiimage 轉換為 cgimage datacgdataproviderref provider = cgimagegetdataprovider(image.cgimage);cfdataref pixeldata = cgdataprovidercopydata(provider);const uint8* data = cfdatagetbyteptr(pixeldata);long datalength = cfdatagetlength(pixeldata);int numberofcolorcomponents = 4;r,g,b,a用於儲存顏色,key為r-g-b字串,value為出現次數nsmutabledictionary *colors = [[nsmutabledictionary alloc] init]; int colorcount = 0;for (int i = 0; i < datalength);i += numberofColorComponents) else } 按出現次數排序 nsarray *sortedcolorcount = [colors.allvalues sortedarrayusingcomparator:^nscomparisonresult(id _nonnull obj1, id _nonnull obj2) ]nsmutablearray *percent = [[nsmutablearray alloc] init];計算比例並按從高到低的順序排序,取前 10 個[sortedcolorcount enumerateobjectsusingblock: (nsnumber *count, nsuinteger idx, bool * nonnull stop) percent addobject:@(count intvalue] (float)(colorcount))] return [percent copy];
把它放在第一位uiimage
轉換為cfdataref
並再次遍歷它color
,以相同color
最後積累並整理它們。
返回的資料如下所示:
這為您提供了顏色的百分比。
假設超過30%的純色區域沒有滿載,我們找幾個demo來測試一下
結果符合“未完成載入”定義。
另乙個。
雖然未載入,但結果小於 30%。
如果將該值設定為較小的值,則可能會發生意外殺戮,例如此介面。
結果。
這個介面已經載入過了,但是因為留空比較多,所以純色的比例也比較多,如果按照前面的公式,會誤傷的,怎麼解決這個問題,後面我們再討論。
讓我們看一下另乙個尚未完成載入的頁面:
這是這個頁面的結果。
如果載入了中間部分(即面積最大的部分),則它變為。
這也是不載入頁面的新規則。
我們來看一下純色比例截圖分析的問題:
當每 n 秒擷取一次螢幕截圖時,使用者可能會滑動到螢幕 2,此時螢幕 1 已載入,但螢幕 2 未載入,因此不應屬於頁面載入未完成的類別。 不同頁面的純色特性不同,有的比較分散,有的在正常情況下會有更多的純色,所以很容易誤判。 我還沒有想到乙個特別好的方法來處理場景 1,但一種方法是確定執行迴圈的模式是否等於uitrackingrunloopmode
判斷是否有滑倒,不是很優雅,但可能會起作用。
對於場景 2,可以將資料傳送到伺服器,讓伺服器計算某個頁面的純色分布,例如大部分< 10%,少數超過 20%,那麼就可以判斷載入沒有完成,但成本還是有點高。
因此,雖然該方案可以是非侵入性的,但在結果判斷上仍存在一些不足,有望推出更成熟的方案。