国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

J2ME應(yīng)用程序內(nèi)存優(yōu)化三招

2019-11-17 06:21:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  out momory 一陣天旋地轉(zhuǎn)內(nèi)存又溢出了。在手機(jī)上這種痛苦經(jīng)常都有,套一句俗話在手機(jī)上用內(nèi)存必須勒緊褲腰帶。雖然現(xiàn)在pc內(nèi)存上G都不希奇,可是在手機(jī)上卻只能以K來(lái)記,可能某位同志會(huì)馬上跳出來(lái)說(shuō)也有上M的,記住中國(guó)還不富大多數(shù)手機(jī)都是低端手機(jī)。
寫(xiě)手機(jī)程序讓我仿佛回到了dos時(shí)代(自我安慰一下那個(gè)時(shí)代也煉出了不少高手說(shuō)不定我是下一個(gè))。言歸正傳做內(nèi)存優(yōu)化可以歸結(jié)為以下幾種方法。代碼優(yōu)化,圖片優(yōu)化,第三方工具優(yōu)化等…

  一.代碼優(yōu)化

  內(nèi)存會(huì)溢出肯定和代碼逃不了關(guān)系,99.99%學(xué)java的人都知道垃圾回收器是java的一大優(yōu)點(diǎn)并據(jù)此來(lái)嘲笑C++。顯然這個(gè)特性為代碼編寫(xiě)者省了不少事,但這個(gè)特性卻帶來(lái)了不少隱患。舉個(gè)例子在游戲當(dāng)中經(jīng)常有不同場(chǎng)景的切換,如從游戲邏輯退到主菜單邏輯,對(duì)游戲邏輯對(duì)象的態(tài)度很多人會(huì)選擇忘記等待垃圾回收器來(lái)收尸。乍看之下似乎并無(wú)不妥垃圾回收器會(huì)來(lái)善后。實(shí)際上垃圾回收器并非實(shí)時(shí)的,它不像C++的Delete語(yǔ)句馬上釋放不用的內(nèi)存。當(dāng)從游戲邏輯切換到主菜單邏輯這時(shí)兩個(gè)對(duì)象同時(shí)存在很可能這時(shí)內(nèi)存就不夠用了。讀到這里很多人會(huì)發(fā)現(xiàn)實(shí)際上垃圾回收器在j2me上并不怎么好用,從一個(gè)角度上來(lái)講在j2me上所有垃圾必須由手工釋放,除簡(jiǎn)單類型以外所有對(duì)象都必須顯式地置空例如 imgs=null; 實(shí)際上java提供了一個(gè)不錯(cuò)的工具用來(lái)查找內(nèi)存溢出,java.lang.Runtime.freeMemory() 。它可以返回當(dāng)前的剩余內(nèi)存數(shù),將它適當(dāng)?shù)陌卜旁诖a中可以有效的監(jiān)測(cè)內(nèi)存使用狀況。很大一部份的j2me程序員之前都是從事pc軟件開(kāi)發(fā)工作,充裕的內(nèi)存掩蓋了許多寫(xiě)代碼的不良習(xí)慣。如下所示:

  //a 不為空

  a=new Logic();

  很多人可能對(duì)此有異議,他們會(huì)認(rèn)為新的對(duì)象會(huì)把舊的對(duì)象沖掉并且釋放內(nèi)存。這里面包含兩個(gè)問(wèn)題:1. 該段代碼是先創(chuàng)建對(duì)象然后再進(jìn)行賦值操作的,也就是說(shuō)在這期間有兩個(gè)對(duì)象同時(shí)存在這就很可能會(huì)產(chǎn)生溢出。2. 這樣做也會(huì)妨礙垃圾回收器的工作

  較好的寫(xiě)法如下:

  a=null;

  a=new Logic();

  雖然麻煩了點(diǎn)但在j2me中還是必要的。接著看下例。

  drawString("游戲時(shí)間:" + time ,50,50,Graphics.LEFTGraphics.TOP);

  "游戲時(shí)間:" + time 很完美在paint()方法當(dāng)中每次都被刷一遍顯示在屏幕上。危機(jī)往往隱藏在漂亮的外表,該語(yǔ)句會(huì)引起新的內(nèi)存重新分配來(lái)存儲(chǔ) "游戲時(shí)間:" + time 而顯示完以后又必須由垃圾回收器釋放,用了雙倍時(shí)間,并且輕易發(fā)生內(nèi)存溢出。依此類推在重復(fù)執(zhí)行的方法里應(yīng)盡量避免重復(fù)定義對(duì)象。與paint()方法類似在循環(huán)里也有類似的情況存在。

  把所有對(duì)象的初始化放在構(gòu)造函數(shù)里想必是再正當(dāng)不過(guò)了,大多數(shù)人通常的做法是把當(dāng)前邏輯所要用到的資源通通初始化完畢。

  很大一部份的內(nèi)存溢出都是發(fā)生在構(gòu)造函數(shù)中。內(nèi)存使用的高峰期都是在構(gòu)造函數(shù)中所以避開(kāi)這個(gè)高峰能有效的防止溢出。建議最好的辦法是第一次使用時(shí)初始化。如下所示

  if (img==null){
    //初始化
  }

  現(xiàn)在做游戲很多時(shí)候都需要地圖數(shù)組,聲音數(shù)組,還有一些其它資源這些資源很多可以放在代碼中也有的可以放在文件當(dāng)中。

  強(qiáng)烈建議將這些資源放在文件中需要時(shí)在load進(jìn)來(lái)。這些資源文件假如放在代碼中則會(huì)占用不小的代碼段空間,而代碼一般是程序一運(yùn)行就裝載到內(nèi)存當(dāng)中。

  除上面列舉的方法外還有一些大家所熟知的順便一提, 比如關(guān)閉沒(méi)用的rms ,關(guān)閉沒(méi)用的網(wǎng)絡(luò)連接,關(guān)閉沒(méi)用的流。正確地停止線程。良好的程序架構(gòu)減少代碼偶合性也是一個(gè)不錯(cuò)的方法,無(wú)論在代碼調(diào)式,內(nèi)存釋放都可以做到非常清析。

  二.圖片優(yōu)化

  j2me的內(nèi)存殺手無(wú)疑非圖片莫屬,一張3k的圖片可以占用20多k的內(nèi)存不信大家把load前后的內(nèi)存剩余打印出來(lái)對(duì)比看看。所以防止內(nèi)存溢出最直接的辦法就是從圖片入手。

  1.圖片壓縮: 多數(shù)人馬上會(huì)想到這個(gè)辦法。不錯(cuò)這個(gè)辦法是最有效的。在photoshop里圖片制作完成后不要選擇 "存儲(chǔ)為",而是選擇 "存儲(chǔ)為 web 所用格式" 可以根據(jù)里面的選項(xiàng)進(jìn)行壓縮,非凡是顏色這一項(xiàng)越小越好不過(guò)相應(yīng)的圖像會(huì)有所失真。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 灵寿县| 大厂| 沂南县| 黄山市| 无棣县| 什邡市| 玉树县| 揭阳市| 凤城市| 定安县| 鸡泽县| 宁化县| 德昌县| 无极县| 三原县| 民权县| 九江县| 来安县| 镇坪县| 盐边县| 云霄县| 万全县| 临洮县| 绩溪县| 米脂县| 犍为县| 枣强县| 阜新市| 鄂伦春自治旗| 大庆市| 奉节县| 和田市| 上虞市| 阜阳市| 山阴县| 阿图什市| 晋中市| 长宁区| 汨罗市| 横峰县| 新野县|