`
hao3100590
  • 浏览: 128974 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多


手机游戏设计中由于设备性能限制,可能出现资源不足的情况,这就需要优化实现技术,游戏的优化有很多的技巧,在我做的这个游戏中使用了以下方法:
   关于异常的处理
Java中提供了try/catch来方便用户捕捉异常,进行异常处理。但是如果使用不当,也会给J2ME程序的性能带来影响,所以在程序的编写过程中,应注意以下两点:如果可以使用ifwhile等逻辑语句来处理,就尽量不使用异常处理;对于必须要进行异常的处理时,尽可能的重用已经存在的异常对象。
   图片优化
J2ME的内存杀手无疑图片莫属,一张3kbpng图片可以占用20kb的内存。对于图片的优化在我做的这个游戏中使用了几种方法:将所有图片存储为8位色,而不是16位或24位;也可以将同一规格的图片合并,做成一张长条的图片,并在导入时使用时creatImage()函数裁剪。如原来为130*50的图片,取其左面的一部分

 写道
playerSprite=new Sprite(Image.createImage("/res/MyPlaneFrames.png"), 65, 50);
 
   代码优化
Java的垃圾回收器并非是实时的,从某种角度来讲在J2ME上所有垃圾必须由手工释放,因为简单类型外所有对象都必须显示置空。例如在游戏程序中对于生命面包类对象bread的声明:

waterLayer=new TiledLayer(50,200,Image.createImage("/res/backg.png"),32,32);

该段代码是先创建了对象然后再进行赋值操作,也就是说在这期间有两个对象同时存在,这就很可能会产生溢出,同时这样做也会妨碍垃圾回收器的工作,较好的编程如下:

    写道
waterLayer=null; waterLayer=newTiledLayer(50,200,Image.createImage("/res/backg.png"),32,32);
 
把所有对象的初始化放在构造函数中是理所当然的,大多数人通常的做法是把当前逻辑所要用到的资源全部初始化完毕。但是很大一部分的内存溢出都是发生在构造函数中,内存使用的高峰期都是在构造函数中,避开这个高峰期就能有效地防止溢出,所以程序汇总对于变量的初始化尽量在第一次调用时进行。
Java代码访问成员变量比局部变量所需的时间更长。其原因和两种变量的内存如何访问有关。实际上,这意味着在性能关键的时候,你应该使用局部变量而不是成员变量。例如有一个循环重复访问的成员变量,那么,应该考虑在开始循环之前把这个成员变量存储到一个局部变量中。下面是游戏中在一个循环中访问成员变量:
 写道
for(int i=0;i<MAX_BP;i++){
if(bigPlane[i].getY()>downLimit-bigPlane[i].getHeight())
bigPlane[i].setVisible(false);};
 
       可以看到,bigPlane对象的成员变量在循环中被访问了MAX_BP次。这段代码的一种快速优化包是把bigPlane[i].geyY设置给一个局部变量,然后在循环中访问这个局部变量,可以在for循环之前定义局部变量String a[],然后在循环中用a[]代替bigPlane[i].getY
   减少内存的使用
       在很多时候,手机内存的限制比设备的有限处理能力的限制要显著的多,因此尽可能地减少手机游戏的内存使用显得及其重要,可以利用一些实际的开发方法来减少一个游戏MIDlet所需的内存。一般情况下,对于减少内存的使用所用的方法是使用对象时重用对象。
        对象重用就是重新使用已有的对象,而不是创建一个新的对象。这种方法只有在需要重复使用相同类的对象时才奏效。对象重用避免了不必要的内存分配。例如如果创建一个对象然后终止使用它,java垃圾回收器最终会释放分配给它的内存。如果需要另一个相同的类型的对象并且创建了新的,对象所需要的内存会自动重新分配,那么,可以把最初的对象重新初始化而不再创建一个新的,这要也就重用了对象。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics