`
wanggp
  • 浏览: 149686 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

J2ME内存优化

    博客分类:
  • J2ME
阅读更多

今天在CSDN上浏览帖子,忽然发现一篇询问内存溢出的解决办法的帖子,有感而发写了这篇文。
      我想做过J2ME的人,特别是像我这样做手机游戏的,肯定会对OutOfMemoryError这个异常深恶痛绝,尤其是在老40这样变态的机型上,甚至对这个异常都产生了恐惧。还好我现在总算不做这个机型了,对那些仍然在为这个机型移植游戏的同志们感到同情。为了能够稍微缓解一下他们的痛苦,也为了广大J2ME的从业者和爱好者能尽量减少与该异常的见面次数,CoCoMo将把自己的经验分享一下。
     
  首先了解一下分析内存占用的方法,一般有两种:模拟器自带工具和Runtime类方法。
 
  模拟器自带工具:WTK貌似带了一个Memory Monitor,而且许多学者人士也夸夸其谈他的使用方法,但我不知道有多少人真正在用。就我对他的了解,首先运行他你的程序会慢的一塌糊涂,这对游戏开发者来说简直是无法忍受的。但我出于研究目的仍然让他跑了半个小时才发现原来他根本无法显示正确的内存占用量,我载入一张很大的图片后他的内存线好像只出现了微微的波动又停留在原位,呵,看来的确是拿出来秀的。我一般使用的是7210模拟器自带的内存监视器,模拟的很准,但唯一的缺点是内存太少,才200K。我也见某些人使用3220的模拟器监视内存,好像内存稍微大一点,我还没来得及尝试就再也不用为老40写程序了,庆幸。
  Runtime类方法:我经常用这个语句System.out.println(Runtime.getRuntime().freeMemory());后来集成进了我的引擎,他能够显示当前剩余内存。不记得有多少次我用它在老40上来寻找内存占用峰值。
     
      了解了分析内存的方法,来看看内存占用的罪魁祸首:程序和资源。
      程序:类会被编译成class字节码文件随MIDlet的启动加载进内存,而且是一次性全部加入。也就是说MIDlet里类个数越多、单个类程序越长、类内字符串常量及数据越多,编译后的class文件就越大,载入后占用的内存也越多。我经常在MIDlet类的构造函数里用Runtime方法来查看MIDlet启动后整个程序占用内存量。
      优化方法:
      1.某些同志将MIDlet程序写成两个类来减少内存占用量,但是以牺牲Java的OOP特性为代价的。在程序比较大时这种弊端将尤为显见。而且CoCoMo曾经遇到过单个类过大,载入时间过长而违反百宝箱有关Logo 6秒时间限制的情形。因而我现在的程序加带引擎一般都是6-7个类。
      2.尽量编写优雅的代码,减少函数数量,在程序发布时去掉try catch,最大限度的减少程序行数,这一般都是在老40上没有办法的办法,现在CoCoMo已经不靠这个来省内存了。
      3.将数据及字符串写进文件,在用时方载入内存,不用时设为null。

JAVA手机网[www.cnjm.net]

      4.I/O操作getClass().getResourceAsStream(file);、数据库操做RecordStore.openRecordStore(name, true);、声音创建Manager.createPlayer();、图像创建Image.createImage(file);会在短时间内占用大量内存且过后释放,如果MIDlet程序内存剩余量不足则会在这些函数频繁调用时发生内存溢出,产生所谓的内存峰值,尤其在老40上比较普遍。
当你再次与讨厌的OutOfMemoryError碰面时,多用Runtime查找内存峰值发生位置并尽量将这些语句分开调用,并灵活运用System.gc()来及时回收。
     资源:
        图片:是占用内存的大户,尤其是手机游戏图片资源众多。对图片资源在内存中占用量的计算成为J2ME游戏开发者的经常性工作,CoCoMo来解释一下如何计算图片在内存中的占用量:
      内存占用量=宽*高*像素字节数,其中像素字节数因机型而异。
      例如一张64*64的图片在7210上的内存占用量=64*64*1.5=6144(字节)=6K、在S60上的内存占用量=64*64*2=8192(字节)=8K。像素字节数因机型而异,例如7210是4096色机型,也就是说用12位来表示一个像素,所以乘上1.5,而S60是65536色的机型,用16位来表示一个像素,所以乘上2。
      优化方法:

JAVA手机网[www.cnjm.net]

      有些人认为压缩图片可以节省内存,这种想法是错误的。根据上面的解释图片载入内存后只和宽高有关系,和图片数据量大小没有任何关系,压缩图片只能减少jar大小而不能减少内存占用量。
      1.静态法:减小图片大小,宽高小了结果当然小了。根据这个思路出现了动画编辑器之类的工具,像gameloft的波斯王子,人物被分割后使人体的部位可以重用,各部位紧凑放置都是为了较少图片大小,充分利用图片中的每一寸空间。
      2.动态法:减少同一时刻载入内存的图片数。CoCoMo曾经在火影武士项目中遇到过这种情况,当时有6种怪物,如果同时载入内存在老40上肯定爆掉了,但是每关只出现两到三种怪物,所以每一关只需要载入该关出现的怪物图片即可。现在想起来当时做这个项目在老40上溢出频出,真把我搞死了。
      声音:声音也是比较耗用内存的资源,声音中音轨所占的byte会转化成字节流被载入到内存中。因而减少音轨所占byte即可减少内存耗用量。目前gameloft的做法是用声音转化工具将mid转化为ott,然后变为ByteArrayInputStream字节流来创建Player

分享到:
评论

相关推荐

    j2me 代码优化,内存优化分析

    2. **J2ME内存优化**: - **对象生命周期管理**:及时释放不再使用的对象,防止内存泄漏。 - **减少对象创建**:大量创建对象会快速消耗堆内存,应尽量复用对象或使用基本类型代替。 - **理解CLDC/MIDP内存模型**...

    J2ME开发内存优化方法.doc

    以下是针对J2ME内存优化的一些关键方法和策略: 1. **代码优化** - **手动内存管理**:由于J2ME的垃圾回收机制不是实时的,开发者需要更加谨慎地管理内存。特别是在场景切换时,及时释放不再使用的对象,如将对象...

    J2ME游戏优化秘密

    由于J2ME设备通常拥有有限的处理能力、内存和显示尺寸,因此优化代码对于确保游戏在这些限制条件下运行良好尤为关键。 2. **不同类型的优化**: - 高级优化通常涉及改善代码结构和算法,使得程序逻辑更清晰,通常...

    j2me开发指南第二讲

    五、J2ME内存优化 J2ME设备的内存有限,因此内存优化是提高游戏性能的关键。优化策略包括: - **最小化对象创建**:减少临时对象的生成,尽量重用对象,使用池技术管理资源。 - **使用轻量级数据结构**:例如,...

    J2ME代码优化..rarJ2ME代码优化..rarJ2ME代码优化..rar

    J2ME代码优化是开发者为了提高应用程序的性能、减少内存消耗以及缩短响应时间而采取的一系列技术措施。在资源有限的J2ME平台上,优化代码显得尤为重要,因为它直接影响到用户体验和应用的可运行性。 **1. 代码结构...

    J2ME游戏优化秘密_译文.txt

    ### J2ME游戏优化的秘密 #### 一、引言 J2ME(Java 2 Micro Edition)是Java的一个分支版本,专门针对移动设备和嵌入式应用开发设计。随着移动设备性能的提升以及用户对游戏体验需求的增加,优化J2ME游戏成为了一...

    J2ME代码优化的两种方案(2)

    ### J2ME代码优化的两种方案(2):详解与实践 #### 一、引言 J2ME(Java 2 Platform, Micro Edition)作为早期移动设备开发的主要平台之一,在资源极其有限的情况下进行高效的代码编写变得尤为重要。本文将详细介绍...

    J2ME代码优化的两种方案(1)

    ### J2ME代码优化的两种方案(1):详解与实践 #### 一、引言 随着移动设备的发展,Java 2 Micro Edition (简称 J2ME) 作为一款专为资源受限设备设计的 Java 平台版本,在早期的手机、PDA 等设备上得到了广泛应用。...

    J2ME代码优化

    **J2ME代码优化——Java开发中的性能提升策略** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如早期的智能手机和平板电脑。由于这些设备的硬件资源相对有限,因此在...

    一个java正规表达式工具类

    在`J2me内存优化.txt`文件中,可能包含了关于Java ME(Micro Edition)环境下如何优化内存使用的技巧和最佳实践。Java ME是Java的一个子集,主要用于移动设备和嵌入式系统,其内存资源通常比桌面环境更为有限。优化...

    J2ME中程序优化的十个小方法

    以下就是十个针对J2ME程序优化的小方法,旨在提高程序运行效率,减少内存占用,提升用户体验。 1. **合理使用数据结构**:J2ME中的数据结构如ArrayList和Vector在内存管理上不如Java SE高效。考虑使用数组代替...

    J2ME优化压缩PNG文件程序代码

    **J2ME优化压缩PNG文件程序代码详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机和智能手表。在这个场景下,资源优化至关重要,尤其是图像文件,因为它们通常占据...

    J2ME应用程序性能优化的探讨

    ### J2ME应用程序性能优化的探讨 #### 引言 随着移动互联网的快速发展,Java 2 Micro Edition(简称J2ME)作为一种适用于嵌入式设备和消费性电子产品上的Java平台,为开发者提供了丰富的开发工具和环境。然而,...

    J2ME优化压缩PNG文件

    J2ME作为Java的一个轻量级版本,主要用于嵌入式设备和移动设备,它的资源有限,包括内存、CPU速度和存储空间。因此,对图像资源进行优化是提高J2ME应用加载速度和运行效率的关键步骤。这个程序的使用可以显著改善...

    J2ME优化压缩PNG文件.zip

    标题“J2ME优化压缩PNG文件”表明我们关注的是如何在J2ME环境中有效地压缩和优化PNG图像,以减小其存储占用并提高应用程序性能。这通常涉及到以下关键知识点: 1. **PNG图片压缩算法**:了解PNG文件的内部结构,...

    J2ME优化压缩PNG文件.7z

    由于J2ME平台通常在内存和处理能力有限的设备上运行,因此对PNG图片进行优化可以显著提升应用的性能和加载速度。"J2ME优化压缩PNG文件.7z"这个压缩包很可能包含了一系列工具、代码示例或教程,旨在帮助开发者减少PNG...

Global site tag (gtag.js) - Google Analytics