当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

J2ME内存占用及优化办法[Java编程]

赞助商链接



  本文“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内存占用及优化办法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • j2me创意-Wap浏览器的源代码
  • J2ME中读取Unicode和UTF-8编码文件
  • J2ME中的底子碰撞检测算法浅析
  • <b>关于j2me game双缓冲实现根究</b>
  • J2ME游戏开辟学习之用setClip分割图片
  • 在J2ME/MIDP中实现图象旋转
  • 初学j2me必读 网友学习笔记
  • 操纵J2ME程序测试MIDlet的生命周期
  • J2ME中操纵缓存将屏幕内容存储为Image
  • 操纵J2ME技术开辟RPG游戏之按键处理机制
  • J2ME中setClip办法操纵详解
  • 在J2ME手机程序开辟中操纵颜色
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .