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-10-09 22:06:04

stroke_aa和outline_aa渲染线段效率对比的相关文章

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

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

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

Oracle常用导出导出命令及性能效率对比

说明 Oracle导入导出命令主要有EXPDP和IMPDP.EXP和IMP,区别如下:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用.IMP只适用于EXP导出的文件,不适用于EXPDP导出文件:IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件.expdp或impdp命令时,可暂不指出用户名/密码@实例名as 身份,然后根据提示再输入,如:expdp schem

CMap与hash_map效率对比

CMap与hash_map底层均采用hash stable实现,CMap是MFC提供的模板类.hash_map虽然目前并未纳入C++标准模板类库,但几乎每个版本的STL都提供了相应的实现.CMap与hash_map的存储于查询效率比较如下: 利用rand函数随机生成99999个整数构成查询数据集,紧接着申请9999个整数作为查询.测试两个模板类的插入与查询总时间,测试结果显示:当查询都不存在时CMap时间大约16ms,hash_map为0ms:当大部分查询存在时CMap时间为624,而hash_

Snapman系统中TCC执行效率和C#执行效率对比

Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面3方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 这是C#代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Tex

java StringBuffer,StringBuilder,String自身连接效率对比

当我们仅仅需要a+b 的时候,两个字符串链接任何方法的效率基本一样,都在0.0001毫秒内就可以完成.不过如果需要1万次,10000万次,就会发现string自身的join速度显著下降 package com.java.lang; public class StringTest { int MAX = 10000; //1万次累加 public String Buffer(){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < MA

renderer_outline_aa更快的渲染线段算法

1 前言 本章提供了一种新的渲染线段的算法,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度. 2 头文件 #include"agg/include/agg_rasterizer_outline_aa.h" #include"agg/include/agg_renderer_outline_aa.h" 3 代码实例: agg::rendering_buffer&rbuf = rbuf_window(); agg::pi

golang 浮点数 取精度的效率对比

需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" "fmt" ) func main() { threadCount := 100000 fa := 3.233667 time1 := TestFn(threadCount,fa,func(fa float64) string{ return strconv.FormatFloat(fa,'f',2

类的构造及初始化效率对比

基础数据结构: struct A { int a; int b; int c; int d; int e; int f; int g; }; 初始化次数:const int MAX_LOOP_NUM = 100000000; 第一种方式: 无初始化 struct A { A() { } int a; int b; int c; int d; int e; int f; int g; }; for(int index = 0; index < MAX_LOOP_NUM; ++index) { A