有没有种简单的方法,cgcontext绘制文本反走样文本

基于几何的实时绘制反走样--《浙江大学》2015年博士论文
基于几何的实时绘制反走样
【摘要】:走样是由于对连续信息进行离散采样、存储或表示等所导致的一种信号失真现象,反走样是计算机图形学研究的基本问题之一。图形反走样可以有效地重建出几何、纹理、运动等各种细节,从而提高绘制图形和生成动画的质量,帮助用户获得更好的视觉体验。因此,反走样一直是计算机图形学研究中的重要课题,在三维计算机游戏、计算机动画、虚拟现实、影视后期制作等领域具有广泛和重要的应用。随着各种图形应用对绘制效果和绘制性能要求的不断提高,延迟着色技术正成为实时绘制中的主流方法。而传统的屏幕反走样技术与延迟着色技术不兼容,因此面向延迟着色的后期处理反走样算法成为当前图形反走样的研究热点。该类算法利用场景的光栅化几何或着色信息进行反走样,避免了传统反走样方法需要依赖于原始几何信息的不足。如何高效存储和利用几何缓存信息,实现接近超采样的反走样效果,是该类算法中一个重要挑战。阴影可以反映场景中物体的几何属性和相对位置,是真实感图形绘制中的重要组成之一。在实时绘制中,阴影图算法因其简单、高效而被广泛使用。但是,由于阴影图只是记录了离散的场景深度信息,在实际应用中存在着严重的走样现象。如何高效、高质量地生成反走样阴影,一直是阴影图算法中的一个重要研究问题。本文针对实时绘制领域中延迟着色和阴影图算法中存在的各种走样问题,进行了深入的分析和研究,提出了一系列基于几何的反走样创新算法,具体如下:在面向延迟着色的后处理反走样方面,本文首先提出了一种基于三角形几何的子像素重建反走样算法。作为子像素反走样的几何依据,算法将像素的覆盖三角形与周围子像素的位置关系存储为屏幕分辨率大小的位图,大大降低了算法所需的存储空间,并提高了确定子像素着色信息的准确性。对于高频率几何区域,算法使用形态学的反走样方法作为补充。该算法具有良好的兼容性和扩展性,巧妙地通过紧凑的几何缓存实现高质量的图形反走样。针对现有各种后处理反走样算法适用性的局限,本文提出了一种统一的后期处理反走样算法。该算法既能通过子像素级几何对几何边界进行高质量的反走样重建,又能根据着色信息对颜色纹理走样进行形态学滤波。此外,我们在屏幕空间滤波的基础上引入了基于重投影反走样方法,克服了两类后处理反走样算法所导致的像素之间过渡不平滑问题,并解决了动态场景中可能出现的闪烁问题。与现有后期处理反走样算法往往只能处理单一类型的走样相比,上述算法可以在统一的框架下解决不同类型的走样问题。在阴影图反走样算法方面,本文首先提出了一种基于三角形几何重建的阴影图算法。在该算法中,阴影图采用场景的原始三角形表示和记录阴影遮挡物信息,从而可以准确重构出遮挡物深度,避免阴影走样和深度偏移问题;为了降低三角形几何的冗余存储,提出了一种基于GPU的几何缓存压缩方法;最后使用一种打包式阴影计算方法进一步降低访存开销。为了解决几何信息不完整所造成的阴影瑕疵,本文使用线性外插估计遮挡物深度。作为一种基于几何的阴影图算法,该算法能够高效地生成高质量阴影。从离散信号重构的角度出发,本文提出了一种高效的线性阴影图算法。该算法对基于点采样的阴影图对进行线性重构,实现对阴影图的预滤波。为了保证阴影轮廓的光滑性,算法采用了阴影轮廓线重建方法。该算法可以以接近原始阴影图算法的性能实现阴影的反走样。此外,线性阴影图算法可以与任何基于均匀点采样的阴影图反走样算法相结合,如扭曲算法、拟合算法、z-分割算法、自适应分割算法等,显著提升这些反走样算法的阴影生成质量和效率。
【学位授予单位】:浙江大学【学位级别】:博士【学位授予年份】:2015【分类号】:TP391.41
欢迎:、、)
支持CAJ、PDF文件格式
【参考文献】
中国期刊全文数据库
过洁;徐晓旸;潘金贵;;[J];计算机辅助设计与图形学学报;2010年04期
WANG RWU YingQPAN MingHCHEN WHUA W;[J];Science China(Information Sciences);2013年06期
【共引文献】
中国期刊全文数据库
陈纯毅;杨华民;李文辉;蒋振刚;;[J];吉林大学学报(工学版);2012年04期
魏厚明;刘冬香;曹卫群;杨刚;;[J];计算机辅助设计与图形学学报;2011年05期
覃海宁;徐冬;;[J];南宁职业技术学院学报;2011年03期
李建勋;童中翔;刘彦;李成;王超哲;张志波;;[J];哈尔滨工程大学学报;2013年05期
沈笠;杨宝光;冯结青;;[J];计算机辅助设计与图形学学报;2014年03期
张韶华;秦志远;张宝印;;[J];计算机应用研究;2014年08期
叶庆;付讯;贾逆翔;张严辞;;[J];计算机辅助设计与图形学学报;2014年10期
詹华蕊;谢晓尧;景凤宣;;[J];贵州师范大学学报(自然科学版);2012年06期
杨成;唐歌实;李勰;陈光明;;[J];计算机辅助设计与图形学学报;2015年11期
吴婷;程亚奇;张延军;;[J];计算机工程与设计;2011年10期
中国博士学位论文全文数据库
徐晓旸;[D];南京大学;2011年
中国硕士学位论文全文数据库
栗超;[D];燕山大学;2012年
李军;[D];湖南大学;2011年
姚瑾;[D];西北大学;2013年
李娜;[D];中国海洋大学;2014年
【二级参考文献】
中国期刊全文数据库
吴恩华,柳有权;[J];计算机辅助设计与图形学学报;2004年05期
赵乃良;陈艳军;潘志庚;;[J];计算机辅助设计与图形学学报;2006年08期
刘力;马利庄;;[J];计算机辅助设计与图形学学报;2008年04期
薛盖超;吕伟伟;刘学慧;;[J];计算机辅助设计与图形学学报;2009年02期
【相似文献】
中国期刊全文数据库
周国民;卢涤非;张其前;;[J];浙江大学学报(理学版);2007年06期
刘小洲;周石琳;李智勇;;[J];计算机仿真;2008年08期
李恋;雷航;;[J];计算机应用;2009年02期
过洁;徐晓旸;潘金贵;;[J];计算机辅助设计与图形学学报;2010年04期
魏厚明;刘冬香;曹卫群;杨刚;;[J];计算机辅助设计与图形学学报;2011年05期
王珊;;[J];计算机工程与应用;2011年15期
张文晓;唐丽玉;陈崇成;林定;;[J];福州大学学报(自然科学版);2013年05期
章曼;吕伟伟;吴恩华;;[J];计算机辅助设计与图形学学报;2010年01期
陈继国;沈超敏;;[J];计算机工程;2010年22期
何辉;薛典军;张洪瑞;王林飞;骆遥;;[J];物探与化探;2013年05期
中国重要会议论文全文数据库
薛光琦;;[A];中国地质科学院矿床地质研究所文集(27)[C];1994年
刘元琼;雷海乐;赵学森;;[A];第十届中国核靶技术学术交流会摘要集[C];2009年
曹雪峰;万刚;李锋;李科;;[A];第十届中国科协年会论文集(一)[C];2008年
安宁宇;袁春;钟玉琢;;[A];第六届和谐人机环境联合学术会议(HHME2010)、第19届全国多媒体学术会议(NCMT2010)、第6届全国人机交互学术会议(CHCI2010)、第5届全国普适计算学术会议(PCC2010)论文集[C];2010年
陈皓;刘晓平;;[A];全国第19届计算机技术与应用(CACIS)学术会议论文集(下册)[C];2008年
韩志燚;陈建民;刘应征;;[A];第八届全国实验流体力学学术会议论文集[C];2010年
中国重要报纸全文数据库
AOL;[N];中国电脑教育报;2003年
中国博士学位论文全文数据库
杜文俊;[D];浙江大学;2015年
中国硕士学位论文全文数据库
赵构;[D];南京理工大学;2015年
秦严严;[D];长安大学;2015年
殷金;[D];华中师范大学;2011年
孙华利;[D];华中师范大学;2011年
程剑;[D];浙江大学;2005年
唐珂;[D];山东大学;2013年
段琦;[D];上海交通大学;2008年
张静;[D];西南石油大学;2007年
于丽丽;[D];天津大学;2010年
孔祥泉;[D];天津大学;2012年
&快捷付款方式
&订购知网充值卡
400-819-9993(D)2(DELPHI)反走样技术的研究与实现
第一章&& 引 言
1.1研究背景 http://www.paper51.com
光栅图形显示器是目前使用最广泛的图形显示器,因为它具有以下优点:光栅扫描显示器具有固定的刷新顺序,扫描从屏幕的左上角开始,从左到右,从上到下的顺序进行刷新,从而刷新控制部件得以简化,节约了成本。在光栅显示系统中,构成图形的最小图形元素是像素,这样只要计算屏幕上位于给定区域以内的所有像素,并且赋予一定的颜色,就完成了图形的绘制。光栅显示器中的图形由像素构成,而每一个像素又可呈现出多级灰度或不同的颜色值,颜色丰富,显示出来的图形具有更好的视觉效果。光栅扫描显示器是一个画点设备,与图形的复杂度无关,刷新频率固定,因此不会象随机扫描显示器那样出现闪烁现象,人眼看上去更舒服。 内容来自论文无忧网 www.paper51.com
但光栅显示器也有它的缺陷,图形信号是连续的,而光栅显示系统中用来表示图形的却是一个个离散的像素。用离散的像素来表示连续的图形时会出现失真,也就称为走样,如图1.1所示。 paper51.com
paper51.com
图1.1锯齿状边界 copyright paper51.com
光栅显示系统为何会出现走样呢?光栅图形显示器是一个画点设备,被显示的线段、字符、图形及背景色都按像素点一一存储在帧缓冲存储器中。当我们要画一条直线时,它通常不可能完全精确地从一个可编址的像素点画一条直线到另一个可编址的像素点,只可能用尽可能靠近这条直线路径的像素点集来近似地表示这条直线。显然只有画水平线、垂直线时,像素点集在直线路径上的位置才是准确的,其他情况下的直线均或多或少地存在阶梯状(锯齿状)的现象。 http://www.paper51.com
光栅图形的走样现象除了上述锯齿状边界外,还有图形细节失真,狭小图形遗失等现象。 http://www.paper51.com
paper51.com
&&&&&&&&&&&&&&&&&&&&&&&&图1.2图形细节失真 内容来自论文无忧网 www.paper51.com
在光栅显示器上显示如图1.2(a)所示的细长矩形时,出现了图形细节失真,其结果如图1.2(b)所示,原细长的矩形被显示成了加宽的矩形。 paper51.com
http://www.paper51.com
图1.3 狭小图形的遗失 copyright paper51.com
由于光栅系统中表示图形的最小单位是一个像素,图形中那些比像素更窄的细节丢失了,这就出现了图形细节失真现象。在图1.3中,一些狭小的图形分布在两条扫描线之间,由于它不覆盖任何一个像素中心,故不会被显示出来。当这些狭小的图形进行运动时,覆盖像素中心时被显示出来,不覆盖像素中心时不被显示出来。这样在运动的过程中时隐时现,产生闪烁。 http://www.paper51.com
为了提高图形的显示质量,需要减少或消除上述走样现象。用于减少或消除这种走样现象的技术,称为反走样(Antialiasing)。 copyright paper51.com
研究如何消除或减缓这类走样现象,给人视觉上产生更舒适光滑的图形,在图形界面已成为人机交互主流方式的今天,具有一定的应用价值。 copyright paper51.com
&&& 反走样技术能提高图形的显示质量,因此在很多画图软件中也采用了这种技术。优软电脑有限公司设计推出的新一代绘画程序---优软精灵画笔2.0,在原有的各种绘画功能上,添加了一系列全新设计的绘画工具;可以打开外来JPG,TAG,TIFF,GIF,BMP文件;更新三维立体窗口系统;对压力感应笔高效率支持,速度和流畅度达到专业软件水准,让用户的体会更加细腻逼真。它的精妙之处在于具有细笔尖反走样功能,所以使细笔画更细致更漂亮。 内容来自论文无忧网 www.paper51.com
&& &反走样技术不仅能提高图形显示质量,而且在反走样汉字方面也有很好的效果。由于汉字的笔画很多,而且大多数非水平非垂直,也会产生较严重的走样现象。图1.4中第1 个字为追踪出的轮廓,第2个为显示的原始矢量字符。第3 个为反走样处理后的矢量字符。 http://www.paper51.com
内容来自www.paper51.com
图1.4矢量字体轮廓的反走样 内容来自论文无忧网 www.paper51.com
由此可见,反走样技术在实际应用中有十分重要的意义。另外, 在处理纹理图形, 以及在动画中闪烁的细小物体图形等问题中反走样技术都得到了广泛运用。 copyright paper51.com
1.2编程实验环境 copyright paper51.com
&&& 本文采用的实验环境的是C++Builder 6。C++ Builder由著名的Borland公司开发,是Windows环境下功能强大的可视化C++开发环境,它全面实现了ANSIC++标准,并提供了自己的扩展,并且兼容PC计算机上的两种最常用的C++编译器,即BorlandC++和VisualC++。Borland C++和VisualC++的程序几乎不用做任何修改,就可以在C++ Builder下编译、运行。下面主要介绍在论文中使用最频繁的、与图形图象处理密切相关的组件及其属性和方法。 内容来自论文无忧网 www.paper51.com
1.2.1 TColor 内容来自论文无忧网 www.paper51.com
在计算机图形处理软件中,通常颜色是根据红、绿、蓝三种颜色的饱和度来定义的,这种模型称为RGB模型。任何颜色都是红、绿、蓝三种基本色的不同组合组成,因此每种颜色都可以用红、绿、蓝基本色来表示。Red、Green、Blue用来表示基本色构成的三个分量,他们的取值为0-255,最小值表示没有颜色,最大值255表示最高的饱和度。 paper51.com
&& TColor类型用于定义一个对象的颜色,很多组件的颜色属性就是TColor类型。同时C++ Builder定义了一些常用的颜色常量,可在程序中直接使用。比如clRed,clGreen等。 http://www.paper51.com
   http://www.paper51.com
