日期:2014-05-20  浏览次数:20692 次

J2me 游戏点阵字库引擎(三)之字体绘制改进算法

根据上节目标? 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)量级!!