J2ME游戲中的圖片處理
圖片資源乃是游戲的外衣,直接影響一個(gè)游戲是否看上去很美。在J2ME游戲開(kāi)發(fā)中,由于受到容量和內(nèi)存的兩重限制,圖片使用受到極大的限制。在這種環(huán)境中,處理好圖片的使用問(wèn)題就顯得更加重要。
本文從容量和內(nèi)存兩個(gè)方面談?wù)凧2ME游戲圖片處理的基本方法。
一 減少圖片容量
方法1:將多張png圖片集成到一張圖片上。
這是最基本也是最有效的減少png圖片容量的辦法了。比如你有10張png圖片,每張10×15,現(xiàn)在你可以把它集成到一張100×15或者10×150或者X×X的圖片上去。這張大png圖片的容量比10張png圖片的總?cè)萘啃『芏唷_@是因?yàn)槭∪チ?張圖片的文件頭,文件結(jié)束數(shù)據(jù)塊等等,而且合并了調(diào)色板(如果10張圖片的調(diào)色板恰好相同,則省去了9張圖片的調(diào)色板所占的容量!這是個(gè)不小的數(shù)字)
方法2:減少圖片的顏色數(shù)
減少顏色也算是一個(gè)方法?我想說(shuō)的是什么時(shí)候減,誰(shuí)去減。如果游戲完成后發(fā)現(xiàn)容量超出,此時(shí)在用優(yōu)化工具減少顏色,雖然能降低圖片容量,但圖片效果可能就不讓你滿意了。所以,在美工作圖時(shí)就要確定使用的顏色數(shù),手機(jī)游戲使用的是象素圖,即一個(gè)象素一個(gè)象素點(diǎn)出來(lái)的圖像,所以預(yù)先規(guī)定調(diào)色板顏色數(shù)量是可以辦到的。不過(guò),最終使用優(yōu)化工具也是有用的,有時(shí)候相差一兩種顏色,但效果差別并不大,容量卻可以變小一些。呵呵,減少顏色確實(shí)可以算是一種方法。
方法3:盡可能使用旋轉(zhuǎn)和翻轉(zhuǎn)
這點(diǎn)不用解釋了
方法4:使用換調(diào)色板技術(shù)和自定義圖片格式
如果前兩種方法還不能滿足你對(duì)容量的要求,而你的游戲中恰好使用了很多僅顏色不同的怪物,那么可以試試換調(diào)色板技術(shù)。J2ME規(guī)范中規(guī)定手機(jī)至少可以支持png格式的圖片,每張png都帶有調(diào)色板數(shù)據(jù),如果兩張圖片除了顏色不同而其他(包括顏色數(shù))完全相同,則只要保存一張圖片和其他圖片的調(diào)色板,這相對(duì)于保存多張圖片來(lái)說(shuō)節(jié)省了不少容量。不過(guò)這個(gè)方法挺麻煩,你得了解png文件格式,然后做一個(gè)工具提取出調(diào)色板數(shù)據(jù)和調(diào)色板數(shù)據(jù)塊在png文件中的偏移。內(nèi)存中保存圖像仍使用Image,如果要換調(diào)色板,則將png文件讀入到一個(gè)字節(jié)數(shù)組中,根據(jù)調(diào)色板數(shù)據(jù)塊在png中的偏移,用新的調(diào)色板代替原來(lái)的調(diào)色板數(shù)據(jù),然后用這個(gè)字節(jié)數(shù)組創(chuàng)建出換色后的Image。也許你覺(jué)得保存一張png和n份調(diào)色板數(shù)據(jù)的方法有點(diǎn)浪費(fèi)。至少多保存了1份調(diào)色板數(shù)據(jù)啊!如果直接將圖像數(shù)據(jù)提取出來(lái),在加上n份調(diào)色板數(shù)據(jù),豈不是更節(jié)省容量。但是使用上面的方法,我們還可以用drawImage渲染。如果這樣自定義了圖片格式,那只有自己寫(xiě)個(gè)渲染函數(shù)了,這倒還可以,只不過(guò)put pixel的速度在某些機(jī)器上非常慢。或者自己構(gòu)造png格式數(shù)據(jù),再使用Image.如果你真得決定這么做,我還有個(gè)小建議,不要對(duì)圖像數(shù)據(jù)進(jìn)行壓縮,zip壓縮大多數(shù)時(shí)候比你寫(xiě)得壓縮算法好(參見(jiàn)J2ME Game開(kāi)發(fā)筆記-壓縮還是不壓縮)。論壇上有位朋友提過(guò)使用bmp格式代替png格式,jar中圖片容量更小,也是一個(gè)道理。
二 減少圖片所占內(nèi)存
1 圖片所占內(nèi)存的計(jì)算
png圖片所占用的內(nèi)存并不對(duì)應(yīng)于圖片容量。圖片占用的內(nèi)存的計(jì)算為:width*height*bpp。bpp即為系統(tǒng)內(nèi)置的顏色位數(shù)。以Nokia 6600為例,象素格式為565共16位。所以一張100*100的圖片占用100*100*(16/8)=20000字節(jié),約為19.5k的內(nèi)存。象素格式是固定的無(wú)法改變,所以只有減少圖片的寬和高才能降低其消耗的內(nèi)存。
2 減少I(mǎi)mage對(duì)象數(shù)量可節(jié)約大量?jī)?nèi)存
減少I(mǎi)mage對(duì)象數(shù)量不等于減少圖片數(shù)量。我的意思是說(shuō),將一張集成圖保存在一個(gè)Image對(duì)象中,通過(guò)setClip的方法從這個(gè)Iamge對(duì)象中選取你需要的圖像渲染。不過(guò)這個(gè)方法犧牲了一點(diǎn)速度,每幀都從集成圖Image中減切圖像的速度比無(wú)減切的渲染慢。但對(duì)于數(shù)目不多的渲染,比如精靈,使用這個(gè)方法沒(méi)問(wèn)題。這個(gè)方法還有一個(gè)問(wèn)題就是不能釋放集成圖中不需要的圖片,這就要看你集成的程度了。從圖片容量和內(nèi)存管理的角度綜合考慮,我一般使用二次集成的方法。比如有n個(gè)精靈,先將各精靈所有的圖片集成到一張集成圖中,得到n張集成圖,然后將這n張集成圖再次集成到一張更大的集成圖中。這樣在jar中只存在一張集成圖。使用時(shí),先將大集成圖分割載入到n個(gè)Image對(duì)象中即可。這樣各個(gè)精靈的圖片可以單獨(dú)管理了。
3 使用旋轉(zhuǎn)和翻轉(zhuǎn)
只保存一個(gè)原始的Image,需要時(shí)再旋轉(zhuǎn)或翻轉(zhuǎn)
只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||
相關(guān)文章:
|
||