一般是常用的尺寸都做好需要的對應(yīng)的素材,常見的一些屏幕尺寸128x160,176x220,240x320,還有WVGA(320*480),HVGA(480*800),最后還得準(zhǔn)備一個(gè)通用版的,或者一個(gè)比較小的版本,如果碰到不能判斷和適合的版本,就只能盡量用小屏幕的版本。反正手機(jī)開發(fā),一般都是分好多版本,畢竟手機(jī)的各種配置太多樣化了 下面記載的都是手機(jī)java實(shí)現(xiàn)中各種奇怪的毛病,bug,或者……特性,是根據(jù)某項(xiàng)目的開發(fā)經(jīng)驗(yàn)總結(jié)出來的。但是涵蓋的手機(jī)型號還是有限。因此很有可能某些“特性”會存在于更多的采用了相同JVM(比如平臺相同、生產(chǎn)廠商)的手機(jī)上。 == 早期S60的內(nèi)存泄漏 == 這個(gè)bug可以上溯至2003年,甚至更早。表現(xiàn)為java應(yīng)用中如果使用了Class.getResourceAsStream("本地文件")無法釋放其占用的內(nèi)存,是的,沒有任何辦法,無論是調(diào)用獲得的的InputStream實(shí)例的close()或?qū)⑵湓O(shè)為null,甚至顯式強(qiáng)制System.gc(),都沒有效果。結(jié)果就是至少和本地文件同尺寸的內(nèi)存成為了無法回收的垃圾。這個(gè)問題還影響到以Class.getResourceAsStream()為基礎(chǔ)的Image.createImage()(這個(gè)是最要命的,如何能夠不使用圖片資源呢?。?br>這個(gè)bug據(jù)說在新的S60上已經(jīng)解決了。但是Nokia3230(4.0526.2ch)、Nokia7610(6.0525.0ch)都存在這個(gè)問題。對于這些個(gè)有問題的機(jī)型,在java程序中是無法完美解決這個(gè)問題的,只能盡量避免。比如集中、統(tǒng)一載入資源,永不釋放(也就是說,盡量控制泄漏的次數(shù))。當(dāng)然,這會對已有代碼造成很大影響。畢竟手機(jī)java應(yīng)用是內(nèi)存受限系統(tǒng)的典型,大多數(shù)情況下,珍貴的內(nèi)存中只保留需要的資源。
== 鍵盤響應(yīng)事件 == 在MIDP1中,獲取鍵盤事件只能自己實(shí)現(xiàn)Canvas.keyPressed()。但是MotorolaE398和SonyEricssonK700c的實(shí)現(xiàn)卻很奇怪。表現(xiàn)為左右軟鍵有可能在這個(gè)方法中捕獲不到。而是否能夠成功捕獲,取決于keyPressed()方法中代碼的行數(shù)…… 我承認(rèn)我沒徹底搞清楚這其中的玄機(jī)。鬼知道Motorola和SonyEricsson是怎么實(shí)現(xiàn)的JVM。我只知道把keyPressed中的所有代碼提取到另外一個(gè)函數(shù)中,在keyPressed只把參數(shù)傳遞給新函數(shù),問題就消失了……
== 超慢的drawRegion == 除了N-Gage QD,幾乎所有的NokiaS60手機(jī)都實(shí)現(xiàn)了MIDP2的支持。MIDP2中,最為重要的幾個(gè)特性之一就是Graphics.drawRegion。這個(gè)API可以方便的將圖片旋轉(zhuǎn)、剪切之后畫到畫布上。 但是,這個(gè)API在Nokia3230、Nokia7610等手機(jī)上的實(shí)際性能表現(xiàn)讓人實(shí)在不敢恭維。于是,這個(gè)最重要的API成了擺設(shè)… …沒什么怎么辦,只能急需延用MIDP1的做法,自己實(shí)現(xiàn)剪切和旋轉(zhuǎn),或者像我一樣懶,直接要求美工把旋轉(zhuǎn)之后的圖片全都做出來……
== 詭異的內(nèi)存容量==
按照官方Spec,Java在Nokia3125上的可用內(nèi)存(即Java Heap Size)為512k。但是實(shí)際測試的結(jié)果是,Nokia3125只有412k左右的實(shí)際內(nèi)存,相差整整100k。不過好在Nokia3125并不是種市場保有量很高的型號。但是它是我正在使用的型號……
== 無法repaint == 這個(gè)問題只存在于SonyEricssonK700c。表現(xiàn)為在keyPressed()中調(diào)用repaint()進(jìn)行屏幕重畫沒有任何反應(yīng)。 解決辦法是,在keyReleased()中補(bǔ)一個(gè)repaint()……
== UTF8 == 還是SonyEricssonK700c的問題。問題存在于new String(byte[], charset)上。也就是說,當(dāng)獲得了某個(gè)byte[],并希望用UTF8作為字符集將其轉(zhuǎn)換為字符串的時(shí)候,使用上述方法在SonyEricssonK700c上會出現(xiàn)丟失字符的現(xiàn)象。這個(gè)現(xiàn)象很詭異,以至于我目前沒有搞清楚什么情況下會丟失字符(我甚至專門寫了個(gè)測試程序在真機(jī)上跑,得出的結(jié)論是丟失字符的原因可能會很復(fù)雜,簡單的拿被丟掉字符附近的一個(gè)子串來測沒有任何問題)。 幸虧還是有解決辦法的。不用new String就完了,而要用更加麻煩的辦法,比如像我一樣,用ByteArrayInputStream,外面套InputStreamReader(bais, "UTF8"),然后用StringBuffer一個(gè)一個(gè)char讀進(jìn)來,最后再toString()……
== 不可靠的copyArea ==
這是Motorola機(jī)器上的問題,V3和E398都有。copyArea是Graphics的作整塊屏幕像素copy的常用API(2D動態(tài)背景的游戲幾乎是必不可少)。按照Sun官方的Spec,手機(jī)廠商有義務(wù)來保證其API實(shí)現(xiàn)不存在覆蓋沖突問題。但是Motorola顯然做得不夠好。在Motorola手機(jī)上使用這個(gè)API會隨機(jī)產(chǎn)生貼圖混亂的情況…… 解決辦法是自己實(shí)現(xiàn)另外一套機(jī)制。比如使用另外一張至少和屏幕同樣大小的Image作為緩沖,用兩次drawImage來替代copyArea……不過這個(gè)方法顯而易見的缺點(diǎn)是消耗了更多的內(nèi)存(那可是不小于屏幕尺寸的Image啊?。H绻麅?nèi)存實(shí)在吃緊,只能退而再求其次,作為緩沖的Image繼續(xù)縮水,drawImage的次數(shù)繼續(xù)增加……不過這個(gè)時(shí)候需要自己手工解決覆蓋沖突……
== 無法安靜下來的3220 == 不知道這個(gè)問題是不是在S40平臺上都有,手里S40又支持MIDI的手機(jī)實(shí)在是太少了…… 3220的一個(gè)很明顯的特征就是聲音大。以至調(diào)用了VolumeControl.setLevel(0)之后還是有聲音,和Sun官方的Spec完全不符……沒辦法,只能在需要靜音的時(shí)候,再補(bǔ)一個(gè)VolumeControl.setMute(true)。
== 永不ready == 這是一段手機(jī)java獲取網(wǎng)絡(luò)數(shù)據(jù)的常用代碼:while(InputStream.ready()) { InputStream.read() }。 但是經(jīng)測試,在Nokia3230上,這個(gè)ready永遠(yuǎn)返回false……沒辦法,如果不改上述代碼的話,就自己實(shí)現(xiàn)一個(gè)繼承類吧
。
補(bǔ)充: nokia
1. 老40的class限制大概在105k左右(所有的class加起來,混吆后,未壓縮的大小),超出一點(diǎn),連構(gòu)造子也進(jìn)不去了,就是說,classloading的時(shí)候就out of memory了
2. 6230i, 很奇怪的208x208屏幕,40系統(tǒng),聲音播放與40兼容, 不能servicerepaints, 否則聲音播放有問題
3. 7370 ,command不在左右邊而在中間, 聲音的inputstream關(guān)閉后聲音放不放出來,不能servicerepaints, 否則聲音播放卡住
4. 60進(jìn)入后立即退出, 用midp1.0重新編譯試試, 60, fullcanvas如果從沒有setclip,有一定的幾率屏幕下方放不出
5.6680:問題:運(yùn)行速度極慢 解決方法:重啟. 此機(jī)使用final變量(方法內(nèi)部定義的)會有莫名其妙的問題,變量不是定義時(shí)的數(shù)值。問題:打進(jìn)入電話后不pauseApp,游戲音樂不停,沒有電話鈴聲,解決方法:用hidennotify,在其中釋放聲音
6. j2me 反復(fù)調(diào)用Graphics方法是導(dǎo)致nokia40運(yùn)行緩慢的主要原因, 這一點(diǎn)在橫軸卷頻游戲中尤其明顯,相比之下,servicerepaints和gc兩個(gè)方法并不緩慢 解決方法,建立一個(gè)image,將背景畫在其上,每次卷軸都保留需要的部分,更新需更新的部分,然后數(shù)次繪制此image拼成背景,能有效提高性能
7.如何對抗nokia 3650 存儲已滿 一次性io操作 createimage , getresourceasstream 一次性做完扔在內(nèi)存里,3650 io 會內(nèi)存泄漏 image.getgraphics() 此操作每次創(chuàng)建新graphics, image不gc掉graphics也不會gc掉,每個(gè)image只.getgraphics一次 3650,7650,QD如果有這樣問題同上處理
8. nokia s40(新)在paint所在線程放聲音鎖死,不知為什么,不是所有游戲都會發(fā)生,但是如果發(fā)生了,那就必然而不是隨機(jī)發(fā)生。
9 新40對midi的兼容性不是很好,如果聲音放不出需音效修改
10 qd游戲切出去后不能從百寶箱里選擇進(jìn)入,但可以長按菜單鍵切回. 在paint之間sleep即可在百寶箱里切回seimens
1. SX 問題:mmapi放聲音老是device unavailible,解決方法:換成nokia sound(wav)
2. SX 程序第一次執(zhí)行沒有問題,退出后再進(jìn)直接nullpointer except ,去掉所有static后ok
三菱
1.m750 循環(huán)前后需要加同步與限幀才能打進(jìn)電話
阿爾卡特
1.ot556 getGraphics 極其慢, rms沒有作用.
NEC
1.nec 820也是個(gè)需要手動gc的主, 日韓手機(jī)之通病-_-!
2. nec 820 class Media; getAudioClip太多次有可能導(dǎo)致audioclip放了一點(diǎn)點(diǎn)聲音就斷掉.也有可能不發(fā)生這個(gè)事情. 解決方法: 一次建立所有的audioclip
3. nec 820 class audioClip; 設(shè)置的loopcount在stop以后失效 解決方法: 重新設(shè)置loopcount會出exception,用audiolistener
4.nec830可能認(rèn)不出一些mid文件,讓音效修改之
samsung 1.d508 drawline有問題,drawrect據(jù)說也有問題,fill rect好的command 底下那一塊繪制有毛病,一會紅一會黑的,在那繪制有莫名奇妙的問題
moto
1. E2, 只能同時(shí)打開4個(gè)player, 持續(xù)關(guān)閉和創(chuàng)建player,在半小時(shí)到一小時(shí)后會莫名其妙退出. 播放聲音在一開始會卡一下, 聲音超級難聽,還號稱音樂手機(jī),垃圾
2. L6, 14x的icon
索愛
1.t628 系統(tǒng)資源不足,要求我刪文件,刪無可刪
2, k300,k500系列整圖卷屏?xí)r, 當(dāng)整圖畫在左上角時(shí)有可能位置比實(shí)際坐標(biāo)偏左了一點(diǎn), 看上去背景向左邊閃了一下,如果出現(xiàn)這個(gè)問題可以將整圖向左邊沒有空隙地貼牢
imode (9xx)
1.應(yīng)該總是getcolorbyrgb,不要想當(dāng)然的用0xff1234之類,可能異?;蛘邿o顏色
2.載入240*240更大的圖會出現(xiàn)圖片問題
3.有時(shí)侯大圖片莫名其妙顯示不了
4.imode手機(jī)游戲必定涉及網(wǎng)絡(luò),必須正確處理網(wǎng)絡(luò)不可用的情況
5.usenetwork的值是http
6.usebrowser的值是launch,如果你需要打開瀏覽器的話
7.在http通信時(shí)按通話鍵會切斷這個(gè)http連接
8.播放聲音時(shí)必須捕作異常,并在捕獲后重做前一步, 盡管它并不規(guī)定必須處理此異常
vodafone sharp
1.讀取寫入rms慢. 不要在需要高速繪制時(shí)做
|