<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

    3G 手機開發網

       :: 首頁 :: 聯系 :: 聚合  :: 管理
      99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
    原文 http://www.3geye.net/?3/viewspace-3215
    out momory 一陣天旋地轉內存又溢出了。在手機上這種痛苦經常都有,套一句俗話在手機上用內存必須勒緊褲腰帶。雖然現在pc內存上G都不奇怪,可是在手機上卻只能以K 來記,可能某位同志會馬上跳出來說也有上M的,記住中國還不富大多數手機都是低端手機。寫手機程序讓我仿佛回到了dos時代(自我安慰一下那個時代也煉出 了不少高手說不定我是下一個)。言歸正傳做內存優化可以歸結為以下幾種方法。代碼優化,圖片優化,第三方工具優化等…
    3^N9R fBLC?i%Wpe)h3一.代碼優化
    D/MX)T5J3內存會溢出肯定和代碼逃不了關系,99.99%學java的人都知道垃圾回收器是java的一大優點并據此來嘲笑C++。顯然這個特性為代碼編寫者省了不 少事,但這個特性卻帶來了不少隱患。舉個例子在游戲當中經常有不同場景的切換,如從游戲邏輯退到主菜單邏輯,對游戲邏輯對象的態度很多人會選擇忘記等待垃 圾回收器來收尸^_^。乍看之下似乎并無不妥垃圾回收器會來善后。實際上垃圾回收器并非實時的,它不像C++的Delete語句馬上釋放不用的內存。當從 游戲邏輯切換到主菜單邏輯這時兩個對象同時存在很可能這時內存就不夠用了。讀到這里很多人會發現實際上垃圾回收器在j2me上并不怎么好用,從一個角度上來講在j2me上 所有垃圾必須由手工釋放,除簡單類型以外所有對象都必須顯式地置空例如 imgs=null;  實際上java提供了一個不錯的工具用來查找內存溢出,java.lang.Runtime.freeMemory() 。它可以返回當前的剩余內存數,將它適當的安放在代碼中可以有效的監測內存使用狀況。很大一部份的j2me程序員之前都是從事pc軟件開發工作,充裕的內存掩蓋了許多寫代碼的不良習慣。如下所示:
    0Lh}Ck\OW)w7k7Ae3     //a 不為空3GEYE.|?@:R1cc*|xo
         a=new Logic();
    *f2WZ3hKxx3很多人可能對此有異議,他們會認為新的對象會把舊的對象沖掉并且釋放內存。這里面包含兩個問題:1. 該段代碼是先創建對象然后再進行賦值操作的,也就是說在這期間有兩個對象同時存在這就很可能會產生溢出。2. 這樣做也會妨礙垃圾回收器的工作3GEYE.f_I(Xd
    較好的寫法如下:
    ;N Y.|;aL!h F#f3            a=null;
    K0JX*^%\0nRlg3            a=new Logic();3GEYEq0fbp.B4_ ON%u
    雖然麻煩了點但在j2me中還是必要的。接著看下例。
    eA&gdL~Z3  drawString("游戲時間:" + time ,50,50,Graphics.LEFT|Graphics.TOP);3GEYEa dhO'Z?
    "游戲時間:" + time  很完美在paint()方法當中每次都被刷一遍顯示在屏幕上。危機往往隱藏在美麗的外表,該語句會引起新的內存重新分配來存儲 "游戲時間:" + time   而顯示完以后又必須由垃圾回收器釋放,用了雙倍時間,并且容易發生內存溢出。依此類推在重復執行的方法里應盡量避免重復定義對象。與paint()方法 類似在循環里也有類似的情況存在。
    'Pc_\5\X3把所有對象的初始化放在構造函數里想必是再正當不過了,大多數人通常的做法是把當前邏輯所要用到的資源通通初始化完畢。3GEYEV J^/_&?5L2~5B
    很大一部份的內存溢出都是發生在構造函數中。內存使用的高峰期都是在構造函數中所以避開這個高峰能有效的防止溢出。建議最好的辦法是第一次使用時初始化。如下所示3GEYE+i1Bk;NK^(p;o
        if (img==null){
    #wg'\1gs5I3        //初始化3GEYE0\O6wQ V$rY5I
        }
    7l4~0\7bUf3現在做游戲很多時候都需要地圖數組,聲音數組,還有一些其它資源這些資源很多可以放在代碼中也有的可以放在文件當中。
    )An0uK!R.Q/Ce$\3強烈建議將這些資源放在文件中需要時在load進來。這些資源文件如果放在代碼中則會占用不小的代碼段空間,而代碼一般是程序一運行就裝載到內存當中。
    )Olj6Q)Y'@7vD*E!I(k3除上面列舉的方法外還有一些大家所熟知的順便一提, 比如關閉沒用的rms ,關閉沒用的網絡連接,關閉沒用的流。正確地停止線程。良好的程序架構減少代碼偶合性也是一個不錯的方法,無論在代碼調式,內存釋放都可以做到非常清析。3GEYEWp%_ n m Rx
    二. 圖片優化3GEYE9u4aL)|D ]/W
    j2me的內存殺手無疑非圖片莫屬,一張3k的圖片可以占用20多k的內存不信大家把load前后的內存剩余打印出來對比看看。所以防止內存溢出最直接的辦法就是從圖片入手。
    -W-O8FIApm31.圖片壓縮: 多數人馬上會想到這個辦法。不錯這個辦法是最有效的。在photoshop里圖片制作完成后不要選擇 "存儲為",而是選擇 "存儲為 web 所用格式"  可以根據里面的選項進行壓縮,特別是顏色這一項越小越好不過相應的圖像會有所失真。不要認為這樣就完了。3GEYE ~P@pw,^
    實際上該圖片還可以再次壓縮,在網上有許多類似的工具。推薦一款可以壓縮png格式的軟件 xat.com Image Optimizer 效果不錯。經常都有 70% 的壓縮率且圖像不會失真。
    x2Vz\D L)Y8^-r W@8q3     假如你有多張規格一樣的圖片,那么建議你把它做成一張長條圖片。有兩個原因:
    :bw-N ?1H[r ]31、 這樣節省存儲空間和內存空間。大家可做個試驗將10張圖片的內容放在一張當中對比看看文件大小有沒有變化。3GEYE.~ b7C~ c ]9R-V Lf
    2 、10張圖片需要10個image 對象需要進行10次io操作浪費時間不說還浪費內存。當筆者發現這個好處時興奮地把所有圖片都存成一張,吱地一聲內存又溢出了...原因想必大家也知道!!圖片太大了不要把不同界面的圖片整合在一起否則經常會得不償失。3GEYE"YGAg1r$L
    作圖時還有一些細節需要注意,顏色數量,分辯率,圖像模式(最好是索引顏色),畫布大小都會影響到圖片大小。3GEYE C%}~?\`,N"bQ
    三. 工具優化3GEYE0{.^:w|.ZhD n}
    誰都知道混淆器是用來保護代碼的以加大反編譯的難度(個人認為這是在嘲笑程序員的智商)。實際上用它來優化程序也是不錯的選擇,至少有兩點好處:1、 壓縮程序大小。一個60k的程序經常可以壓掉10k左右。10k的空間對于寫低端手機的程序員簡直是雪中送碳,多少超過64k限制的游戲都受過它的恩惠; 2、節省內存空間。用腳去想也想得出來代碼少了內存里的代碼段自然就短了。
    1Uz#ioJ:r3根據經驗很多人都會用jb自帶的混淆器RetroGuard,實際上它效果并不怎么好。推薦使用proguard 在http://sf.net可以免費下載,它可以比retroguard 多壓縮3至4 k 以上而且安全性更好。3GEYEGR!MC[I

    $wY:h hF|3四。補充說明3GEYEV'G?)h E#f?e
    對于可以從網絡下載的資源,盡量通過網絡下載數據,這樣也可以減少jar的大小。3GEYE(ao&h [#r
    對于大量運算需要保持很多數據的結果,最后通過RMS作為緩沖來實現,比如你保存一些計算結果到rms中,特別是一些字符串的操作,有些數據可能有幾十k,你保存到rms中,就相當于節省了幾十k的數據了。
    6_e%\;f8v'^0pn j33GEYE?_ _a}B G:BV
    對于用字符串來保存狀態的,可以用byte來保存那就更好了。3GEYE-Hx,M Q,~BfP+Y
    避免采用大對象。比如加載超過過幾十k,甚至是上百k的字符串,或者是圖片
    I&TKd9r3for(int i=0 ;i<100000;i++){3GEYEtG5_'Gom1P
       s += "sdfdsf";
    NdV7o1Cf'jpf3}3GEYE#W%_5Y.eW
    這樣很容易出現問題。3GEYEdi;wW4`-~5Z"y3p!Z
    因為s是一塊連續的內存空間,搞不好就內存溢出了。
    &UA3WT%C{3


    爬蟲工作室 -- 專業的手機軟件開發工作室
    3G視線 -- 專注手機軟件開發
    posted on 2008-04-01 09:32 3G工作室 閱讀(1571) 評論(1)  編輯  收藏

    Feedback

    # re: J2ME內存優化 【轉】+ 補充[未登錄] 2008-04-01 22:04 海邊沫沫
    不錯  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产成人免费高清在线观看 | 亚洲精品永久在线观看| 色欲色香天天天综合网站免费| 狠狠综合久久综合88亚洲| 免费一级毛片在线播放放视频| 国产成人精品123区免费视频| 色偷偷亚洲男人天堂| 国产免费直播在线观看视频| 亚洲精品久久无码| 国产一级淫片视频免费看| 深夜A级毛片视频免费| 亚洲精品国产自在久久 | 爱爱帝国亚洲一区二区三区| 又粗又大又长又爽免费视频| 一边摸一边爽一边叫床免费视频| 国产亚洲大尺度无码无码专线 | 亚洲成色WWW久久网站| 四虎影视在线影院在线观看免费视频 | 国内免费高清在线观看| 亚洲欧美乱色情图片| 亚洲成A人片在线观看中文| GOGOGO免费观看国语| 99亚洲精品高清一二区| 欧洲精品成人免费视频在线观看| 精品韩国亚洲av无码不卡区| 中文字幕亚洲一区| 国产精品怡红院永久免费| 亚洲av无码专区国产不乱码| 国产啪亚洲国产精品无码| 久久免费观看国产精品| 亚洲欧洲日本在线观看| 久久久久久久亚洲精品| 午夜视频免费在线观看| 亚洲中文字幕久久久一区| av在线亚洲欧洲日产一区二区| 久久一本岛在免费线观看2020| 亚洲人成无码网站在线观看| 国内精品久久久久久久亚洲 | 日本免费一区尤物| a在线观看免费网址大全| 亚洲第一男人天堂|