首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2ME开发 >

J2me 游戏点阵字库发动机(三)之字体绘制改进算法

2012-07-15 
J2me 游戏点阵字库引擎(三)之字体绘制改进算法根据上节目标? J2ME中的Graphcis类函数是直接操作Screen,是

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

根据上节目标? J2ME中的Graphcis类函数是直接操作Screen,是节中算法慢的主要原因。为了提高的它的效率,最好的做法就是只需要一次就可以完成全部汉字的绘制。这样就即可以将函数的量级从o(n)降到o(1),同时可以是平均绘制时间降低下来。现在问题的关键来了,我们如何才能将汉字一次性的绘制出来???

?

既然设计到一次性绘制问题,中间肯定少不了先将其绘制到缓存Image对象中。然后再将其直接绘制到屏幕即可!

?

现在的问题就是如何在这个缓存区中绘制这些汉字??难道我们还是其缓存的Image对象的Graphcis画笔,g.draw*** 将其绘制上去吗??? 要是这样的话我们不就是又回到“原点”??? 这里是决定不能g.draw***方法,将汉字一笔一划的绘制上去!!!

?

现在我们真的需要换一个思路!!!

?

我现在换一种问法, 我们真的没有办法将我们的汉字字形直接映射到Image对象上吗??

?

我们还是先看看J2ME的关于Graphics?类的api文档!! 在其中我找到这个函数!!

?

?J2me 游戏点阵字库发动机(三)之字体绘制改进算法

我们可以现将字形映射到数组吗??最后调用这个函数绘制出来吗??

?

当然可以,代码如下!!

?

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);}

?

?上述代码我重写了代码! 测试截图

?

?J2me 游戏点阵字库发动机(三)之字体绘制改进算法

?

调成120个字测试结果

J2me 游戏点阵字库发动机(三)之字体绘制改进算法

?

?基本上是o(1)量级!!

热点排行