Username: Password:

J2ME应用程式内存优化三招
来源:作者: 发布时间:2008-05-07 07:38:39

  out momory 一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有,套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不奇怪,可是在手机上却只能以K来记,可能某位同志会马上跳出来说也有上M的,记住中国还不富大多数手机都是低端手机。写手机程式让我仿佛回到了dos时代(自我安慰一下那个时代也炼出了不少高手说不定我是下一个)。言归正传做内存优化能够归结为以下几种方法。代码优化,图片优化,第三方工具优化等…

  一.代码优化

  内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大长处并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的转换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实时的,他不像C++的Delete语句马上释放不用的内存。当从游戏逻辑转换到主菜单逻辑这时两个对象同时存在很可能这时内存就不够用了。读到这里很多人会发现实际上垃圾回收器在j2me上并不怎么好用,从一个角度上来讲在j2me上任何垃圾必须由手工释放,除简单类型以外任何对象都必须显式地置空例如 imgs=null; 实际上java提供了一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory() 。他能够返回当前的剩余内存数,将他适当的安放在代码中能够有效的监测内存使用状况。很大一部份的j2me程式员之前都是从事pc软件研发工作,充裕的内存掩盖了许多写代码的不良习惯。如下所示:

//a 不为空
a=new Logic();

  很多人可能对此有异议,他们会认为新的对象会把旧的对象冲掉并且释放内存。这里面包含两个问题:1. 该段代码是先创建对象然后再进行赋值操作的,也就是说在这期间有两个对象同时存在这就很可能会产生溢出。2. 这样做也会妨碍垃圾回收器的工作
较好的写法如下:

a=null;
a=new Logic();

  虽然麻烦了点但在j2me中还是必要的。接着看下例。

drawString("游戏时间:" + time ,50,50,Graphics.LEFT|Graphics.TOP);

  "游戏时间:" + time 很完美在paint()方法当中每次都被刷一遍显示在屏幕上。危机往往隐藏在美丽的外表,该语句会引起新的内存重新分配来存储 "游戏时间:" + time 而显示完以后又必须由垃圾回收器释放,用了双倍时间,并且容易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。和paint()方法类似在循环里也有类似的情况存在。

  把任何对象的初始化放在构造函数里想必是再正当但是了,大多数人通常的做法是把当前逻辑所要用到的资源通通初始化完毕。

  很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。建议最好的办法是第一次使用时初始化。如下所示

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

  现在做游戏很多时候都需要地图数组,声音数组,更有一些其他资源这些资源很多能够放在代码中也有的能够放在文档当中。

  强烈建议将这些资源放在文档中需要时在load进来。这些资源文档假如放在代码中则会占用不小的代码段空间,而代码一般是程式一运行就装载到内存当中。

  除上面列举的方法外更有一些大家所熟知的顺便一提, 比如关闭没用的rms ,关闭没用的网络连接,关闭没用的流。正确地停止线程。良好的程式架构减少代码偶合性也是个不错的方法,无论在代码调式,内存释放都能够做到很清析。

  二. 图片优化

  j2me的内存杀手无疑非图片莫属,一张3k的图片能够占用20多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。

  1.图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储为",而是选择 "存储为 web 所用格式" 能够根据里面的选项进行压缩,特别是颜色这一项越小越好但是相应的图像会有所失真。不要认为这样就完了。
实际上该图片还能够再次压缩,在网上有许多类似的工具。推荐一款能够压缩png格式的软件 xat.com Image Optimizer 效果不错。经常都有 70% 的压缩率且图像不会失真。

  假如您有多张规格相同的图片,那么建议您把他做成一张长条图片。有两个原因:

  1、 这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文档大小有没有变化。

  2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把任何图片都存成一张,吱地一声内存又溢出了...原因想必大家也知道!!图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。
作图时更有一些细节需要注意,颜色数量,分辩率,图像模式(最好是索引颜色),画布大小都会影响到图片大小。

  三. 工具优化

  谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程式员的智商)。实际上用他来优化程式也是不错的选择,至少有两点好处:

  1、 压缩程式大小。一个60k的程式经常能够压掉10k左右。10k的空间对于写低端手机的程式员简直是雪中送碳,多少超过64k限制的游戏都受过他的恩惠;

  2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