1.2.2TCanvas paper51.com
在C++ Builder中提供了一个TCanvas对象,它封装了Windows应用程序在图形输出方面所需要的大多数GDI对象和绘图命令。在这个区域上,程序可实现各种绘图功能,很多图形组件(如TImage、TPaintBox)的画布(Canvas)属性都是一个TCanvas对象。 http://www.paper51.com
&&& TCanvas的属性和方法很多,最常用的有: 内容来自论文无忧网 www.paper51.com
l&&&&&&&TCanvas的属性 paper51.com
(1)Pixels属性 内容来自论文无忧网 www.paper51.com
&& Canvas的Pixels属性可以用来去顶像素的颜色。可以利用Pixels属性来获得某一点的颜色值,也可以通过它来设置某一点的颜色值,这个属性在反走样算法中起了相当重要的作用。 http://www.paper51.com
&&& 如要获得坐标(20,20)的颜色值,可以使用下面的代码: paper51.com
&&& TColorC http://www.paper51.com
&&&Color=Canvas-&Pixels[20][20]; 内容来自论文无忧网 www.paper51.com
如果要将坐标点(10,20)的颜色设置为红色,可以使用如下代码: 内容来自www.paper51.com
Canvas-&Pixels[10][20]=clRed; copyright paper51.com
(2)画笔属性 http://www.paper51.com
&& TCanvas的画笔(Pen)属性是一个TPen对象。在用画布划线的时候,需要设置画笔的属性。对每一个画笔均可以选择不同的宽度,颜色,线型。我的论文中用到了颜色(Color)属性。 内容来自论文无忧网 www.paper51.com
&&& 该属性用于控制线的颜色,可以使用预定义的颜色或设置自己的颜色,例如: http://www.paper51.com
&&&&&&Canvas-&Pen-&Color=clBlue; 内容来自www.paper51.com
&&&&&&Canvas-&Pen-&Color=TColor (RGB(125,0,0)); http://www.paper51.com
(3)画刷属性 http://www.paper51.com
&&& Canvas的画刷(Brush)属性是一个TBrush对象,它封装了标准的Windows刷子对象。画刷可以利用颜色和图案来填充矩形、多边形和圆等。使用画刷的Color属性可以设置画刷的颜色,默认的画刷颜色是clWhite。例如: paper51.com
&&&&&Canvas-&Brush-&Color=clRed; copyright paper51.com
这个属性在清屏方法起着主要作用。 内容来自www.paper51.com
(4)ClipRect属性 内容来自www.paper51.com
&&& ClipRect属性用于定义一个画图的矩形区域.在定义了一个剪切区域后,即使画的图形大于这个ClipRect,也不会画到这个区域的外面,同时FillRect属性可以用来填充矩形区域的颜色。 copyright paper51.com
l&&&&&&&&TCanvas的方法 copyright paper51.com
&&& (1)画直线 paper51.com
绘制直线涉及到两个方法:MoveTo和LineTo。MoveTo(intstartx,int starty)的任务是设置当前画笔的位置到(startx,starty),而不进行任何绘图工作。然后可以调用LineTo(int endx,intendy)来画直线。它从当前画笔的位置画一条直线到点(endx,endy),并将当前的画笔位置改变为(endx,endy)。 paper51.com
(2)画椭圆弧线 内容来自论文无忧网 www.paper51.com
绘制椭圆弧线的方法比绘制直线方法要复杂一些。下面是最基本的椭圆弧线绘制函数: paper51.com
Arc(int X1, int Y1, int X2, int Y2, int X3, int Y3, int X4, int Y4); http://www.paper51.com
Arc方法画一段椭圆弧,椭圆由(X1,Y1),(X2,Y2)两点所确定的矩形所决定。弧的起点是椭圆圆周和椭圆中心与(X3,Y3)连线的交点。弧的终点是椭圆圆周和椭圆中心与(X4,Y4)连线的交点,以逆时针方向画弧。在位图的反走样算法中所画的弧线都是由该函数实现的。 http://www.paper51.com
&&& (3)绘制矩形 内容来自论文无忧网 www.paper51.com
&&& Rectangle的具体形式如下: paper51.com
Rectangle(int X1, int Y1, int X2, int Y2); http://www.paper51.com
&&& Rectangle方法是在画布上用当前画刷绘制矩形,其中(X1,Y1)是矩形的左上角,(X2,Y2)是矩形的右下角。如果设置Brush的Style模式为bsClear,则可以绘制未填充的矩形。同时在论文中经常会用到清屏这个功能,它就是调用了FillRect方法,它是用指定的画刷填充矩形,并且绘制的矩形没有边框。具体形式如下: 内容来自论文无忧网 www.paper51.com
FillRect(const windows::TRect &Rect); paper51.com
第二章& 反走样技术概述 copyright paper51.com
在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状。原因是图形信号是连续的,而在光栅显示系统中,用来表示图形的却是一个个离散的象素。这种用离散量表示连续量引起的失真现象称之为走样(aliasing),走样是伴随着光栅显示系统而出现的,也是数字化的必然产物。用于减少或消除这种效果的技术称为反走样(antialiasing)。 http://www.paper51.com
第一章中已经介绍了光栅图形的走样现象除了阶梯状的边界外,还有图形细节失真(图形中的那些比象素更窄的细节变宽),狭小图形遗失等现象。常用的反走样方法主要有:提高分辨率、区域采样和加权区域采样等。下面将对他们进行介绍。 copyright paper51.com
2.1 过取样技术 内容来自论文无忧网 www.paper51.com
反走样的方法很多,一种简单的反走样方法是以较高的分辨率显示对象,如图2.1。假设把显示器分辨率提高一倍,直线经过两倍的象素,锯齿也增加一倍,但同时每个阶梯的宽度也减小了一倍,所以显示出的直线段看起来就平直光滑了一些。这种反走样方法是以4倍的存储器代价和扫描转换时间获得的。因此,增加分辨率虽然简单,但是不经济的方法,而且它也只能减轻而不能消除锯齿问题。但是它的思想给我们以后的反走样方法一定的启示。 内容来自www.paper51.com
paper51.com
图2.1& 提高显示分辨率 copyright paper51.com
一种可行的反走样方法:在较高分辨率下用点取样方法计算,然后对几个像素的属性进行平均得到较低分辨率下的像素属性。这种技术称为过取样(Supersampling),或后滤波(Postfiltering)。该技术是把显示器看成是比实际更细的网格来增加取样率,然后根据这种更细的网格使用取样点来确定每个屏幕像素合适的亮度等级。 copyright paper51.com
&反走样的另一种方法是根据图形对象在每个像素点上的覆盖程度率来确定像素点的亮度,这种计算覆盖率的反走样技术称为区域取样(Area Sampling),或前滤波(Prefiltering)。 paper51.com
2.1.1 提高分辨率方法 copyright paper51.com
过取样方式的一个简单实现是用较高的分辨率进行计算,如图2.2,在x方向和y 方向上把分辨率提高一倍,使每个像素都对应4个子像素,然后扫描转换求得各子像素的颜色亮度,在对4个像素的颜色亮度进行平均,得到较低分辨率下的像素颜色亮度。由于像素中可供选择的子像素最大数目是4,因此,该例中提供的亮度等级数是5。如图2.2中,编号为1和7的像素亮度级别是1,编号为2,3,4,5和6的像素亮度是2。通过这个方法为图中的每个像素设定不同的灰度值,可以使显示出来的直线看起来平滑一些,达到减少走样现象。 http://www.paper51.com
paper51.com
------分隔线---------------------------- 上传我的文档
 下载
 收藏
