上一節(jié)介紹了Silverlight資源文件動(dòng)態(tài)下載的必要性,,同時(shí)介紹了用于動(dòng)態(tài)下載的關(guān)鍵技術(shù)WebClient,。這一節(jié)將總結(jié)歸納Silverlight中圖片資源引用的幾種方法,,著重介紹動(dòng)態(tài)下載及緩存。還是考慮我們的應(yīng)用:MMORPG游戲,,都需要哪些資源呢,?主要有兩類,音頻文件和游戲圖片,。其實(shí)各類資源的引用方法大同小異,,這里僅以圖片資源為例,講述一下各種引用方法,。 1 圖片直接編譯到silverlight應(yīng)用程序的dll當(dāng)中這也是缺省的方法,,具體做法是:在visual studio中,選擇一個(gè)圖片,,查看屬性窗口,。
Build Action: Resource (注意不要選擇Embeded Resource,Silverlight無(wú)法識(shí)別該格式,。)
Copy to output directory: Do not copy
于是在Xaml中可以這樣引用圖片
用C#引用:
注意BitmapImage對(duì)象有個(gè)ImageOpened事件,,可以用來(lái)通知圖片已經(jīng)可用。 或者:
我們還可以選擇另外一個(gè)相對(duì)復(fù)雜一些的方法:
注意下面的用法是錯(cuò)誤的:
運(yùn)行時(shí)會(huì)顯示錯(cuò)誤信息。 2 把圖片資源放到silverlight應(yīng)用程序的主包(Xap)中具體做法是:在visual studio中,,選擇一個(gè)圖片,查看屬性窗口,。
Build Action: Content
Copy to output directory: Always copy
這時(shí)候把xap文件改名為zip文件,,可以發(fā)現(xiàn)Images目錄下有g(shù)randpiano.jpg文件。說(shuō)明圖片在xap包中,,但是沒(méi)有編譯到dll中,。 在Xaml中可以這樣引用圖片
注意跟前面的區(qū)別:最前面的“/”代表xap文件的根路徑。
用C#引用:
或者:
注意在C#引用中沒(méi)有最前面的“/”,。 總的來(lái)說(shuō),把文件放到主包中與編譯到dll中比較相像,。但都不是動(dòng)態(tài)下載,,因?yàn)閳D片都還在主包中,會(huì)跟主程序一同下載,。 3 把圖片放到web服務(wù)器上為方便描述起見(jiàn),,假設(shè)圖片與silverlight應(yīng)用程序在同一個(gè)域,不存在跨域的問(wèn)題,。為了突出主題,,跨域訪問(wèn)的授權(quán)許可這里就不討論了,。另外假設(shè)圖片目錄與silverlight主包在同一個(gè)目錄。即
/ClientBin/
App.Xap
Images/
具體做法是:在visual studio中,,選擇一個(gè)圖片,,查看屬性窗口。
build action: None
Copy to output directory: Always copy
在Xaml中可以這樣引用圖片
用C#引用:
咦,,發(fā)現(xiàn)沒(méi)有,?這與方法2完全相同!沒(méi)錯(cuò),,Silverlight會(huì)首先檢查xap包,,如果沒(méi)有找到圖片,會(huì)再檢查web服務(wù)器,。也就是說(shuō),,相同的代碼,你可以在方法2和方法3中自由選擇和切換,,方便吧,? 方法3雖然與方法2代碼相同,本質(zhì)上已經(jīng)根本不同,。方法3中圖片文件已經(jīng)不在xap文件中,,而是在web服務(wù)器上,意味著xap文件的尺寸已經(jīng)大大減小,,silverlight應(yīng)用程序的加載時(shí)間大大縮小,。缺點(diǎn)是這些圖片因?yàn)闀?huì)在引用時(shí)動(dòng)態(tài)從服務(wù)器下載,直到下載完成才可使用,,所以會(huì)導(dǎo)致延遲,。不過(guò)由于Silverlight緩存資源的緣故,只有第一次引用會(huì)有延遲,,再次引用時(shí)將直接從緩存中讀取文件,,沒(méi)有絲毫延遲。
除此之外,,更加靈活和強(qiáng)大的方式是使用上節(jié)介紹的WebClient類的OpenReadAsync方法,。代碼如下:
前一節(jié)講過(guò)webClient與瀏覽器共享緩存,即webClient會(huì)把下載的文件保存到瀏覽器緩存目錄中,,如果文件已經(jīng)被緩存,,再次調(diào)用OpenReadAsync方法時(shí)將直接中緩存中獲得文件,這將大大減小獲取文件的時(shí)間,。但是從瀏覽器緩存獲取文件仍然會(huì)有一點(diǎn)點(diǎn)延遲,,通常不會(huì)被察覺(jué),但是如果用于顯示動(dòng)畫(huà),,這個(gè)延遲會(huì)導(dǎo)致嚴(yán)重閃爍,。解決這個(gè)問(wèn)題的辦法就是把下載的資源保存到silverlight的內(nèi)存中,,引用時(shí)直接從內(nèi)存讀取。Application.Resources是個(gè)不錯(cuò)的選擇,,可以用于資源緩存,。
4. 把圖片打包放到web服務(wù)器上把圖片打包放置到web服務(wù)器上更便于圖片資源的管理和維護(hù),而且可以把圖片分類保存到不同的壓縮包里,。因?yàn)橄螺d圖片時(shí)通常是同類圖片一起下載,,下載一個(gè)包當(dāng)然比分開(kāi)下載許多圖片方便快捷許多。
具體方法是把圖片打包(zip)后,,放置到ClientBin目錄,。然后代碼如下:
至此圖片引用以及動(dòng)態(tài)下載和緩存的技術(shù)討論完畢了,應(yīng)該說(shuō)幾乎囊括了主要的引用方式,,大家可以根據(jù)具體情況選用其中的方法,。如果還有其他方法沒(méi)有收錄進(jìn)來(lái),歡迎大家補(bǔ)充,。為了方便大家學(xué)習(xí)和使用,,這里附有源碼,每個(gè)項(xiàng)目文件代表一種方法,。
后面文章將討論如何把該技術(shù)應(yīng)用到我們的MMORPG游戲中去,,實(shí)現(xiàn)圖片的動(dòng)態(tài)下載策略。謝謝支持,!
參考資料:
|
|
來(lái)自: Jcstone > 《Silverlight》