图形用户接口实验报告_第1页
图形用户接口实验报告_第2页
图形用户接口实验报告_第3页
图形用户接口实验报告_第4页
图形用户接口实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PXA27OS8入式实验报告2101180032一、实验目的1 了解嵌入式系统图形界面的基本编程方法2.学习图形库的制作二、实验系统EELIOD嵌入式开发平台,包括16位TFT LCD,分辨率为640*480。三、实验内容在Frame Buffer基础上实现画点/线/圆和BMP医像显示,并制作成相应的动态库1 .FrameBufferFrameBuffer (帧缓冲区)是从2.2.xx内核开始出现的一种驱动程序接口,这种接口将 显示设备抽象化,使应用程序无须涉及底层硬件。FrameBuffer通过/dev/fb0等设备节点进 行访问。将FrameBuffer映射到进程空间之后,可以直接进行读写

2、操作,此时显示屏上的像 素单元按一定的顺序与FrameEuffer中的数据一一对应。对FrameBuffer的写操作在被 FrameBuffer和显示屏之间的中间件提取、处理后显示到显示屏上。实验系统中的这一中间件 就是集成在处理器内部的LCD控制器。FrameBuffer的大小由显示屏的位深、分辨率、显示模式决定。单屏模式下,其大小为 FrameBufferSize=Width*Height*Bits_per_pixel/8 (bytes)。实验系统中,LCD的分辨为640*480,位深亦16, RGB组合为565格式。清空屏幕可执行:"dd if=/dev/zero of=/de

3、v/fb0 bs=1280 count=480/zo 显示 文件temp到屏幕上可执行:"cat temp >/dev/fbO"。将屏幕内容保存到文件temp上可 执行:"cp /dev/fb0 temp"。应用程序中,操作FrameBuffer的一般步骤如下:(1) 打开/dev/fb设备文件;(2) 用ioctl函数获取显示屏的位深、分辨率等信息,两个重要的结构体类型是 fb_fix_screeninfo 禾Q fb_var_screeninfo :(3) 用mmap函数将FrameBuffer映射到用户空间;(4) 应用程序读写FrameBu

4、ffer,进行绘图和图片显示等;(5) 解除映射,关闭/dev/fb设备文件。相应的关键语句如下:"fd = open ( “/dev/fb”,O_RDWR ); ”“ioctl(fd, FBIOGET.FSCREENINFO, &finfo);"“ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);""screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;" "fbp =(char *) mmap (0, screen

5、size, PROT READ | PROT WRITE, MAP_SHARED, fd, 0);""munmap(fbp,screensize);"若映射成功,mmap()函数返回一段大小为screensize的连续内存空间的首地址。般情况下,finfo.line_length=vinfo.xres*vinfo.bits_per_pixel/80 如果不等, 将无法正常显示图形和图像。此时screensize应按finfo.line_length*vinfo.yres计算, 下面的 offset 应按(y*finfoine_length+x*vinfo.bits

6、_per_pixel/8)计算。实验中将vinofo.xres. vinfo.bits_per_pixel当作已知常竅,以避免调用子函数时非 必要的参数传递。在gui macro.h头文祚中宏定义XRES为640、YRES为480、BPP 为 16. OFF_COL 为(BPP/2)、OFF_ROW 为(XRES*EPP/8). SCREENSIZE 为 (XRES*YRES*BPP/8)O这样可能不疝于程序的可移植性,但初次运行时.也只需要改动前 三个宏定义。配置内核时,在 Multimedia Capabilities Port drivers > GUI to be support

7、ed选项下若选择Tinyx, LCD会在1分钟后休眠。若选择Qtopia t LCD在 10分钟后休眠。前者可通过添加建立触屏设备唤醒。2 画点显示器的坐标系方向一般如右图所示,开发板上的lcd坐: 标系方向也这样。这与人们从左到右、从上到下的阅读习惯一致。所画点的坐标(x, y)与相对于FrameBuffer首地址的偏移量offset一对应,计算公式为 offset=(y*vinfo.xres+x)*vinfo.bits_per_pixel/8o若顔色值不是565的RGB格式,需右4攵转化为RGB顔色 |模型,再取各分量的高位进行组合。16位的颜色值color按地 n-D址高低顺序写到Fra

