AGG第三十四课 stroke_aa和outline_aa渲染线段效率对比

1 渲染代码

void TestStrokeAAPerformance()

{

agg::rendering_buffer &rbuf = rbuf_window();

agg::pixfmt_bgr24 pixf(rbuf);

typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;

renderer_base_type renb(pixf);

typedef agg::renderer_scanline_aa_solid<renderer_base_type>renderder_scanline_type;

renderder_scanline_type rensl(renb);

agg::rasterizer_scanline_aa<> ras;

agg::scanline_u8 sl;

ras.reset();

renb.clear(agg::rgba8(255,255,255));

int nPointX[5]={20,80,20,80,20};

int nPointY[5]={20,20,80,80,20};

agg::path_storage ps;

ps.move_to(nPointX[0],nPointY[0]);

for (int i =1; i<= 4; i++)

{

ps.line_to(nPointX[i],nPointY[i]);

ps.move_to(nPointX[i],nPointY[i]);

}

stroke(trans);

agg::conv_stroke<agg::path_storage> stroke(ps);

stroke.width(nLineWidth);

int start = ::GetTickCount();

ras.gamma(agg::gamma_threshold(0.5));//取消抗锯齿;注释使用抗锯齿功能

for (int x=0;x<1000;x++)

{

ras.add_path(stroke);

}

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

int end = ::GetTickCount();

int costTime = 0;

costTime = end -start;

}

void TestOutLineAAPerformance()

{

agg::rendering_buffer &rbuf = rbuf_window();

agg::pixfmt_bgr24 pixf(rbuf);

typedef agg::renderer_outline_aa<agg::pixfmt_bgr24> renderer_type;

agg::line_profile_aa profile;

profile.gamma(agg::gamma_threshold(0.5));

profile.width(nLineWidth);//强制性要求设置线宽

renderer_type ren(pixf,profile);

typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;

rasterizer_type ras(ren);

ren.color(agg::rgba8(255,0,0));//可选

int nPointX[5]={20,80,20,80,20};

int nPointY[5]={20,20,80,80,20};

agg::path_storage ps;

ps.move_to(nPointX[0],nPointY[0]);

for (int i =1; i<= 4; i++)

{

ps.line_to(nPointX[i],nPointY[i]);

ps.move_to(nPointX[i],nPointY[i]);

}

//agg::conv_transform<agg::path_storage,roundoff>trans(ps,roundoff());

int start = ::GetTickCount();

for (int x=0;x<1000;x++)

{

ras.add_path(ps);

}

int end = ::GetTickCount();

int costTime = 0;

costTime = end -start;

}

简单说明:agg::gamma_threshold(0.5)主要应用于关闭抗锯齿功能,注释掉所在的代码行就可以启用抗锯齿功能。

3结论

1)是否设置抗锯齿,对于渲染的速度没有多大的帮助,不引入抗锯齿,耗时稍微多了一点。

2)在渲染细微的线的时候,采用outline_aa更快,如果是厚线,采用stroke_aa更好!!

如下是作者的观点:

1)亚像素精度和速度没有多大的关系

2)一般情况下,rasterizer_outline_aa渲染的速度是conv_stroke和rasterizer_scanline_aa的两倍。但是有非常明显的限制,只支持miter连接,生成一些工件(artifacts),在渲染厚线的时候更加明显。

3)实际上渲染锯齿的厚线远比抗锯齿的厚线更加的复杂,看起来可能非常奇怪。所以是否抗锯齿不会加快渲染速度。

4)渲染厚线(是否抗锯齿)是一项非常复杂的操作,目前只能够通过stroker和scanline rasterizer配合工作使用。如果你需要一个非常非常快的渲染厚线的方法,AGG恐怕无法胜任,可能需要硬件加速,但是可能会有更多的限制!!

4 邮件观点

Having subpixel accuracy doesn‘t reallymatter for speed.

In general, rasterizer_outline_aa worksabout twice faster than conv_stroke

plus rasterizer_scanline_aa. But it hascertain restrictions (only miter joins)

and produces some artifacts, especiallywith thick lines.

It may seem strange, but it‘s moredifficult to draw aliased thick polyline

than anti-aliased one. You anyway have toconsider line joins at least. To turn

off anti-aliasing you can use thefollowing:

