`
- 浏览:
2114528 次
- 性别:
- 来自:
广州
-
原文 http://www.3geye.net/?3/viewspace-3215
out momory
一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有,套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不奇怪,可是在手机上却只能以K
来记,可能某位同志会马上跳出来说也有上M的,记住中国还不富大多数手机都是低端手机。写手机程序让我仿佛回到了dos时代(自我安慰一下那个时代也炼出
了不少高手说不定我是下一个)。言归正传做内存优化可以归结为以下几种方法。代码优化,图片优化,第三方工具优化等…
3^N9RfBLC�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%_ nmRx
二. 图片优化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^-rW@8q3 假如你有多张规格一样的图片,那么建议你把它做成一张长条图片。有两个原因:
:bw-N ?1H[r]31、 这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文件大小有没有变化。3GEYE.~
b7C~c]9R-V Lf
2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把所有图片都存成一张,吱地一声内存又溢出了...原因想必大家也知道!!图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。3GEYE"YGAg1r$L
作图时还有一些细节需要注意,颜色数量,分辩率,图像模式(最好是索引颜色),画布大小都会影响到图片大小。3GEYEC%}~�\`,N"bQ
三. 工具优化3GEYE0{.^:w|.ZhDn}
谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程序员的智商)。实际上用它来优化程序也是不错的选择,至少有两点好处:1、
压缩程序大小。一个60k的程序经常可以压掉10k左右。10k的空间对于写低端手机的程序员简直是雪中送碳,多少超过64k限制的游戏都受过它的恩惠;
2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。
1Uz#ioJ:r3根据经验很多人都会用jb自带的混淆器RetroGuard,实际上它效果并不怎么好。推荐使用proguard 在http://sf.net可以免费下载,它可以比retroguard 多压缩3至4 k 以上而且安全性更好。3GEYEGR!MC[I
$wY:hhF|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,MQ,~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是一块连续的内存空间,搞不好就内存溢出了。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
- **内存管理**:优化内存使用,避免内存泄漏。 - **网络连接**:适应不稳定的网络条件。 ##### 3.3 设计开发移动设备应用程序的注意事项 - **电量消耗**:减少应用程序对电池的影响。 - **网络流量**:优化网络...
1. **KVM(K Virtual Machine)**:J2ME使用轻量级虚拟机,名为KVM,它优化了内存占用和执行效率,适合资源受限的设备。 2. **CLDC(Connected Limited Device Configuration)**:这是J2ME的基础配置,针对内存和...
《精通Eclipse Web开发--Java体系结构、工具、框架及整合应用.pdf》这本书可能是一个补充资源,尽管它不是直接关于J2ME和MIDP的,但Eclipse是一个广泛使用的Java集成开发环境(IDE),对于J2ME开发者来说也是一个...
8. **优化与性能**:分享如何优化代码以适应移动设备的有限资源,如内存管理和图形渲染效率。 9. **实例分析**:教程中的实例可能包括各种类型的游戏,如经典的贪吃蛇、俄罗斯方块等,通过分析这些游戏的实现,学习...
《J2ME MIDP 编程指南》是一本专为初学者设计的手机Java开发教材,它深入浅出地介绍了如何使用J2ME(Java 2 Micro Edition)平台中的MIDP(Mobile Information Device Profile)进行移动应用开发。J2ME是Java在...
深入学习J2ME,开发者需要实践编写MIDlets,理解设备特性和限制,熟悉模拟器的使用,以及如何优化代码以适应低功耗和有限资源的环境。同时,随着Android和iOS等现代移动平台的兴起,虽然J2ME的应用场景有所减少,但...
《手机游戏开发技术》 手机游戏开发是一项技术含量高、...总之,J2ME手机游戏开发技术涉及的内容广泛,不仅需要深入理解J2ME的体系结构,还要具备良好的编程技巧和优化能力,才能开发出适应各类移动设备的高质量游戏。
【对对碰小游戏源代码分析】 ...通过阅读和理解源码,不仅可以深入了解J2ME编程,还能掌握游戏逻辑设计和优化技巧。不过,由于源代码可能存在不足,学习过程中可能需要自行补充和完善,以提升代码质量和用户体验。
首先,书中会介绍MIDP的基础知识,包括J2ME架构、MIDlet生命周期管理以及如何创建和运行一个基本的MIDlet。MIDlet是运行在MIDP平台上的Java应用程序,它有自己的启动、暂停、恢复和停止的生命周期,理解这一生命周期...
通常情况下,JVM会自动优化垃圾回收的过程,开发者应该尽量避免直接调用这些方法来触发垃圾回收。 ### Java 的局限性 尽管Java具有很多优点,但也存在一些局限性: - **性能问题**:相比于某些原生编译的语言如C/...
5. **性能优化**:由于移动设备资源有限,优化代码以减少内存消耗和CPU使用率是必要的。这包括有效使用线程、避免内存泄漏和减少不必要的计算。 6. **调试和测试**:使用BlackBerry模拟器和真机进行测试是必不可少...