如何優化?
知道了在那裡優化,但如何進行優化呢?我們知道大部分的運算時間被花在了繪圖函數上,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()中盡量使用連續的小數值判斷!