這是一篇暴力的内容,所講之主題雖然可以為Silverlight遊戲開發解決一些問題,但是同樣也會帶來新的其他問題,于是,有意思的事情出現了,到底該怎麼選擇呢?還是依據你的項目進行選取吧,本文純粹使用代碼方式程式設計,請準備好Visual Studio,不需要Expression。
遊戲開發在開始的時候一般不會注意一個重要的細節,就是“特效”,角色也好,場景也罷,可能都不會是最占用磁盤空間的資源,特效資源,包含了技能釋放的、場景中的,甚至更新也得顯示光環的,更何況有那種收費的全屏“求交往”特效,如此之多如此之大的資源包絕對夠咱們頭疼的了,那麼,今天提供一個算法來為咱們的Silverlight特效資源大瘦身,今次我們隻讨論有透明的那種特效,沒有透明的特效直接使用關鍵色镂空即可。
首先表明特效一定是圖檔動畫序列,以目前的技術來說使用XAML做特效不太實際,一方面特效太過複雜,使用矢量來做成本很不劃算,另一方面所産出特效的繪制工作效率不及直接用特效工具來做的快又好看(想象一下每個特效20多幀的恐怖狀況吧),最後一個方面,這方面的人才幾乎完全沒有。
那麼,我們一起看看一個特效大概會有多大:
<a target="_blank" href="http://blog.51cto.com/attachment/201111/134050789.jpg"></a>
這個規格是一個簡單的爆破特效,由于使用了半透明,是以隻能使用PNG的方式來做,不能用關鍵色镂空,一共20張512*512圖檔787KB,接近1MB,那麼好,打個包還有752KB,很顯然,無論是動态載入還是跟随釋出包一起,都是一個及其占用磁盤空間的做法,另外一個角度上就是帶寬和記憶體的占用,如果說可以将這個特效減少到隻有100多KB,那就非常爽了。
使用JPG來代替PNG就能直接達到這個瘦身效果,同等的特效隻有163KB。
<a target="_blank" href="http://blog.51cto.com/attachment/201111/134059564.jpg"></a>
可是問題來了,jpg畢竟是jpg,沒有png的半透明效果,我們分析一下要想達到類似的效果如何進行處理,參看下圖:
<a target="_blank" href="http://blog.51cto.com/attachment/201111/134107843.jpg"></a>
分析一下,可以得到一個簡單的結論,就是顔色越黑,越是我們不需要的,而顔色越亮就越有儲存的價值,那麼以此可以推導,是否可以通過顔色的色值來看這個顔色的儲存價值?答案是可以的,在圖像存儲中(尤其是最近幾年)顔色以32位方式處理為主,所表示的顔色是8個F,FF FF FF FF,分别代表了ARGB——Alpha、Red、Green、Blue,A是透明度,RGB組成了16777215種顔色,而色值越大顔色就越接近白色,色值越小就越接近黑色,那麼,我們是否可以一個平均方法來取得色彩到底是接近于黑還是白?算法如下:RGB三色相加平均數就是A的數值,這樣,黑色将被完全去掉,但不會影響那些接近于黑色的顔色,這樣的顔色因為接近于黑,是以透明度也是很高,而我們的特效部分則是以亮光為主,透明度自然就很低了。
按照我們的想法實作的效果如下:
<a target="_blank" href="http://blog.51cto.com/attachment/201111/134117977.jpg"></a>
<a target="_blank" href="http://blog.51cto.com/attachment/201111/134138491.jpg"></a>
<a target="_blank" href="http://blog.51cto.com/attachment/201111/134150766.jpg"></a>
這一次,我們隻是僅僅探讨了一種可以在遊戲當中對于特效處理的應用方法,高手應該看到處理的效率,我這是純粹的暴力解決方案,可能還有更加巧妙的方式來達到我們期望的效果,但是以我的水準還未尋得好路子,要是有什麼好的方法或者算法,大家互相交流一下,下一次我們一起研究一些圖檔處理上的其他算法,仍然很!暴!力!
本文轉自nowpaper 51CTO部落格,原文連結:http://blog.51cto.com/nowpaper/712471