j2me画图

2014/06/19 00:26
阅读数 24

游戏开发中,很多图,比如数字美术图0-9,精灵各个桢图,都放一张png图里去。然后就有了以下api绘图讨论:
第一种:midp1.0中,用setClip设置特定裁剪区,配合drawImage去画,然后又setClip放回原来未画时的裁剪区。画时,图如果是x*y像素,setClip完,还是要遍历(循环)x*y,所以效率不高。
第二种:J2me资源利用,只要有提高的空间,人们都会努力去改进。Midp2.0后,有了裁图api,Image.createImage(Image image, int x, int y, int width, int height, int transform),可以从大图中裁出一个个小图出来,如果原图是透明的,裁出来也是透明的。这样一来,每次画图时,直接调用drawImage把想画的块图画出来就行了。比如画数字美术图9527,只要预先把0-9各个图裁出来放内存,画数字9,5,2,7,共4张图搞定。试想用midp1.0去画,不仅要不断setClip,还要每次都去画这张整图(0-9),共4次整图,midp2.0显然效率提高了不少。
参考《手机游戏开发全书》
第二种绘图方式,理论是绝对美妙,绝对正确的。而在实际开发中,绝对要慎用。绝不是因为有机器还不支持midp2.0(当今用来玩游戏的手机,绝绝绝大部分都支持mipd2.0)。真正原因有下两点:
1我们再回去看看第二种方法,有没发现其中的问题?显然,这就是空间与效率的矛盾问题了,提高了效率,占用了内存。(手机内存这里指运行java程序时的可用的最大的堆栈内存)。手机内存并不充裕,把每张整图切碎放内存,很多机型就吃不消了。一个再好的游戏,在电脑里开发出来,模拟器上测试很爽很爽的,如果不能放在手机里运行,放在主流手机里运行,说白了不能被大众使用的手机上运行,就不能赚钱,就是失败的游戏!相信有不少公司在用动作编辑器--印度人开发的MotionWelder吧,利用它自带的类去读.anu文件时,它就会这样切图的哦,可要小心了。
2在真机上测试时,用midp2.0的Image.createImage(Image image, int x, int y, int width, int height, int transform),手机上画出来的效果,在很多机型上,支持得很好。在所有品牌中,目前的经验告诉我,索爱是对sun标准支持得最最完美。可是就有些机型可没那么爽哦。像nokia的n73系列,有时会出一白底边;你要是放在nokia7370系列中,非常的不幸,全部都有不明所以的颜色的底边,根本不透明!号称支持2.0 ,实际上支持得不完美。
综上可知,第二种方式慎用。
用第一种方法画图,当然足够应付所有机型的画图需求了。同时,我们再看看第一种方法,再看看它的效率,是不是效率真的低得很?这种效率不高,实际上不会特别不高:jvm画时,如果发现不在裁剪区内的,就不画,而画每一张图,都是一个个像素点画出来的,画点时很耗资源的,不画就是不消耗资源,只是多了个判断在不在裁剪区而已,画点比起判断来,效率相差甚远。因而第一种方法效率其实差不了很多。
同时第一种方法告诉我们,画图时,用setClip设置裁剪出刚好游戏屏幕大小的区域,会提高效率哦。
历史是否就停滞不前了?只用midp1.0的第一种绘图方法了?当然也不是。第一种方法需要不断用setClip设置裁剪,烦得要命,画完还得设置回原来没裁剪的区域。Midp2.0提供了drawRegion方法,为我们提供了很好的解决方案。drawRegion可以等于setClip和drawImage。并且在效率上,两者差不多。当然drawRegion同样也不是万能的,在nokia 7610系列画图时,如果做了翻转,速度会很慢,这时用nokia的DirectGraphics可以解决,当然效率有所提高,但不会提的特别高。用drawRegion不翻转速度是很快的。目前的经验告诉我,仅仅是7610系列对drawRegion翻转时会慢一些,其他没有。用drawRegion可放心。
在开发中,如果还要适配nokia7610系列(这些手机用户目前还是有很多的哦),本身这机型cpu就不快,尽量不要做翻转绘图。宁愿让美术多做一方向的图。当然,图多,图碎,可以提高速度,也可以增加内存,降低可移植性,这都是要均衡的了。
既然是讨论,当然会有争议,所以,如果可以,欢迎网友提不同观点,共同讨论。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部