以前看到過別人寫的一些關於在
j2me
中使用畫素渲染的方法,不過都是理論論述,而且很多人都質疑
2.0中的
drawrgb
的效率,自己也有相同的想法,但是畫素渲染所帶來的巨大好處還是讓人動心的。所以這次下了決心,專門抽了時間來實現了一下,就是你在下面所看到的一些資料。
機型占用記憶體(1)
臨界渲染次數(1)
占用記憶體(2)
臨界渲染次數(2)
se k510
0.5x
120+
1.5x
800+
se k700
0.5x
120+ 2x
800+
nokia 7610
0.5x
150+ 2x
800+
moto v600
0.5x
<10 2x
<10
moto l7
0.5x
<10 2x
<10
moto e680
0.5x
400+ 2x
1000+
*占用記憶體是與同面積(長
*寬)的
image
物件所佔記憶體的比較,只是估值,僅供參考
*臨界次數以
10次為乙個步長累加,在乙個週期(
50ms
)內直到出現人為感覺的延遲的渲染次數,也是估值,僅供參考
這次的實驗物件採用了乙個
png分解成為乙個
120長度的
int型陣列的調色盤檔案(
plt),和寬
*高長度的
byte
型的陣列作為資料來源(
raw),這樣產生的資料檔案經過
zip壓縮與
png原始檔差不多大小(
1137/1159
),但是經過適當的加密運算,可以有較好的保護資源。
方法1
採用迴圈賦值的方法,把影象直接渲染到螢幕大小的
int型陣列裡。
方法2
採用arraycopy
的方法,有效的減少了迴圈的次數,但是因為
arraycopy
的關係,無法直接使用
byte
型的源資料,需要轉化為
int型的資料,所以增加了記憶體資源的占用。
結論和感想
1.drawrgb
絕對不是過程中的瓶頸所在,以前產生誤解的原因是因為和其他繪製方法的混用,總之還是繪製次數決定速度。
2.螢幕大小與渲染速度並沒有很顯著的關係,但是在實際應用中有一定的聯絡,螢幕越大需要渲染越多的。
3.渲染速度與機器的主頻或者說陣列操作的效能直接相關,在相同的頻率下,渲染次數與渲染面積大小的乘積是構成影響渲染速度的最重要因素。
4.moto
的非智慧型機(
v600/e398/l6/l7
)實在是太次了,至少在陣列操作的速度上實在是讓人汗顏,而且
arraycopy
的實現也非常的差勁,幾乎對效能沒有改善,在
60+就進入了假死狀態(執行緒死鎖)。
5.根據資料結合經驗來看(實際應用),方法一,在
nokia和se
的效能幾乎和常規的
drawimage
方法持平,但是記憶體資源的占用方面有很大的優勢。方法二,在
nokia
上,與乙個現有的專案比較,效能強於常規方法非常多。在
se上有一定的優勢,但是沒有太多的實際意義。
e680
也是相似的情況。
6.綜上所述,似乎畫素渲染的意義不是非常明顯,但是不要忘了我們嘗試畫素渲染的目的,對,就是更自由更多變(透明,旋轉,換色等特效),既然如此,那麼我們在
nokia和se
還有moto
的智慧型機上面達到了我們的目的。
7.最後,我們的方法還有改進的餘地,比如改進第二種方法。
最後的最後,
2段**,
test
是渲染方法1,
test2
是分離png
的方法。如果有人能提供更好的方法,或者對**進行優化的話感激不盡。
問題1:我使用畫素級的渲染只是看中這個方法帶來的一些好處,比如一張的
顏色漸變
,如果用
drawimage
肯定需要一打的漸變層次的。你如果是指把畫素用
creatrgbimage
再重組回
inmutable
的image
物件,我覺得多此一舉了。問題2
:當然不需要解壓縮,我指的是打成
jar以後,在包內的檔案大小和
png差不多。因為
png的
idat
也是經過壓縮的。如果你是用
setclip
或者drawregion
來實現的話,在要求很高的表現力的情況下幾乎會讓你崩潰的,重繪的次數是海量級的。
幾個問題:1)
為什麼test2
不直接使用
drawimage
,而要把
imagedata
讀到陣列裡呢?2)
「資料檔案經過
zip壓縮
」,那麼在
手機上是不是還需要解壓縮呢?這部分的
memory
和時間開銷是否合算呢?
個人認為
png是一種很簡單使用的格式,提供了
zlib
的壓縮模式(關鍵是手機上提供了
zlib
解壓縮),如果要做象素級的操作也很方便。而且手機**商,一般都會對
png的渲染做優化。
一家之言。
哦,完全沒看懂這個問題,自定義格式其實對減少大小也很有幫助的。但是壓縮的話,jar本身就是壓縮的,我也提到了。分離調色盤的原因主要還是要換調色盤容易一些。
J2ME中的分而治之
這兩天在研究j2me中setclip的用法.兩張切換時,如果是新的從內向外以矩形顯示,可以使用一次setclip設定繪製的矩形區域.但是,現在反回來,從外向內,以矩形框顯示,但是j2me裡面沒有這樣的方法,怎麼辦?有了,咱們給他來個分而治之,一次setclip不行,咱們可以分多次嘛.就現在的情況,可...
j2me中的Display介紹
好好看一下j2me 的api,其中裡面乙個很簡單的列子就是display類,常用的只有display.getdisplay midlet 和setcurrent 不過display的功能是十分的強大。display總結起來有兩個作用 1,獲取螢幕的屬性。色彩,支援的顏色數量資訊。iscolor 判斷...
J2ME 關於移動的主頁推送對J2ME程式的影響
中國移動於5月17日推出費用提示頁面,其實早在5月15日測試j2me程式的時候就發現已經有頁面推送了。5月15日早上照常測試我的j2me聯網程式發現在模擬器一切正常,但是到了真機上卻得不到正確的資料,後來發現是第一次鏈結得到的資料流正是移動推送的頁面資料。經過試驗,其實得到第乙個頁面不用管它,繼續重...