粉丝量:23
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
(计算机软件与理论专业论文)纹理映射中反走样技术的研究
下载积分:500
内容提示:(计算机软件与理论专业论文)纹理映射中反走样技术的研究
文档格式:PDF|
浏览次数:1|
上传日期: 19:00:30|
文档星级:
全文阅读已结束,如果下载本文需要使用
 500 积分
下载此文档
该用户还上传了这些文档
(计算机软件与理论专业论文)纹理映射中反走样技术的研
关注微信公众号请问怎样对齐24位的位图数据??
编辑:www.fx114.net
本篇文章主要介绍了"请问怎样对齐24位的位图数据??
10iPanda]",主要涉及到请问怎样对齐24位的位图数据??
10iPanda]方面的内容,对于请问怎样对齐24位的位图数据??
10iPanda]感兴趣的同学可以参考一下。
我需要通过位图数据创建一副24位的位图,但是24位的位图需要将位图数据进行对齐,也就是说每行位数必须是4的倍数,请问各位大侠,怎样将位图数据对齐呀,有没有什么算法?每行位数必须是4的倍数?
每行象素数必须是4的倍数
不够的补零。要琢行琢行的补吗?
具体怎么补能给个例子吗?
初次接触这个东东,希望各位多多帮忙给你一个计算公式吧:
row=(bitCount*cx+31)&/32*4
bitCount为象素色深如你提到的24,cx为图片的宽度,row为行对齐后的行字节数。
当然如果图片的高度为cy,则row*cy为图片所占的实际字节总数在位图文件中已经按照4字节对齐了,所以你读取位图数据的时候就不需要去补0,只需知道二维单字节象素数组的结构是对齐后的行和列数就可以了。比如24位的位图宽为10,高为0,其实使用的是宽为12,高为10的数组存储数据。呵呵,已经解决了,不过还是谢谢ddmor
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:&|&&|&&|&&|&&
当前位置: >
论文第1章:绪论
作者:互联网 & 来源:转载 &
摘要: 面向移动设备的矢量绘图平台设计与实现
Design and Implementation of Mobile Device-oriented Vector Drawing Platform
引用本论文: 张云贵. 面向移动设备的矢量绘图平台设计与实现[D]. 北京:北京理工大学软件学院, 2013.
本论文的相似度为0%,是源创论文。欢迎评阅,请勿抄袭。
如果在研究或论文中使用到,欢迎回复
Design and Implementation of Mobile Device-oriented Vector Drawing Platform
引用本论文: 张云贵. 面向移动设备的矢量绘图平台设计与实现[D]. 北京:北京理工大学软件学院, 2013.
本论文的相似度为0%,是源创论文。欢迎评阅,请勿抄袭。
如果在研究或论文中使用到,欢迎回复或私信你的学校、姓名、研究领域,并在论文中添加引用或致谢。感谢你对开放成果的尊重和鼓励。
第1章 绪论
1.1 研究背景和意义
传统的移动设备不适合交互式绘图应用。2010年iPad发布后,涌现了各种平板电脑,目前,国内的平板电脑以Android和iOS操作系统为主。其高分辨率、较高配置、便携性和性价比使其适合于较复杂的交互式矢量图形应用。
在iOS和Android上,国内的二维交互式矢量绘图软件极少,缺乏通用绘图的开源框架。移动设备的硬件架构、交互方式及开发环境与PC机相差很大,开发难度高。2012年国内数字化教育发展迅速,移动终端的应用成为重点。面向移动设备的矢量绘图技术在移动学习和互动教学应用(例如手写批注、图文笔记、几何教学、汉字书写)中具有较大的发展空间和应用价值。
根据以上现状的分析,确定选题为研究面向移动设备(iOS和Android操作系统)的交互式二维矢量绘图平台。因为不同应用领域的需求差异大、多数开发人员能够胜任软件界面定制和业务功能扩展的开发,所以将研究范围限定在二次开发平台(通用开发包)及底层实现上。以跨平台开源框架的形式避免在不同平台上重复开发、扩大适用范围。该平台将应用于互动课堂教学、阅读批注和图文笔记等多种软件中。
1.2 国内外研究现状
1.2.1 移动图形引擎的研究现状
在移动设备上的二维图形引擎主要分为下面三大研究方向。
(1)基于渲染流水线的OpenGL ES和OpenVG。前者适合于三维浏览和游戏应用,跨平台性和硬件加速是其主要优点,国内研究很多,有较多开源框架。但使用其进行二维绘图开发会加大系统复杂性、增加开发成本。而OpenVG适合于SVG和Flash等二维图形的高质量渲染场合,目前应用在GIS和导航等少数领域。
(2)基于画布模型的二维图形库。相对于渲染流水线方式其开发难度较低、与操作系统的内置界面库融合程度高。iOS和Android的核心图形库分别是Quartz 2D和Skia(其Java封装框架为Android Canvas)。Quartz 2D内部可以使用OpenGL ES进行图形渲染和层合并。Android从3.0起可以使用OpenGL ES对多数绘图API进行硬件加速。因此基于画布模型的图形库在移动设备上也具有较高的性能。
(3)基于HTML5 Canvas或移动SVG的实现方式。通过JavaScript脚本实现交互绘图,其跨平台性、丰富渲染特性和开发难度较低是其主要优点。由于运行开销较大和网页浏览器兼容问题等原因,目前在移动设备上应用还不多。
1.2.2 矢量绘图相关的开源项目
表1-1 移动平台上的二维绘图开源框架
从SVG文件生成CAShapeLayers或路径对象
显示和交互操作SVG图形,使用CoreAnimation显示
iPhoneTextReader
使用Quartz 2D显示多种格式的电子书
使用Quartz 2D和Core Animation 显示图表,可显示动态变化的图形和光滑曲线
使用Quartz 2D显示静态图表
SmoothLineView
使用Quartz 2D快速绘制光滑曲线
基于ImageView交互式绘制图形,可读写SVG文件
AndroidPlot
基于View或Widget显示静态和动态图表
svg-android
基于PictureDrawable 显示SVG文件的图形
基于Drawable 显示SVG文件的图形
AChartEngine
显示多种图表,有扩展框架ChartDroid
DroidGraph
显示图表,饼图和线图
DroidCharts AFreeChart
显示多种图表,JFreecharts的Android移植版,在应用程序中将Canvas传给该框架实现绘图
jjoe64/GraphView
显示条状图和线图,可滚动和放缩显示
在iOS和Android上,国外的二维交互式矢量绘图软件较多,国内极少。开源软件或框架较少,表1-1列出主要的二维矢量绘图开源框架(OpenGL ES通常用在游戏引擎和复杂的图形平台中,本文不作研究),这些框架大多在年发布。
iOS绘图框架通常基于Quartz 2D图形库开发,基于CoreAnimation动画引擎实现高性能的动态绘图,基于图像视图或CAShapeLayers显示大量图形。Android绘图框架则主要基于普通视图交互绘制。基于图像视图或可绘制对象的渲染方式用于图形较多的场合。这些开源绘图框架使用C/C++实现的很少,难以同时适用于iOS和Android。
1.2.3 iOS绘图优化技术
杨硕飞在2011年使用Quartz 2D取得了较好的绘图效果。除此之外国内对该图形库的学术研究较少,在互联网上的官方资料和翻译文章较多,应用较广泛。
双缓冲显示技术在PC上很常见,但照搬到iOS上容易出现问题:在iPad 3等显示屏设备上绘图很慢(创建位图没有考虑屏幕放大比例时会更慢)。其主要原因是在缓冲位图上绘图无法使用GPU的加速特性,复制图像和插补运算很耗时。
离屏渲染技术是移动设备上常用的加速绘图技术,其原理是先渲染图形或图像到CALayer(内部有矩形纹理)中,在界面显示时由GPU合成到屏幕帧缓存中。图形绘制阶段是在CPU上进行的,图形复杂时难以快速显示。为了更快显示复杂内容,可采用渐进式渲染技术。在用户交互变慢或CPU空闲时在后台线程中进行填充等更丰富的渲染操作。对于拖动平移或捏合放缩动作,即时显示所有图形影响体验,可只改变CALayer的变换矩阵,由CoreAnimation快速显示。
离屏渲染技术又称为预渲染技术,Kurt总结了两种实现方法:
(1)将绘制好的位图放到UIImageView中,让该视图以矩形纹理方式交给GPU合成显示,避免了在CPU上进行位图复制操作(位图的显示涉及内存复制操作)。
(2)将离屏缓冲位图作为视图的层(CALayer)的内容,但不能实现drawRect函数、不能调用setNeedsDisplay函数,并确保视图的内容模式不为重绘模式。
对于第一种方法,可以使用透明视图进行触摸响应和动态图形显示,在其下层采用图像视图,在触摸结束后在后台线程中合并图形到图像视图。由于避免了位图复制操作,该方法能达到60FPS的流畅程度。
在使用离屏渲染技术可能遇到这两个问题。(1)由于Quartz 2D使用CPU进行绘制,如果绘制时间太长就会出现wait_fences错误。(2)Quartz 2D在屏幕显示时直接在矩形纹理上绘制,这可避免大内存复制,如果超出GPU的缓冲大小(超过屏幕大小或层太多),就会在普通内存块上绘图,然后提交到GPU,这会导致性能问题。解决方法:(1)减少绘制内容。例如,不显示不可见的图形、在动态放缩时仅显示图形外边框。(2)将复杂内容分成多个视图或子层渲染,不必全部重新渲染。
将CALayer标记为光栅化层能够减少复杂图形的渲染频度,但如果视图经常改变内容就会降低性能,需要禁用自动光栅化,不使用额外的缓冲位图。
对于大图片,避免通过剪裁显示和使用drawRect显示,可使用多个CATiledLayer分区拼接显示。其他优化方法有:(1)将多条线段合并到一个路径中批量绘制;(2)动画显示时不使用反走样、不显示文本内容;因为Quartz 2D需要使用单独缓冲渲染这两种内容,(3)使用整数像素坐标能避免自动反走样。
1.2.4 Android绘图技术
Android绘图的主要实现方式是基于SurfaceView的多线程绘制方式、在本地动态库中使用Skia的实现方式,而基于普通View的绘制方式性能相对较低,基于图像视图或可绘制对象的渲染方式用于图形较多的静态图形的绘制中。
高帧率绘图主要使用OpenGL ES或SurfaceView实现,后者容易使用。Chris介绍了后者的经典实现方式:在主线程处理触摸交互事件,在内容线程计算和管理图形,由SurfaceHolder控制的渲染线程只进行每帧的绘制。Chris建议避免内存申请和释放,以避免垃圾回收的暂停影响。Chris通过性能对比指出Canvas对于图形不是太多、更新频度不高的场合,其性能也不差。
从Android 3.0起在屏幕绘图时可使用OpenGL ES 2.0硬件加速绘图,Android 4.0默认全面硬件加速。基于位图的Canvas仍然使用软件渲染方式。Ryan指出该硬件加速特性的缺点是个别显示效果会改变、多占用进程的2~8MB内存,简单使用硬件加速绘制所有图形会导致在部分机型上性能变差。视图的层使用硬件加速时,会占用较多内存,官方推荐仅在动画显示时使用硬件加速。
Robert建议对程序背景图使用RGB_565编码(通常是ARGB_8888),减少透明视图的层次,减少浮点运算量。这样能大幅减少CPU的渲染时间。Android官方针对性能和JNI设计提出了很多建议。例如,使用静态方法而不是虚方法。
1.2.5 图形引擎跨平台的方式
在使用基于画布模型的图形库方面,很多软件都基于某一种图形库(例如Quartz 2D、GDI+)实现,如果要移植到不同的操作系统上就会很困难。对此侯炯总结了WebKit基于图形库适配器的跨平台策略:定义统一的画布接口,在外部插件中使用某种图形库实现该接口。这样确保内核模块跨平台、对应用提供相同的接口。
图形中间件是更进一步的跨平台方式。除了屏蔽图形库差异性外,还可根据应用对性能和内存资源的需求选择基于预缓存的渲染驱动方式和基于图形库适配的渲染驱动方式。还有一种方式是采用跨平台的渲染算法实现图形引擎。
为了弥补某些图形库缺少特定类型曲线的问题,通常将曲线转换为三次贝塞尔曲线。例如使用三次贝塞尔曲线表示任意角度的圆弧、四段Bezier曲线表示椭圆、将B样条曲线和三次参数样条曲线分解为连续的三次贝塞尔曲线。Mike总结了基于三次贝塞尔曲线的计算技术。例如曲线转换、包络框、点中测试、图形相交、分割和拼接、外扩、裁剪。
1.2.6 多点触摸和手势识别
Luke总结了十种经典的核心手势,单指手势有单击、双击、拖动、快滑、长按,双指手势有缩放、旋转、长按并单击、长按并拖动。最后两种手势在主流操作系统中没有内置支持,单指手势都支持,在Android上需要自行识别旋转和缩放手势。研究表明食指、中指或五个手指在交互中使用得最多。较多Android机型最多同时识别三个触点信号。所以在绘图平台中应尽可能只使用单指和双指手势。
将触摸事件识别为手势的一个常见问题是手势二义性(手指动作可理解为多种相似的手势类型)。一般通过延迟发送技术解决。基于触点的触摸状态、位移和时间的方法可解决几种手势的冲突:(1)快滑和拖动通过滑行的距离判断;(2)单击、长按和双击手势通过两次点击的时间间隔和按下持续时间判断。在iOS上除了采用延迟开始和延时结束的方法外,还允许应用程序使用这几种方法:设置手势静态依赖关系、动态判断新触点能否加入到某个手势、允许对多个手势进行同时识别判断。
1.2.7 编程语言和开发方式
C++适合大多数移动平台。如何在多种平台上实现统一的绘图接口是将要面临的一个难题。iOS程序可以在一个文件中同时使用ObjC和C++,通过C++类重载的方式实现扩展和集成。在Android平台上主要使用Java及Android SDK开发应用程序,使用C/C++及Android NDK开发JNI接口的本地动态库。
Android本地动态库的开发存在较多困难,主要有JNI编写、NDK编译和调试、内存泄漏和溢出问题。SWIG可以将C++连接到JNI接口。Charles在2010年发现使用SWIG生成的Java类不适合Android的Dalvik虚拟机,改用javah工具从Java类生成JNI导出函数,只能生成C语言的函数定义文件。目前,这些程序的Java代码很少调用C++的类接口,一般是将C++代码封装到C函数中。Android代码从C++类继承和扩展则几乎没有。Android官方也建议少用虚函数、慎用JNI本地接口。因此需要研究Java与C++衔接的有效方式,降低开发难度。
本文研究发现SWIG官方在2012年4月修复了该问题,Onur Cinar在同年12月出版的专著中介绍了SWIG与NDK结合的实现方法。因此可以使用SWIG新版本开发Android本地动态库。
1.2.8 Android内存访问
在针对Android设计绘图接口时应尽可能使用简单数据类型,少用包装对象,以避免JNI接口的性能损失。由于Dalvik最多支持512个JNI本地引用对象,容易出现内存溢出的问题,在JNI内部实现上要注意释放JNI引用对象。
Android的每个进程默认最多使用16MB内存,容易出现内存溢出问题。通常的解决方法是使用软引用缓存位图对象。但Android 2.3以后软引用对象会被强行回收(弱引用对象回收更快),而且从3.0起位图数据改放到本地库内部,无法预知其释放时机,容易引起内存溢出问题。可使用LruCache或DiskCache进行缓存。其他方法有:(1)在显示小图片时降低采样率以便减少内存占用量。(2)对Activity(应用程序组件)内的线程和异步消息响应者(Handler)特殊处理以便防止Activity不能释放。(3)对于背景图(BackgroundDrawable),在Activity的销毁函数中对Activity解除引用。
1.3 本文的研究内容
移动设备的显示特性、交互方式及开发环境与PC机相差很大,如何在受限的硬件条件下开发高性能的绘图平台存在较多技术难题。为了避免在iOS和Android上重复开发、降低移植工作量,需要设计适合多种移动设备的跨平台绘图架构。
因此,本文对下列工作内容进行重点研究和阐述:
(1)设计跨平台的交互式绘图系统架构,适应iOS和Android等多种移动设备的显示特性和多点触摸的交互方式。同时减少重复开发、降低移植工作量。
具体设计方案是抽象出画布接口和视图接口,让跨平台内核与设备平台相关的图形库和界面库分离。设计跨平台的手势分发接口,在设备平台相关的界面适配器中识别手势,并映射到内核的手势分发接口,由内核进行命令转发或放缩计算。
(2)研究iOS上的矢量图形和图像的显示特性和优化方法,实现基于Quartz 2D图形库的高性能的通用交互式绘图平台。涉及多种离屏渲染技术的应用和优化。
(3)基于SWIG和NDK实现Android封装模块(Java)与跨平台内核(C++)的调用和回调扩展,研究并实现基于Android Canvas的矢量图形和图像的高性能显示方法,实现通用交互式绘图平台。
本绘图平台(TouchVG)的矢量图形和绘图功能与传统的CAD等绘图软件类似,在本文中不重点描述。
1.4 论文组织结构
本文共分为下列七章:
第一章,绪论。说明研究的意义、背景、现状,描述了研究的主要内容。
第二章,相关技术介绍。概括本文涉及的核心技术和基础理论。
第三章,移动绘图平台的架构设计。总结移动设备的特点,设计适合移动设备的扩展机制、平台架构、绘图内核模块及设备接口。
第四章,iOS绘图平台的实现。试验iOS上基于Quartz 2D的多种显示技术,总结出性能较高的设计方案。
第五章,Android绘图平台的实现。使用SWIG实现C++内核与Android代码的互操作,实验和总结Android绘图技术,给出实现效果。
第六章,绘图平台的应用和评估。从应用方式和效果、平台对比等多个方面对绘图平台进行了评估和总结。
总结和展望。总结本文的主要工作、创新点和不足,及后续研究工作。
何高奇. 面向移动设备的图形绘制技术研究[D]. 杭州:浙江大学计算机学院, 2007.
http://www.dajianet.com/digital/5839.shtml
官酩杰. 基于OpenGL ES的移动平台图形渲染研究与实现[D]. 北京:北京交通大学, 2010.
沈江. 基于OpenVG的图形绘制关键技术研究[D]. 杭州:杭州电子科技大学, 2010.
何必仕, 万健, 徐小良. 基于OpenVG矢量图渲染加速研究[J]. 计算机应用与软件, ):111-113.
周方晓等. 用GDI+和面向对象设计方法构建交互式图形平台[J]. 微电子学与计算机, ):165-169.
鲁力, 李欣. 基于AGG算法库的通用图形接口设计[J]. 微计算机信息, ):266-267.
李慧云, 何震苇, 李丽等. HTML5技术与应用模式研究[J]. 电信科学, ):24-29.
http://www.singaporebim.com/Articles_Oversea/147.html
杨硕飞. 动态几何画板的研究及其在iPhone平台的实现[D]. 成都:电子科技大学, 2011.
http://stackoverflow.com/questions//drawing-image-with-coregraphics-on-retina-ipad-is-slow/
http://www.sencha.com/blog/understanding-hardware-acceleration-on-mobile-browsers
http://stackoverflow.com/questions//core-graphics-performance-on-ios
http://www.jwz.org/blog/2012/07/back-buffering-performance-on-ios-with-quartz
http://stackoverflow.com/questions//drawrect-with-cgbitmapcontext-is-too-slow
http://stackoverflow.com/questions//cgcontextdrawlayeratpoint-is-slow-on-ipad-3
http://www.linuxgraphics.cn/android/write_real_time_for_android.html
http://www.extremetech.com/computing/107995-the-truth-about-hardware-acceleration-on-android
http://www.rbgrn.net/content/290-light-racer-20-days-32-33-getting-great-game-performance
http://www.doc88.com/p-.html
张江水, 华一新, 唐衡丽等. 嵌入式GIS跨平台技术的研究与实现[J]. 测绘科学技术学报, ):214-217.
刘楠, 李欣. 跨平台高质量二维图形库设计与实现[J]. 计算机工程与设计, ):.
Fain G. Curves and surfaces for CAGD: A practical guide, 5th Edition. 2002.
http://processingjs.nihongoresources.com/bezierinfo
http://www.lukew.com/touch
本研究发现:iOS的长按手势允许有拖动状态,在拖动时相当于“按住并拖动”手势。官方并未宣传此用法。
Epps J. A study of hand shape use in tabletop gesture interaction[A]. Proceedings of CHI EA '06 [C].
http://3g.163.com/coop/ucweb/mobile/11/UTG4KEE.html
孟祥亮. 显示表面上多触点手势研究[D]. 北京:清华大学计算机科学与技术系, 2010.
季红艳. 基于多点触摸技术的人机交互研究[D]. 上海:华东师范大学软件学院, 2011.
http://www.aton.com/developing-an-android-mobile-application
http://www.aton.com/android-native-libraries-for-java-applications
Onur Cinar. Pro Android C++ with the NDK. Berkeley: Apress, 2012
http://www.ibm.com/developerworks/cn/java/j-lo-jnileak/index.html
http://blog.gorges.us/2010/07/developing-apps-within-androids-16mb-memory-limit
http://blog.csdn.net/jindegegesun/article/details/8447434
版权所有 IT知识库 CopyRight (C)
IT知识库 IT610.com , All Rights Reserved.

我要回帖

更多关于 word绘制文本框 的文章

 

随机推荐