读书人

J2me 游戏点阵字库发动机(二)字体绘

发布时间: 2012-07-26 12:01:08 作者: rapoo

J2me 游戏点阵字库引擎(二)字体绘制函数分析

为了突出本节的主题,我将一节中的代码进行了删减!通过计算时间差来评估绘制函数用到的时间。

import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.Graphics;class FontCanvas extends Canvas {public FontCanvas() {super();}protected void paint(Graphics g) {g.setColor(0x0);g.fillRect(0, 0, this.getWidth(), this.getHeight());drawFont(g);}void drawFont(Graphics g) {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, 0xFFFFFF);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 i, j, k, n;n = (matsize - 1) / 8 + 1;for (j = 0; j < matsize; j++) {for (i = 0; i < n; i++) {for (k = 0; k < 8; k++) {if (!((mat[j * n + i] & (0x80 >> k)) == 0)) /* 测试为1的位则显示 */{g.setColor(color);g.drawLine(x + i * 8 + k, y + j, x + i * 8 + k, y + j);}}}}}char song16[] = {/* 以下是 '宋' 的 16点阵宋体 字模,32 byte */0x02, 0x00, 0x01, 0x00, 0x7F, 0xFE, 0x41, 0x04, 0x81, 0x08, 0x01, 0x00,0x7F, 0xFC, 0x03, 0x80, 0x05, 0x80, 0x05, 0x40, 0x09, 0x20, 0x11,0x10, 0x21, 0x0E, 0x41, 0x04, 0x01, 0x00, 0x00, 0x00, };}

?上述代码的运行结果,如下截图:

J2me 游戏点阵字库发动机(二)字体绘制函数分析?

?

分析

??1,上述的平均时间是20ms,64个字就是 20 * 64 = 1280ms。兄弟姐妹超过一秒了!!!! 通常在游戏中,刷新率在60左右是流畅的,现在光字体绘制就需要一分钟,这个在游戏中明显是不行的!

? 2,并且这个算法是o(n)量级的,及会随着绘制的字数增长,绘制时间成线性增长。这个在游戏开发中是致命的弱点。

?

目标

?1,设计在o(1)量级的算法。

?2,让平均时间控制在15ms。

?

?

?

?

?

?

读书人网 >J2ME开发

热点推荐