agg::line_profile_aa profile(10.0,agg::gamma_threshold(0.5));

But it won‘t speed up rendering.

Fully correct thick outline (aliased oranti-aliased) is a very complex task

and can be solved only with the strokerplus scanline rasterizer.

If you really need to draw thick lines veryvery fast, I‘m afraid that AGG is

not what you need. You can try somethingelse, with hardware acceleration,

But this method is even more restrictivethan the general stroker.

时间: 2024-08-16 13:05:45

AGG第三十四课 stroke_aa和outline_aa渲染线段效率对比的相关文章

stroke_aa和outline_aa渲染线段效率对比

1 渲染代码 void TestStrokeAAPerformance() { agg::rendering_buffer &rbuf = rbuf_window(); agg::pixfmt_bgr24 pixf(rbuf); typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type; renderer_base_type renb(pixf); typedef agg::renderer_scanline_aa

第三十四课 二维数组的存储 【项目1-3】

第三十四课 二维数组的存储 项目一[二维数组当函数参数] 定义一个函数来完成对参数数组中元素的求和工作,函数声明如下: [cpp] view plain copy print? int sum(int array[ ][4],int m,int n);  //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. [cpp] view plain copy print? #include <stdio.h> int sum(int array[ ][4

AGG第三十二课 renderer_outline_aa更快的渲染线段算法

留给:曾经在校园奔跑时候,摔破膝盖,擦伤手掌的孩子! 1 前言 本章提供了采用新的线段渲染算法的例子,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度.当然这种算法应用在细线上速度才会快,最好是小于2个像素. 在其他的章节中会跟conv_stroke进行效率的对比.同样的避免不了引入更多的限制,这一点可以在下面了解到.多说一句:conv_stroke是最昂贵的转换器. The rasterizer itself works much faster, bes

AGG第三十九课 rasterizer_scanline_aa画线函数疑惑

头文件 #include<agg_rasterizer_scanline_aa.h> 类型 template<class Clip =rasterizer_sl_clip_int> class rasterizer_scanline_aa 成员函数 void add_path(VertexSource&vs,unsigned path_id=0)加入顶点源 void reset() 清空上一次的渲染缓存数据,每次调用add_path函数之前都需要执行该操作 其中也提供了简单

JAVA学习第三十四课(常用对象API)- 集合框架(二)—List集合及其子类特点

整个集合框架中最常用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有索引且可以重复    API文档解释:有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素. 2.Set:元素不能重复,无序,有可能会有序    API文档解释:一个不包含重复元素的 coll

JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点

整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有索引且能够反复    API文档解释:有序的 collection(也称为序列).此接口的用户能够对列表中每一个元素的插入位置进行精确地控制.用户能够依据元素的整数索引(在列表中的位置)訪问元素,并搜索列表中的元素. 2.Set:元素不能反复,无序,有可能会有序    API文档解释:一个不包括反复元素的 c

第三十四课:jQuery Deferred详解2

上一课主要分析了jQuery1.51版本的jQuery Deferred.在jQuery1.6中,jQuery Deferred添加了两个方法,always,pipe. always用来添加回调,无论成功还是失败,都会执行. pipe就是管道的意思,对回调使用瀑布模型,上一个回调的返回值供下一个会调使用. 我们举个例子来说明下pipe与then的区别: var deferred = $.Deferred();  //返回的是Deferred对象 var promise = deferred.pi

第三十四课 Spark中任务处理的Stage划分和Task最佳位置算法

本节课的内容 1.     Job Stage的划分算法 2.     Task最佳计算位置算法 一.Stage划分算法 由于Spark的算子构建一般都是链式的,这就涉及了要如何进行这些链式计算,Spark的策略是对这些算子,鲜花分Stage,然后在进行计算. 由于数据是分布式的存储在各个节点上的,所以为了减少网络传输的开销,就必须最大化的追求数据本地性,所谓的数据本地性是指,在计算时,数据本身已经在内存中或者利用已有缓存无需计算的方式获取数据. 1.      Stage划分算法思想 (1)一

AGG第三十五课 gsv_text 渲染ASCII字符

代码 agg::rendering_buffer &rbuf = rbuf_window(); agg::pixfmt_bgr24 pixf(rbuf); typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type; renderer_base_type renb(pixf); typedef agg::renderer_scanline_bin_solid<renderer_base_type> ren