如何优化? 知道了在那里优化,但如何进行优化呢?我们知道大部分的运算时间被花在了绘图函数上,J2ME已经为我们提供了这些函数,我们没有办法对这些函数的内部进行优化,但是我们仍然有选择权。下面我们来对J2ME提供给我们的绘图函数作一测试。 在Canvas类里添加测试代码如下:
protected void paint(Graphics g) { TestPaint(g); } void TestPaint(Graphics g) { setClip(g); setColor(g); m_font = getFont(); setFont(g); drawString(g); drawRect(g); fillRect(g); drawImage(g); drawRegion(g); drawArc(g); drawChar(g); drawLine(g); drawRoundRect(g); fillArc(g); fillRoundRect(g); }
void setColor(Graphics g) { g.setColor(0); }
void drawArc(Graphics g) { g.drawArc(0, 0, 100, 100, 4, 4); }
void drawChar(Graphics g) { g.drawChar('你', 0, 0, GE.TOPLEFT); }
void drawRoundRect(Graphics g) { g.drawRoundRect(0, 0, 100, 100, 4, 4); }
void fillRoundRect(Graphics g) { g.fillRoundRect(0, 0, 100, 100, 4, 4); }
void fillArc(Graphics g) { g.fillArc(0, 0, 100, 100, 4, 4); }
void drawLine(Graphics g) { g.drawLine(0, 0, 100, 100); }
Font getFont() { return Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL); }
void setFont(Graphics g) { g.setFont(m_font); }
void drawString(Graphics g) { g.drawString("你好", 0, 0, GE.TOPLEFT); }
void drawRect(Graphics g) { g.drawRect(0, 0, 100, 100); }
void setClip(Graphics g) { g.setClip(0, 0, 300, 300); }
void fillRect(Graphics g) { g.fillRect(100, 0, 100, 100); }
void drawImage(Graphics g) { g.drawImage(GE.m_images[GRes.PNG_MAP], 0, 100, GE.TOPLEFT); }
void drawRegion(Graphics g) { g.drawRegion(GE.m_images[GRes.PNG_MAP], 0, 0, 100, 100, Sprite.TRANS_MIRROR,100, 100, GE.TOPLEFT); } |
该程序各函数分别绘制100*100的图形,经过一段时间以后,退出应用程序,我们得到如下图数据: 根据Profiler窗口所显示的数据,我们发现drawString最耗时。其次是drawRegion,所以我们应尽量避免使用drawString函数。 通过Profiler对各种函数及程序的测试,我总结如下结论: ·仅当你需要的时候才去优化代码! ·仅优化那些最耗时的代码! ·使用Profiler去查找哪里需要优化! ·记住Profiler不代表真机上的优化结果,使用System Timer来在真机上做最后的测试! ·在做低级优化之前,总是要先思考算法是否是最优! ·绘图是很占用时间的,所以尽可能的减少Graphics函数的调用! ·尽可能的使用SetClip()来减少绘图区域,相对于SetClip(),drawImage()所花的时间会更可观! ·尽可能的将变量定义在循环以外! ·尽最大可能的进行对需要的数据进行预先计算并将结果保存在缓冲里! ·String类很容易产生垃圾内存,尽可能的使用StringBuffer代替String或用final static来定义之! ·假设是不被接受的,一切要以真机为据! ·尽量使用static final修饰函数,而避免synchronized修饰符! ·对于频繁调用的函数要使用尽可能少的参数! ·尽可能的不使用函数调用! ·尽可能的使用<<和>>来代替*和/! ·使用位操作来代替%运算! ·与0比较比与其他数值比较快! ·数组存取比C语言慢,尽可能不在循环中存取数组! ·局部变量比其他类型的变量运算要快! ·在switch()中尽量使用连续的小数值判断! ·尽量使用乘法而不使用除法! ·尽量使用已有算法!  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |