游戏开发中,很多图,比如数字美术图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就不快,尽量不要做翻转绘图。宁愿让美术多做一方向的图。当然,图多,图碎,可以提高速度,也可以增加内存,降低可移植性,这都是要均衡的了。
既然是讨论,当然会有争议,所以,如果可以,欢迎网友提不同观点,共同讨论。
转载请注明出处。
分享到:
相关推荐
总的来说,这个J2ME画图程序利用了 `Canvas` 类提供的基本绘图能力,结合 `MIDlet` 的生命周期管理,以及用户输入事件的处理,实现了在移动设备上简单的涂鸦功能。虽然代码片段未给出完整的绘图逻辑,但我们可以推断...
7. **图形与多媒体**:讲解如何在J2ME中处理图像、音频和动画,利用J2ME的Graphics类进行画图操作。 源代码分析: 源代码部分可能包含实际的MIDlet项目,如游戏、小工具或简单的应用示例。通过这些代码,学习者可以...
开发者需要掌握基本的图形绘制和动画制作技巧,如使用Graphics类进行画图,以及利用定时器实现帧动画。 **J2ME的优化技巧** 由于资源有限,J2ME应用的性能优化至关重要。这包括减少内存消耗、优化代码结构、避免...
J2ME提供了低级别的Graphics类,用于进行像素级的绘图操作,包括画线、填充、画图等。同时,了解如何优化绘制性能以适应移动设备的限制也是必要的。 4. **Sprite类的使用**:Sprite是游戏开发中常用的抽象,代表...
2. **图形与动画**:通过Java的Graphics类,开发者可以控制像素级别的画图操作,实现游戏元素的绘制和移动,从而创建出贪吃蛇的移动、食物生成以及碰撞检测等效果。 3. **事件处理**:J2ME提供了键盘事件处理机制,...
4. **图形与动画**:游戏中的坦克、背景、子弹等元素通常是以位图(Bitmap)形式存储,通过在Canvas上画图来显示。开发者需要掌握如何高效地更新和绘制位图,实现流畅的动画效果。 5. **声音效果**:虽然J2ME的音频...
HeightMap 可以使用画图板或者图像编辑器 Adobe Photoshop 产生。使用图像编辑器可能更容易,它能够帮助创建想要的交互地形,另外也可以通过图形编辑特性,例如过滤,创建有趣的高度图。 粒子系统是另一种重要的...
2. **图形渲染**:J2ME中的图形绘制主要通过`Graphics`类完成,用于在`Canvas`或`Form`上进行画图操作。俄罗斯方块的方块、得分等元素都会在这个层面上被绘制出来。 3. **游戏逻辑**:这部分涉及方块的生成、旋转、...
Canvas是可画图的空白画布,我们可以在这个画布上绘制游戏场景。贪吃蛇的游戏界面主要由蛇、食物、得分和边界组成,我们需要重写Canvas的draw方法来绘制这些元素。 3. **事件处理**:J2ME通过键盘事件监听来控制蛇...
Canvas是J2ME中提供自定义图形绘制的类,它允许开发者直接在屏幕上画图,非常适合构建游戏界面。在五子棋游戏中,Canvas将被用来绘制棋盘和棋子,实现用户交互。EfeiCanvas.java可能就是实现这个功能的类,包含绘制...
3. 画图:利用MIDP的Canvas类,逐像素绘制物体的轨迹。由于MIDP的屏幕空间有限,可能需要对坐标进行适当的缩放和裁剪。 4. 循环迭代:重复步骤2和3,直到物体落地或者达到预设的最大时间。每次迭代后更新屏幕显示,...
里面是用J2ME UI Canvas 将一图片画成三分,并做为三人按钮,最重要的是,画一选择框去选择,哪个按钮并响应,所选择的按钮事件。
J2ME中的Graphics类用于画图和文字,而在Android中对应的则是Canvas类。游戏画面的绘制方法,J2ME使用`Graphics.drawImage()`,Android对应的是`Canvas.drawBitmap()`;画文字J2ME使用`Graphics.drawString()`,...
由于这两个平台的图像处理方式不同,所以需要将J2ME的Image对象转换为Android的Bitmap对象,并相应调整画图方法。 4. 数据保存: J2ME使用RecordStore系统保存数据,这类似于简单的键值对存储。而在Android中,...
此框架不是很复杂,主要是关于: 1,按键处理 2,加载资源 3,线程控制刷屏 4,画图[onDraw(canvas g)] 真爱生命 远离J2ME
应用软件:word ,ppt,画图板,… 人机交互方式: 图形化界面 vs 命令行方式 应用程序 = 算法 + 数据结构 2.计算机语言的发展迭代史 第一代:机器语言 第二代:汇编语言 第三代:高级语言 面向过程:C,Pascal、...
// 画图函数为Canvas里的抽象函数,必须重写,画布出现时自动调用 protected void paint(Graphics g) { System.out.println("paint") ; } // 重写,画布放在最前端自动调用 public void showNotify(){ ...
本软件是继Function之后的手机版函数作图软件,画图精度高,操作简便,可移植性好,可运行于绝大多数手机平台。同时还新增了隐函数处理算法,可表达一般显式函数所不能表达的图像,如圆的标准方程。最后,本软件的...
画图性能:单张图片 图片 效率 512*512*16 450fps 512*512*32 250fps 特点: 1 支持16位(RGBA5650 RGBA5551 RGBA4444)/32位(RGBA_8888)显示。 2 支持JPG,BMP(24,32位),PNG,TGA(24,32位)图片读取,并转化到...