8、meBuffer ±o主要程序如下,其中"(unsigned char *)"和"&0xff"可省略不写。offset=(y*XRES+x)*OFF_COL;水(unsigned char *)(fbp+offset)=color&0xff; (unsigned char *)(fbp+offset+l)=(color>>8)&0xff;也可以写作:"*(unsigned short int *)(fbp + offset)=color;n或"lseek(fbp,offset,SEEK_S

9、ET);write(fbp,&color,2);"。至于孰优孰劣,未做探究。3 画线显示器上的像素单元是离散的,无法真正显示出数学上所定义的点、线、圆等几何图形,实 际上显示的是若干在视觉上逼近真实图形的点。以下方法画出的线段所组成的点数为线段与其夹角较小的坐标轴上的坐标差加1。比如端点 坐标为(0, 0丿,(4, 17)的线段,斜率大于1,所画的点数为:17+1 = 18。对于斜率k=0, oo, ±1的线段,可以通过简单的坐标递增(减)画点画岀来。对于k等于 其他值旳直线,我在网上捜索到Bresenham于1965年提出的直线生成算法。下血的内容是 对该算法的描

10、述和改进。设线段斜率为 0vkvl,端点坐标为(xi, yi) , (y2) , Xi <Xz, yi <y2, iddy=y?y】,dx=X2 Xi,直线方程为k*x+by=0。画岀来的点数为dx+1。兎画価点(x» yi ),由Ovkvl ,知下一个点必为(Xi+1 , *丿或(x+l , 0+1 ) o根据这两点的中点M(X1 + 1,0+1/2 )与直线的相对位置来做取舍。记 d=k*x+b_y, M点坐标代入d,得d=k*(xi + l)+b (yi + l/2)=k*Xx+byi+kl/2=k1/2。若dvO,则点M在直线上方,取(x、+l若d>0,则点

11、M在直线下方,取(x、+l , w+1 ) °这里起作用的只是d的符号,k=dy/dx,可以给d乘2*dx ( >0 ),重新定义 d=2*dy*x+2*dx*(by)o 则上面 d 的初值写为 d=2*dy-dx。参照下图,对于一般情况,假设现在已经画出点(i,j ),则下一个点必为(i+1 ,j )或 (i+1 ,j+l )。用于判断第(i+1)个点的 cL=2*dy*(i+l)+2*dx*b-0+l/2) e 若 dEvO,则取(i+1 ,j ),若 dl>0,则取(i+1 ,j+l )。若取(i+1 ,j),则第(i+1)个点必为(i+2,j)或(i+2 ,j+l

12、 ),dH2= 2*dy*(i+2)+2*dx*b(j +1 /2)=dj初 + 2*dy o若取(i+1 ,j+l).则第(i+2)个点必为(i+2,j+l )或(i+2,j+2), d2=2水dy*(i+2)+2*dx*b-(j + l + l/2)=d"+2*(dy-dx)。依上迭代.可以仅由整数加法和乘法运算求得相应的纵坐标对d=0的情况,两个点都任 选其一。程序示意如下:dy=y2-yl; dx=x2-xl; d=2*dy-dx;for(x=xl/y=yl ;xv=x2;x+ + )drawdot(xzy);if(d>0)y+; d+ = 2*(dy-dx);else

13、d+=2*dy;另外,在网上査到意在利用线段的对称性减少比较次数的改进算法,即从线段两端向线段中 点同时画点。原算法分为奇数点和偶数点进行讨论。我认为无须如此烦琐,直接 以”xv=(xl+x2)/2作为循环条件.这样在奇数点情况下只是对中点一个点画了两次。此外,在网上看到有多篇论文指岀可进一步优化Bresenham算法,对特定斜率范围的直 线可一次画出更多的点。比如对斜率为0vkv 1的直线,斜率k越接近于0.可一次确定的点数 越多。从图形上直观理解,就是直线与坐标轴的夹角越小时,在同一行(列)的点越多。我认为 这种优化的应用范围有限.为避免程序过于凌乱不如不用。以上是对斜率为0vkv 1的直

14、线画法。对其他斜率范围的直线,只需改变坐标的符号或/和 顺序,就可以套用以上程序画出。我自己认为有效的一种优化是避免重复的计算偏移量。结合程序,说明如下。入口参数为线段两端点的坐标和颜色值。offset=(y*XRES+x)*OFF_COLe 可见 OFF_COL、OFF_ROW 分别表示换行、 换列时offset的增量。因为所画的下一个点总是当前点周围8个点之一,这样,计算出端点的 偏移量后,总可以用当前的offset与OFF_COL和OFF_ROW的组合加减来画点。此后, 坐标不再直接用到。对不同斜率范围(kHO, oo, ±1)的直线,程序中令(1) x1 vx2, dp=x2

15、xl, dq=y2yl;(2) 数组offset2存放从两端开始所画点的偏移量,令offsetO对应于较小的纵坐标, offsetl对应于较大的纵坐标,也就是令初值满足offsetO < offsetl;(3) d_neg. d_pos分别是d在d<0, d>0时的增量;(4) off_neg, off_pos 分别是 offset 在 d<0, d>0 时的增量,offset0总是 增量,offset! 1总是“一"增量。画点循环中采用了前面提到的对称画法。进入循环后,dp=x2-xl, dq=y2yl不再有用,将dp拿来作为循环的判断变量。令dp等于

16、线段与其夹角较小的坐标轴上的端点坐标差的 一半,循环结构为:while (dp >=0) dp-;比如k>l时,点数为y2-yl +1。令dp=(y2-yl)/2=dq/2。这样,所画的点数为: y2 yl为偶数时.共有奇数个点,(dp+l)*2=y2yl + 2.中点多画一次;或y2yl为奇 数时,共有偶数个点,(dp+l)*2=y2-yl +1。进入画点循环前相关变量的初始化和循环条件如下表所示。其中"y0栏表示offset0 所对应的(纵)坐标。对每一条kHO, oo, ±1的线段,经过两次判断,即确定了dx d_neg% d_posx offset, o

17、ff neg. off_posN dp 五个量的(初)值。之后进入统一的 循环结构。dqky0d initdAdAoffsetloop init+l<k dq>dpyi2*dpdq<02*dpOFF ROWdq/2>02*(dpdq)OFF COL +OFF ROW0<k<ldq<dp2*dqdp<02*dqOFF COLdp/2>02*(dqdp)OFF COL +OFF ROWk< 1|dq|>dpy22 水 dp+dq<02*dpOFF ROW(-dq)/2>02*(dp+dq)OFF ROW -OFF COL

18、-l<k<0|dq|vdp-2*dqdp<0-2*dq-OFF COLdp/2>0-2*(dq+dp)OFF ROW -OFF_COL从代码上看,给d. d_neg. d_pos赋初值时还可以再化简。比如k>l时.先得到 d_neg=2*dp,然后 d=d_neg-jq, d_pos=d-dq,减少了两次乘法(移位)运算。循环示意如下: while(dp> = 0) dp-; draw_2_dots(offset);if(d<0) d+=d_neg; offset0 +=offneg; offset 1 -=off_neg; else d+=d_pos

19、; offset0 +=offpos; offset l +=ofpos; " 一 画k=0, oo, ±1的线段的程序,不赘述。 经实验,上述程序可以画岀任意斜率的直线。4画圆我同样在网上査找到相关算法,程序中采用了中点画圆法,与上述Bresenham直线生成算法相似。圆关于圆心中心对称。圆心位于坐标系原点的圆.关于x轴、y轴、y=x, y=-x对称,如下图所示。这样只需 要确定n/2 < 0 < n圆弧上的点.就可以利用对称性画出 整个圆。设圆方程为x2+y2R2=0, d=x2+y2R2。先画岀第一个点(0,R)。下一个点必为 (1 , R)或(1 , R

20、-1 )之一,因为此段圆弧上的切线斜率满足一 1三k三0。中点M ( 11/2)代入d,以判断与圆的相对位置关系。d=l+(R1/2)2R2=5/4R.若dvO,则点M在圆内,此时点(1, R)离圆更近, 取之。若d>0 ,则点M在圆外,点(1 ,R-1 )离圆更近,取之。考虑一般情况,若已确定点(i,j),则下一点必为(i+1 ,j)或(i+1 ,j 1 ), 第(i+1)个点的dQ7=(i+l)2+(j-l/2)2-R2。若d“ivO,则取点(i+1 ,j ),再下一个点必为(i+2,j )或(i+2,j-l ) ,d2=(i+2)2+(j-l/2)2-R2=dD+ 2*i+3

21、76;若d“i>0,则取点(i +1 J -1),再下一个点必为(i +2,j -1 )或(j +2 ,j -2 ) , d"2=(i+2)2+(j-l/2)2-R2=dD+2*(i-j)+5。依上迭代,可以仅由整数加法和乘法运算求得相应的纵坐标,对d=0的情况,两个点都任 选其一。循环执行的条件为x<yo可能每个象限都有一个点被画了两次。中点画圆法得到的圆的 点数约为8*R/V2。上面推出d的初值为5/4-K可将d的初值近似为d'= 1-R ,往后d都比d小1/4 , 但只会在d=l/4和0时影响正负判断。当d=l/4> 0时,d' = 0,所以应

22、将d=0的情况并 入d>0的情况"当d=0时,d' = -l/4<0 ,因为本来就允许两点任选其一,所以没有实质影 响。再联想实际情况,一般不会画一个半径为一个像素单元长度的圆。这种情况其实是一个点, 如果需要可以在程序中加入相应的条件分支。主要程序示意如下:for(x=0,y=R/d=l-R;x<=y;x+)drawSdotsfx);if(d<0)d+ = 2*x+3;elsed+=2*(x-y)+5;y-;我同样试图通过避免重复的计算偏移量来提高画圆的速度。结合程序,说明如下。设所画圆的方程为(x+xo)2 + (y+yo)2R2=0。定义数组of

