Windows Phone 效能優化(二)

2022-03-19 02:07:35 字數 4120 閱讀 9386

中又是還是會用到的,比如,如果我們需要對 scrollviewer 進行很多的控制,比如獲取它的「滑動」事件,scrollviewer

中在放置其它控制項,或者直接定製它的樣式等等(當然可以通過 visualtreehelper 也可以獲取 listbox 中的 scrollviewer)。

listbox (繼承自 itemscontrol)內部的實現就是封裝了 scrollviewer + itemscontrol 控制項,在本 demo 中,使用的組合為:

<

scrollviewer

x:name

="scrollviewer"

loaded

="scrollviewer_loaded"

>

<

itemscontrol

x:name

="listbox"

itemssource=""

>

<

itemscontrol.itemspanel

>

<

itemspaneltemplate

>

<

virtualizingstackpanel

/>

itemspaneltemplate

>

itemscontrol.itemspanel

>

<

itemscontrol.itemtemplate

>

<

datatemplate

>

<

stackpanel

orientation

="horizontal"

margin

="10,30,0,0"

>

<

image

verticalalignment

="top"

source=""

width

="150"

/>

<

textblock

text=""

width

="250"

foreground

="wheat"

fontsize

="25"

margin

="10,0,0,0"

="wrap"

/>

stackpanel

>

datatemplate

>

itemscontrol.itemtemplate

>

itemscontrol

>

scrollviewer

>

如果在 512mb 的模擬器上,還沒載入資料完成,應用就崩潰了:

優化演算法

下面 demo 的原理很簡單,就是當列表中的項,在螢幕內的時候,把它的 visibility 設定為 visibility.visible,

當在螢幕外面的時候,設定為 visibility.collapsed; 邏輯很簡單,但是對記憶體的占用明顯下降。但是,為了使用者

體驗,也就是如果當使用者滑動列表到螢幕的地方,它的專案沒有及時的顯示,在使用者的角度看,是會非常沮喪的,所以

需要乙個演算法檢查當前列表中的項是否在螢幕內。

思路:

1)首先在 xaml 頁面放乙個按鈕,如上圖所示,當應用載入完成時,預設不錯任何處理,當點選 「虛擬化」 按鈕時,

觸發自定義虛擬化方法,頁面中的 xaml:

<

button

content

="虛擬化"

horizontalalignment

="left"

margin

="335,0,0,0"

verticalalignment

="top"

width

="133"

height

="72"

tap="button_tap"

/>

相應的 c#:

//

當使用者單擊 按鈕時,開啟模擬虛擬化

private

void button_tap(object

sender, system.windows.input.gestureeventargs e)

2)當點就按鈕後,首先獲取列表中,所有由 datatemplate 中的 stackpanel 複製的每一項。因為 listbox 繼承自 itemscontrol,

並且它們 itemcontainergenerator 屬性的 containerfromindex(int index) 方法可以獲取列表中的指定的 item,然後在通過

visualtreehelper 的靜態方法,獲取模版產生的 stackpanel。全部的**:

void

visualizition()

//每0.5秒鐘,迴圈檢查一次列表中,哪些項在螢幕內,如果在螢幕內,則顯示,如果

//在螢幕外,則隱藏

observable.interval(timespan.fromseconds(.5)).observeondispatcher().subscribe((_) =>

else

}});

}//查詢「檢視樹」中的控制項

private t findfirstelementinvisualtree(dependencyobject parentelement) where

t : dependencyobject

else

}return

null

; }

當載入 200 條新聞的時候,執行工程效果:

上面演算法是每 0.5秒 遍歷一下 dictionary 的 keys,為了直觀就沒有再優化。比如每次遍歷的時間,

螢幕的可視區域等。

預設執行時,記憶體占用 208mb 效果:

單擊按鈕後,當上下滑動的時候,可以看到延遲顯示的 item,記憶體占用減少了不少:

另外,我想到可以使用快速排序的演算法方法,可以更快找到新滑動到螢幕裡的 item,之前在螢幕外的 item

如果還在螢幕外,則跳過,等等。關於如何優化上面演算法這裡就不在多講了。因為專案只是在介紹減少記憶體的

思路,所以沒有考慮在應用中如何在「載入更多..」時,如何再次新增新 item 等等實際互動。

還有就是關於 reactive extension 相關類庫(已經整合在了 wp8 的sdk 中)的使用,這裡也不過多介紹,它

確實是乙個神奇的東西,園子裡有朋友寫過相關的文章,我前段時間也翻譯了一下(譯文鏈結),稍後會整理

更加方便。

上面**中:observable.interval(timespan.fromseconds(.5)).observeondispatcher().subscribe((_) =>);

的含義是,每隔 0.5秒鐘,在 ui 執行緒中 呼叫一次 subscribe 註冊的方法。

引申

通過這個 demo,開發者應該知道了,在頁面中,盡量少的繪製元素,對於 windows phone 應用程式效能的提公升,對於記憶體占用

的優化,有多麼的明顯。例如,儘量減少 ui 控制項的巢狀;在 pivot (或者 panorama )頁面控制項中的項,如果 pivotitem 不在

當前螢幕中,則把它的 child 設為隱藏,當使用者切換到該 pivotitem 頁面時,在給它顯示出來。等等。

FLASH ActionScript 效能優化

一.圖形方面的優化 1.減少同時在螢幕上物體的個數 2.儘量減少螢幕需要重畫的範圍。3.盡量避免全屏滾動 4.保持幀數在16 20,每一幀都連續,比將幀數設定的很高,但是每一幀的計算超過幀時間,讓人感覺更舒服。5.如果乙個物體不需要顯示,盡量將他從螢幕上刪除,而不是將他設定成不可見。因為即使不可見的...

Flink State Rescale效能優化

2017年社群有一篇部落格就比較深入的介紹了operator 和 keyed state的rescale的實現,感興趣的話可以去了解下。這兩張圖對比了是否基於keygroup來划區的乙個差別,社群中的版本使用的是基於keygroup的版本實現的,可以看到可以減少對於資料的random的訪問。但是從b...

調優 Nginx效能調優

一.nginx優化配置 1.主配置檔案優化 注 部分配置詳解 worker processes 8 nginx程序數,建議按照cpu數目來指定,一般為它的倍數。worker cpu affinity 00000001 00000010 00000100 00001000 00010000 00100...