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

J2ME内存占用详解及优化方法

    博客分类:
  • Java
阅读更多
我想做过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。

  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。

  优化方法:

  有些人认为压缩图片可以节省内存,这种想法是错误的。根据上面的解释图片载入内存后只和宽高有关系,和图片数据量大小没有任何关系,压缩图片只能减少jar大小而不能见少内存占用量。

  1.静态法:减小图片大小,宽高小了结果当然小了。根据这个思路出现了动画编辑器之类的工具,像gameloft的波斯王子,人物被分割后使人体的部位可以重用,各部位紧凑放置都是为了较少图片大小,充分利用图片中的每一寸空间。

  2.动态法:减少同一时刻载入内存的图片数。CoCoMo曾经在火影武士项目中遇到过这种情况,当时有6种怪物,如果同时载入内存在老40上肯定爆掉了,但是每关只出现两到三种怪物,所以每一关只需要载入该关出现的怪物图片即可。现在想起来当时做这个项目在老40上溢出频出,真把我搞死了。

   声音:声音也是比较耗用内存的资源,声音中音轨所占的byte会转化成字节流被载入到内存中。因而减少音轨所占byte即可减少内存耗用量。目前gameloft的做法是用声音转化工具将mid转化为ott,然后变为ByteArrayInputStream字节流来创建Player。
分享到:
评论

相关推荐

    j2me拼图游戏详解

    J2ME平台资源有限,优化代码以减少内存占用和提高执行效率至关重要。例如,减少不必要的对象创建,使用位运算代替浮点计算,以及使用缓存策略来避免重复加载图像。 9. **测试与调试** 在多种设备上测试游戏,确保...

    J2ME手机游戏开发技术详解源码

    这包括减少内存占用、优化算法和避免不必要的计算。 11. **Testing and Emulation**:由于设备多样性,测试在J2ME开发中非常重要。使用模拟器和实际设备进行测试,确保游戏在不同平台上表现良好。 这个压缩包提供...

    J2ME开发详解工具篇 pdf

    开发者需要关注代码的大小和运行效率,减少内存占用,避免不必要的计算和资源消耗,以及优化图形和网络操作。 8. **J2ME的API** J2ME提供了一系列的API,如MIDP(Mobile Information Device Profile)和CLDC,用于...

    J2ME手机应用项目开发实践

    9. **优化技巧**:由于资源有限,J2ME应用的性能优化至关重要,包括减少内存占用、优化绘图操作和避免不必要的网络请求。 这个压缩包中的源代码实例,很可能是涵盖以上各个方面,通过分析和研究这些代码,开发者...

    Java认证J2ME游戏开发的高级优化技巧.docx

    ### Java认证J2ME游戏开发的高级优化技巧 #### 一、引言 随着移动设备技术的发展,Java 2 Micro Edition (J2ME) 成为了早期智能手机和平板电脑上开发应用的重要平台。尤其是在游戏开发领域,J2ME 提供了一套完整的...

    《程序天下-J2ME手机游戏开发详解》源码

    7. **性能优化**:由于移动设备资源有限,优化代码以减少内存占用和CPU消耗至关重要。例如,避免过多的对象创建,使用位运算代替浮点计算,以及合理地使用缓存和数据结构。 8. **游戏逻辑和物理引擎**:开发游戏时...

    J2ME开发详解--工具篇

    **J2ME开发详解——工具篇** 随着移动设备的普及,移动应用开发逐渐成为软件行业的热门领域,而Java 2 Micro Edition(J2ME)作为早期的移动开发平台,为开发者提供了进入这一领域的途径。本篇文章将深入探讨J2ME...

    j2me手机游戏开发技术详解

    KVM是J2ME CLDC配置下的Java虚拟机实现,专为资源受限的设备设计,具有较小的内存占用。 **1.1.5 J2ME简表(Profiles)** 简表是基于特定配置的一组API集合,包括: - **MIDP (Mobile Information Device Profile)**...

    J2ME开发详解-工具篇

    - **Profiler**:例如JVisualVM,可以帮助开发者分析应用程序的内存使用、CPU占用率和线程状态,以优化性能。 - **Debugger**:IDE内置的调试器或独立的J2ME调试工具,如WireShark,用于捕获和解析网络流量,帮助...

    j2me手机游戏开发详解

    - 资源管理:减少内存占用,及时释放不再使用的对象。 - 算法优化:避免复杂计算,提高运行速度。 8. **动画与游戏逻辑** - 定时器:使用 javax.microedition.timers.Timer 和 TimerTask 创建游戏循环。 - 帧率...

    郭克华J2me课件与代码

    - **代码优化**:由于J2ME设备资源有限,优化代码以降低内存占用和提高运行效率至关重要。 - **屏幕适配**:考虑到不同设备的屏幕尺寸和分辨率,需要编写可自适应的UI代码。 通过郭克华老师的J2ME课件与代码,...

    j2me手机游戏开发技术详解源代码

    这包括减少内存占用、优化绘图算法和避免不必要的计算等。 9. **调试和测试**:J2ME游戏通常需要在模拟器和真实设备上进行测试。NetBeans和Eclipse等集成开发环境提供了强大的J2ME模拟器,同时开发者也需要在不同...

    J2ME游戏程序开发实例详解

    由于资源有限,开发者需要优化代码,减少内存占用,确保游戏在各种设备上都能流畅运行。此外,考虑到版权问题,开发者应避免直接使用他人作品,而是学习和借鉴,创作自己的游戏内容。 总的来说,J2ME游戏程序开发...

    J2ME中文输入Demo

    这可能意味着减少内存占用,优化算法以降低计算复杂性,以及在不影响用户体验的前提下降低图形渲染的需求。 7. **HanziInputLibrary** 这个库可能包含了实现中文输入功能的关键代码和数据结构。它可能包括拼音转换...

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

    然而,受限于这些设备的硬件性能,J2ME 应用程序往往面临着运行效率低下、内存占用过多等问题。因此,对于开发者而言,掌握一些有效的代码优化技巧至关重要。本文将详细介绍两种针对 J2ME 的代码优化方案,并通过...

    J2ME小游戏的源码

    - **内存管理**: 移动设备资源有限,需要关注内存占用,合理使用对象和及时释放资源。 - **性能优化**: 减少绘图操作、避免不必要的计算,使用位运算优化逻辑,提高游戏运行效率。 7. **调试与测试** - **模拟器...

    j2me手机游戏开发技术与项目实战详解 源代码(1)

    8. **性能优化**:针对移动设备的硬件限制,学会编写高效代码,减少内存占用,优化渲染速度,是提升游戏体验的关键。 9. **项目实战**:通过书中提供的实际项目案例,你可以锻炼从需求分析到代码实现,再到测试调试...

    java开发利器—j2me手机游戏开发技术详解

    这包括减少内存占用、优化绘图算法、合理使用线程等。同时,J2ME提供了简单的调试工具,如WTK(Wireless Toolkit)的模拟器,帮助开发者定位和修复问题。 九、发行与测试 在完成游戏开发后,开发者需要在多种设备...

    J2ME 中文教程

    了解如何优化代码以减少内存占用。 - **性能优化**:提高应用程序的运行效率,如减少不必要的对象创建、优化图形渲染等。 - **调试技巧**:掌握有效的调试方法,如使用日志记录、断点调试等手段。 #### 七、J2ME...

Global site tag (gtag.js) - Google Analytics