23、fset8表示8段圆弧上所 画点的偏移量。如下图所示。offset0、offset7的初值对应于点(xo, yo+R ), offset 1 、offset2的初值对应于点(xo+R, yo ) , offset3、 offset4的初值对应于点(xo, yo_R) , offset5、offset6的初值对应于点 (xo-R, yo )。程序开始先取其中4个不同的偏移量画出以上四个点。画圆循环內各偏移量的 增量关系如下表所示,“dvO"和M>0z,栏下的箭头表示offsetO对应点的走向。offsetAdv0:0Td>0:00+OFF COL+OFF COL-OFF R

24、OW7-OFF COL-OFF COL-OFF ROW1+OFF ROW+OFF ROW-OFF COL2-OFF ROW-OFF ROW-OFF COL3+OFF COL+OFF COL+OFF ROW4-OFF COL-OFF COL+OFF ROW5-OFF ROW-OFF ROW+OFF COL6+OFF ROW+OFF ROW+OFF COL循环结构仍可套用上面的程序,因为不涉及用坐标来计算偏移量。为避免画完最后8个点后, 仍对各个偏移量做增最加减运算,对上面的程序做了细微的改动。程序示意如下。/draw the first 4 dots,and x=l/y=4/d=4-r noww

25、hile(l)draw_8_dots(offset);if(d<0)if(x<=y)d+=2*x+3; x+; process neg(offset); else break;elseif(x<y)d+=2*(x-y) + 5;x+;y; process pos(offset); else bi eak;实验中分别让改进前后的画圆程序画颜色、半径、个数、位置分布相同的圆,通过在程序中 加入gettimeofday()函数对画圆程序段进行计时,多次运行,改进后的画圆程序所花时间略 短。下面的数据是我在12月7号补测的数据。(在记录纸上我写的是未做记录。)所画圆半径为50,圆心从

26、(50, 50 )开始每次沿x轴或y轴移动10个单位,圆的总个数 为:l+(640-50-10)-50/10*l+(480-50-10)-50/10=2052e 颜色值 为"Oxaaaa"。gettimeofdayO函数放在画圆循环开始前和结束后,每运行一次程序,清除 屏幕。对两个画圆子函数做了细微的改动,参数统一为指向FrameBuffer首地址的指针、圆 心坐标、半径和颜色值,都不调用其他函数,对数组offset,不用变量作为索引,将循环展开。 测量的时间见下表:(单位:s)。参数第一次第二次第三次平均值比值offset0.1255420.1255240.1255050

27、.12552483.36%x, y0.1504470.1507970.1504760.150573gettimeofday()函数得到的计时结果并不表示精确的程序运行时间,因为系统并不一直在运行一个程序。但两个程序的运行时间在秒量级.有明显的时间差.仍可说明效率略有提高。也 可以使用time命令等其他方式计时(time命令需要在配置BusyBox时选中)。在专业的程 序性能分析领域,常用的工具有groof和Intel的VTune。以上程序画的是圆周。如果需要画填充颜色的圆,可以在每次画岀圆上8个点时,调用前面 的画线函数,以连线平行于x轴或y轴的两点为端点画线。以平行y轴为例,先画(xo, y

28、o+R )的连线。套用上面的变量,对于x>0部分的半圆, 每次x自增1,连接(xo+x, yo-by );当y有变化时,连接(xo+y, yo+x ) °对于 xvO部分的半圆,画法相同。对上面画点/线/圆程序做一总的补充说明:(1) 程序中需要将坐标限定在显示范围内。一个原因是当offsetvO或 offset>SCREENSIZE-1时,将运行出错。另一个原因是offset的表达式为 offset=(y*XRES+x)*OFF_COL,在一定范围内,允许xvO, x>XRES1, y<0, 或y>YRES 1,而计算岀来的offset满足0三offs

29、et三SCREENSIZE1,但所画点 位置并不是预期的。(2) 将画点/线/圆程序作为子函数时,入口参数中设-char *fbpO主函数可以向子函数传 递指向FrameBuffer首地址的指针变量,也可以在该参数位置写“NULU,表示由子函数来 打开FramebBuffer设备,并在子函数结束时将其关闭。这样便于主函数的调用,避免重复地 打开.关闭fb。(3) 画点/线/圆子函数以一个顔色值变量为参数,而不以RGB三个颜色分量作为参数。4 绘制特定的动态轨迹曲线调用上面的画点、画线、画圆程序,画岀一过定点的定长线段一端沿圆周运动,另一端的运 动轨迹。画运动轨迹的程序说明如下:(1) 实现动态

30、扫描效果的基本思路是:每隔给定的延时,上一次所画线段染成黑色,线段在 圆上的一端移动一格计算出另一端的坐标,存起来.重画圆,画岀所有已计算岀来的轨迹坐标 点.画当前的线段。(2) 先由中点画圆法得到圆上各点坐标,第一轮循环沿圆扫描得到完整的轨迹坐标。此后的 循环不再需要计算轨迹坐标。(3) 轨迹坐标根据线段的定长性质计算。坐标的表达式中含l/V(l+k2),采用网上看到的 快速平方根取反函数InvSqrt(x)来计算,据说它比(float) 1.0/sqrt(x)快上四倍。它的快速 在于利用一个神奇的常数,进行减法和移位操作后即可得到一个相当接近于1/Vx的数,作为接 下来牛顿迭代的估算初值。

31、该函数早在1995年之前被应用,作者不详。但在多核平台上,原 InvSqrt()函数已远不如专门的库函数高效。为使画面更为直观,程序中添加了另外几个图形.在每次循环里对所有图形都进行刷新。实 际上应该可以只进行局部刷新,以提嵩效率。比如,在画一动点时,将动点将要经过的点的颜色 存起来,动点移走后再写回去。但在有若干个运动图形的情况下,就没有这么简单了。5.BMP图像显示BMP全称EitMap.文件格式为:位图文件头+位图信息头(+颜色表)+位图数据。如 下表所示,单位为字节。0,1256910 13Type(bf)Size(Reserved)OffBits14 1718 2122 2526,2

32、728,2930 33(bi)SizeWidthHeightPlanesBitCountCompression34 3738 4142 4546 4950-53SizeimageXPelsPerMeterXPelsPerMeterClrUsedClrlmportan t前14个字节表示位图文件头。BMP文件的第X 2个字节为0x42、0x4d.分别表示 ASCII码的和M“; (bf)Size表示整个文件的大小;OffBits表示文件头到位图数据的 偏移字节数。位图信息头一般是接下来的40个字节。(bi)Size表示信息头的大小; Width. Height表示位图的宽度和高度,以像素为单位;

33、BitCount表示每个像素所占位数, 即位深;Compression表示压缩类型,为0时表示无压缩。24位BMP图的OffBits值为54,表示从第54个字节开始为位图数据,无颜色表。位 深为1, 4, 8时,需要颜色表,表中对应有2, (<)16, (<)256个表项(一个特定的图像可 能不需要使用所有的颜色)。每个表项表示一种顔色.由4个字节组成.从低地址到高地址依次 表示蓝色分量.绿色分量、红色分量、保留字节。此时位图数据区存放的是一串颜色表的索引, 这样可以减小位图文件的大小。位深为16时,颜色表被用于存放掩码的8个字节所替代。从低 地址到高地址每两个字节依次为蓝色分量、

34、绿色分量、红色分量的掩码,最后两个字节为0。 从掩码可看岀RGB组合为565格式还是555格式。对于无压缩的BMP文件,一般位图数据区按图像从左到右、从下到上的扫描顺序存储每个 像素的数据。若读岀的Height为负.表示按从上到下的顺序。Windows规定BMP图像一 个扫描行的字节数必须为4的倍数,不足4的倍数则补0对齐,因此一个扫描行所占的真实字节 数为:(Width*EitCount/8 + 3)&(3)。实验中编写了显示24位无压缩、Width三640的BMP图像的程序.不考虑Height为 负和Width不为4的倍数的情况。主要步骤为:读取文件,判断是否满足上述要求一转化为

35、16 位 RGB>写到 FrameBuffer 上。BMP文件较大,显示的速度受限于经由网络从主机读取文件到目标机上的速度。为缩短 LCD±的刷新过程,获得较好的显示效果,应先读取整个文件,将24位RGB转化为16位 RGB,再写到FrameBuffer ±o程序中用mmap函数将BMP文件映射到内存上。对位图 文件头和信息头.可以通过定义相关的结构体读取(可能需要编译器取消结构体的优化对齐), 也可以单纯按字节顺序读取。为了不占用更多的内存,将转化后的数据覆盖在原来的位图数据区 上.如下表所示(从位图数据区第一个字节开始)。此时mmap函数的flags参数必须为 M

36、AP_PRIVATE,否则写操作将被写回文件,而open函数的flags参数可为 O RDONLY或O RDWRo mmap函数要求其prot参数与open函数的flags参数不能 冲気BeforeIAfterxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxxxxxXKXXXxxxxxxxxxxxxxxxx将16位RGB格式的位图格式写到FrameBuffer上时.使用memcpy函数一次复制 “一行”比起一次写一个字节效率更高,原因在于memcpy函数中做了四字节对齐优化,可以一 次复制四个字

