日期:2014-05-20  浏览次数:20628 次

j2me入门一些问题
不多说,只几个项目遇到的问题。希望能帮助一些网友少走弯路。主要针对主流机器。
1.采用cldc1.0
不细说其他,cldc1.0告诉你,不要使用1.1的浮点数,Math.sin(x)等函数。如果使用了,在一些主流机器上直接不给你安装jar文件,你会很惨。。。。像sin函数等,你可用查表方式,先用工具计算出0-360度的值,并放大1024(左移10位速度快些)写死在程序里,计算时,先放大后缩小方法保证精度:左移10位或者更多(上面的操作),然后计算的话直接根据度数的下标查找到值。运算完再右移10位,保证了一定的精度。应付像台球碰球,射击子弹等知道角度,算路线,基本上足够了。
2.采用midp2.0,1.0用也行,但不推荐了。但绝对不要用2.1
用2.0,但绝不要用GameCanvas,很多机器支持得乱七八糟,Image.createImage(Image i,x,y);也不要用,在nokia一些机器上很不支持,会出白边或者其他底色。Sprite要用,但只用Sprite的翻转参数,类Sprite绝不用。画图时用drawRegion()或者setClip再drawImge(),绝对可靠,两者速度如何,据说差不远,但midp1.0就有的setClip配合drawImage方法相对麻烦些,drawRegion是唯一在midp2.0画图方面比midp1.0爽,并可靠的方法。主流手机对这两个画图的支持还是不错的。但!drawRegion用Sprite的翻转参数做翻转时,在像nokia7610时会非常慢,解决方案是用nokia自带的包。我推荐尽量不用翻转,仅用Sprite.TRANS_NONE,当然,你直接使用0也行,TRANS_NONE的值就是0嘛。呵呵。很多j2me游戏入门的书籍,都介绍了,game包里的GameCanvas,Sprite等,非常不好意思对这些作者和读者讲,这在实际开发中,不用,是废的!
3.j2me游戏面向对象,设计模式等一些非常好的设计方式,在j2me上需要做出取舍
项目中不要太多的类,我搞过一款飞行射击游戏,用了100多个类,发现n73相对好点性能的手机内存都过不去,而且速度慢,后来不断合并类,删减接口,很痛苦。最后在60个类左右终于主流机型都过了,速度也不卡了。不提倡一点oop也不讲做游戏,也不推荐过度设计。有些手机对oop的支持,还是很有问题的:
interface A定义方法b();abstract class C implements A;C类体上没重申明这abstarct b()方法,然后可实例化的类class D extends c,把D转成C然后调用b方法,这绝是没问题的。可是在nokia7610上你这样搞,它会抛出方法没找到的异常(no such method be found)。当年,找到这个bug费好大劲。希望有人遇到这问题能得到帮助 
4.混淆器使用
有些代码,不混淆,程序在手机上ok;混淆后不成;有些又相反。同样性能,编译后字节码文件都可能大了,也可能小了。通常情况下是混淆后,包小了,性能高了。如果一旦相反,那么你可以尝试另外个混淆器版本试试。如果有些代码,不混淆,程序在手机上ok;混淆后不成,这种情况。那么,就是混淆器有问题了。别老是查程序,查不出问题的。试过在程序中定义了个变量名叫now来计时,结果发现索爱和lg上运行不行,时间老是不对点,程序没死,不按逻辑跑了。而放在nokia上是ok的哦。后来把now改成其他,所有机器上运行ok.这个混淆器或者机器的变量命名的bug叫你找,你找多久?我找了一天。。。
5.线程使用
j2me中不要超过2个线程,否则像索爱很不稳定,可能这次能跑过,下次不行。尽量不要使用匿名线程,因为很多时候,用了它代码里你一不小心会有好多这些匿名类,失控了.而这些编译后都会成一个类.你最好定义出这个线程类来,这样你心里就会有这个类存在,从而更好的控制线程.提到线程,就提一下音乐播放,具体实现是线程还是什么我没有研究,(播放不会阻塞,会自动播放,不影响运行,看样子应该是个线程吧,所以你要计这个也是线程哦)但在j2me游戏里,音乐是很次很次的,不要播放太大的mid播放音乐,会卡很多,这点很正常,换小点的mid是唯一方法.
6.System.gc()
这方法,你不用,那是最好的.你担心内存不够?调用它?jvm就会额外分出资源去做内存回收,说不定下次它自己又做了呢?这样多出一次,多浪费啊?gc是非常耗资源的!很可能游戏中,一调用System.gc()就会卡一会,令玩家不爽了.甚至有些机器一旦调用System.gc()系统就慢得不行了!只要记得你使用的不用东西,用=null;一下,注意引用的回收,资源自动会回收的,不用担心.毕竟jvm是经过了10几年检验的.很多书籍或者公司面试题都特意用gc做文章.说用什么方法回收资源,gc是什么.我以经验告诉你,那些很 呵呵,不过据说有什么机器,不调System.gc()就不回收的哦.不过,我是没遇到过这种机器滴....
7.会用Runtime去观察内存总量,使用量
8.程序中卡的问题,基本上与循环有关.画图时记得用缓冲.状态更新,处理收入,画图,能在一个循环就一个搞定最好.
9.学会用屏幕做参数来定位置,对移植会很有好处
10.会使用动编,地编,会利用脚本
11.会用预编译
1 楼 monya_h 2010-04-14  
请问能描述下GameCanvas在机器上的使用情况嘛。我目前在nokia的机子上,使用GameCanvas的时候感觉还行。如果使用canvas在做动画的时候,感觉不如GameCanvas的好使。