根据上节目标? J2ME中的Graphcis类函数是直接操作Screen,是节中算法慢的主要原因。为了提高的它的效率,最好的做法就是只需要一次就可以完成全部汉字的绘制。这样就即可以将函数的量级从o(n)降到o(1),同时可以是平均绘制时间降低下来。现在问题的关键来了,我们如何才能将汉字一次性的绘制出来???
?
既然设计到一次性绘制问题,中间肯定少不了先将其绘制到缓存Image对象中。然后再将其直接绘制到屏幕即可!
?
现在的问题就是如何在这个缓存区中绘制这些汉字??难道我们还是其缓存的Image对象的Graphcis画笔,g.draw*** 将其绘制上去吗??? 要是这样的话我们不就是又回到“原点”??? 这里是决定不能g.draw***方法,将汉字一笔一划的绘制上去!!!
?
现在我们真的需要换一个思路!!!
?
我现在换一种问法, 我们真的没有办法将我们的汉字字形直接映射到Image对象上吗??
?
我们还是先看看J2ME的关于Graphics?类的api文档!! 在其中我找到这个函数!!
?
?
我们可以现将字形映射到数组吗??最后调用这个函数绘制出来吗??
?
当然可以,代码如下!!
?
void drawFont(Graphics g) { g.setColor(0xffffff); long time1 = System.currentTimeMillis(); // 64是从游戏引擎的角度,通常在一个屏幕对话中,一般出现的字个数都是在64个左右。 for (int i = 0; i < 64; i++) drawmat(song16, g, 16, 10 + (i % 8) * 16, 20 + (i / 8) * 16, 0xFFFFFFFF); long time2 = System.currentTimeMillis(); long dtime = (time2 - time1) / 16; g.setFont(Font.getDefaultFont()); g.drawString("平均时间:" + String.valueOf(dtime), 150, 100, Graphics.TOP | Graphics.LEFT); } void drawmat(char[] mat, Graphics g, int matsize, int x, int y, int color) /* 依次:字模指针、点阵大小、起始坐标(x,y)、颜色 */ { int curAdd = 0,matIndex = 0; int ii, iii, iiii, n; int[] rgb = new int[matsize * matsize]; n = ((matsize - 1) / 8) + 1; for (ii = 0; ii < matsize; ii++) { // 按照一个字节进行解析 for (iii = 0; iii < n; iii++) { matIndex = n * ii + iii; for (iiii = 0; iiii < 8 && iii * 8 + iiii < matsize; iiii++) { /* 测试为1的位则显示 */ if (!((mat[matIndex] & (0x80 >> iiii)) == 0)){ rgb[curAdd] = color; }else{ rgb[curAdd] = 0x00; } curAdd++; } } } drawFontShape(g, rgb, 0, matsize, x, y, matsize, matsize); } void drawFontShape(Graphics g, int[] rgbData, int offset, int scanlength, int x, int y, int width, int height) { g.drawRGB(rgbData, offset, scanlength, x, y, width, height, true); }
?
?上述代码我重写了代码! 测试截图
?
?
?
调成120个字测试结果
?
?基本上是o(1)量级!!