37、节。这里每一行图像数据和FrameBuffer中的下一扫描行的首地址偏移量也无 须毎次田坐标重新i+篁 毎次出皐白增_个堂畐程序中实现了 Width<640的BMP图减向下滚动的显示效果。所需显示的高度宏定义为 DISPHEIGHT,程序中设为480。主要步骤是从最底行开始,将原来写在上一行的数据复制 到下一行上,在最高的一行写上新的数据。按类似步骤可以实现自下而上滚动和左右滚动的效果。程序入口参数包括文件路径和图像左上角在LCD上的显示坐标,当不满足图像显示区域在 LCD坐标范围内时.左上角置于原点。程序中有多处当不满足预设条件时结束程序的语句.此 时需先解除内存映射和关闭文件。程序运

38、行结果。第一次显示某张图片时,在显示前有较长的时间花在读取文件上.而刷新屏 幕的过程基本上看不出来。之后显示同一张图片时则快得多,因为相关数据仍逗留在内存中,若 显示的图片过多时.部分数据会被刷掉。滚动显示长图片时也基本上看不出刷新的过程,但远不 如触屏手机上的滚动显示流畅。6制作动态库制作动态库.编译链接动态库的主程序所执行的命令分别为:ami-linux-gcc -o libdraw.so subfunl.c subfun2.c shared arm-linux-gcc -o FUN FUN.c L ./-ldraw-shared选项表示生成动态库,-L ./-ldraw表示当前目录作为第

39、一个寻找库文件的目录。 编译时动态库并没有被编译进目标代码中,程序运行时才申请并调用动态库的相关函数.因 此运行环境中必须提供相应的库。执行前还需要修改环境变量LD_LIBRARY_PATH,以指定 査找动态库时除默认路径之外的其他途径,实验中即libdraw.so所在的目录。直接运行,提示找不到libgcc_s.so.lo该文件可在编译器所在目录下查找到,复制到挂载 目录,再复制到目标机文件系统的/libS录,即可正常运行。四、实验总结最初只是在网上搜索是否有高效的画图算法,后来才知道这是计算机图形学的冰山一角,这 其中有不少算法是在开发游戏的3D引擎时研究出来的。程序采用了经典的Brese

40、nham直线 生成算法和中点画圆法.但画出来的图形或多或少会呈现锯齿状。在计算机图形学中称之为"走 样S解决方法是在硬件上提高显示器的分辨率以及在软件上采用''反走样算法。在画线和画圆程序中计算offset=(y*XRES+x)*OFF_COL时,我试图通过用一两次 加减来替代一次加法和两次乘法(也可能是一次加法.一次乘;疥口一次移位,因为 OFF_COL=2),以减少运算量。测量数据表明是可行的,但仅仅缩短了约16%的运行时间。 实验*没有试验arm-linux-gcc优化选项的效果。实际上真正的优化工作基本上已经由函数库 和编译器的编写者做好。相比于人肉优化代码的

41、可读性更为重要。我曾试图显示正序/倒序、1/4/8/16/24/32位.任意大小的BMP图像,但没有实现。其 中一个困难在于要支持诸多类型的BMP图像.程序中有太多的判断语句。如果对每种类型的文 件都写一个子函数,那整个程序会很庞大。如果在一个统一的大循环里面,每次都对其类型做判 断.那效率会很低下。我的设想是使用统一的循环但经过第一次循环后,可以将没有必要再执 行的判断语句移除.而只保留相应判断条件下有用的语句。图像放缩也很麻烦。对于如何加快图像的显示,我一开始的想法仍然是避免反复计算offseto我也在自己的电脑 上尝试了对(unsigned int *)(fbp+offset)"賦值是可以的。之后又试图在网上寻找最快的 读取文件的方法,中间碰巧看见了关于memcpy效率的网页,才知道memcpy函数高效得多。 memcpy函数的高效在于它做了 4字节对齐优化(PXA270数据总线宽度为32位),对齐 后可一次复制4字节

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论