中又是還是會用到的,比如,如果我們需要對 scrollviewer 進行很多的控制,比如獲取它的「滑動」事件,scrollviewer
中在放置其它控制項,或者直接定製它的樣式等等(當然可以通過 visualtreehelper 也可以獲取 listbox 中的 scrollviewer)。
listbox (繼承自 itemscontrol)內部的實現就是封裝了 scrollviewer + itemscontrol 控制項,在本 demo 中,使用的組合為:
<如果在 512mb 的模擬器上,還沒載入資料完成,應用就崩潰了: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
>
優化演算法
下面 demo 的原理很簡單,就是當列表中的項,在螢幕內的時候,把它的 visibility 設定為 visibility.visible,
當在螢幕外面的時候,設定為 visibility.collapsed; 邏輯很簡單,但是對記憶體的占用明顯下降。但是,為了使用者
體驗,也就是如果當使用者滑動列表到螢幕的地方,它的專案沒有及時的顯示,在使用者的角度看,是會非常沮喪的,所以
需要乙個演算法檢查當前列表中的項是否在螢幕內。
思路:
1)首先在 xaml 頁面放乙個按鈕,如上圖所示,當應用載入完成時,預設不錯任何處理,當點選 「虛擬化」 按鈕時,
觸發自定義虛擬化方法,頁面中的 xaml:
<相應的 c#:button
content
="虛擬化"
horizontalalignment
="left"
margin
="335,0,0,0"
verticalalignment
="top"
width
="133"
height
="72"
tap="button_tap"
/>
//2)當點就按鈕後,首先獲取列表中,所有由 datatemplate 中的 stackpanel 複製的每一項。因為 listbox 繼承自 itemscontrol,當使用者單擊 按鈕時,開啟模擬虛擬化
private
void button_tap(object
sender, system.windows.input.gestureeventargs e)
並且它們 itemcontainergenerator 屬性的 containerfromindex(int index) 方法可以獲取列表中的指定的 item,然後在通過
visualtreehelper 的靜態方法,獲取模版產生的 stackpanel。全部的**:
void當載入 200 條新聞的時候,執行工程效果:visualizition()
//每0.5秒鐘,迴圈檢查一次列表中,哪些項在螢幕內,如果在螢幕內,則顯示,如果
//在螢幕外,則隱藏
observable.interval(timespan.fromseconds(.5)).observeondispatcher().subscribe((_) =>
else
}});
}//查詢「檢視樹」中的控制項
private t findfirstelementinvisualtree(dependencyobject parentelement) where
t : dependencyobject
else
}return
null
; }
上面演算法是每 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...