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

简介:

留给:曾经在校园奔跑时候,摔破膝盖,擦伤手掌的孩子!

前言  

       本章提供了采用新的线段渲染算法的例子,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度。当然这种算法应用在细线上速度才会快,最好是小于2个像素。

在其他的章节中会跟conv_stroke进行效率的对比。同样的避免不了引入更多的限制,这一点可以在下面了解到。多说一句:conv_stroke是最昂贵的转换器。

The rasterizer itself works much faster, besides, in this case you won't
need to use the most expensive converter, that is, conv_stroke.


头文件

#include"agg/include/agg_rasterizer_outline_aa.h"

#include"agg/include/agg_renderer_outline_aa.h"

3限制

1)最大的线宽已经被硬编码了,最大值是128个像素,在agg::line_interpolator_aa_base类中

定义,声明的变量是max_half_width.

2)线段的链接方式只能是miter.如果渲染的线比较厚,并且线与线之间的夹角非常尖锐,线段之间的连接方式可能就没有conv_stroke生成的准确。虽说在渲染厚线的时候不是要求太苛刻

3)线段端点的行传只能够是butt_cap或者round_cap.除此之外,butt_cap不是抗锯齿的。round_cap看起来好些,但是影响性能,尤其是你渲染虚线的时候(虚线占6像素,间距是3像素,大概慢1.5倍)

如果渲染长线,那就不需要那么苛刻。调用agg::rasterizer_outline_aa::round_cap(true/false)设置。

4)在渲染一些小的图形轮廓线,效果不是很好。但是在渲染地图,字符,图像,oscilloscopes等表现的也已经很完美了。

5)当然都说是渲染线段的算法,自然就不会渲染点了。

4代码实例

1)简单实例

  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.width(5);//设置线宽

   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));//设置线段的颜色

   ras.move_to_d(100,100);

   ras.line_to_d(500,500);

   ras.render(false);

2)可供选择

    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_power(1.2));//可选

    profile.min_width(0.75);//可选

    profile.smoother_width(0);//可选

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

    renderer_type ren(pixf,profile);


    typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;

    rasterizer_type ras(ren);

    ras.round_cap(false);//设置线段端点行传可选

  

    ren.color(agg::rgba8(255,0,0));//设置颜色,可选

    ras.move_to_d(100,100);

    ras.line_to_d(500,500);

    ras.line_to_d(300,400);

    ras.render(false);//强制性,是否围成闭合的曲线,false绘制折线

3)调用add_path添加顶点源,可以不调用ras.render

    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_power(1.2));//可选

    profile.min_width(0.75);//可选

    profile.smoother_width(0);//可选

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

    renderer_type ren(pixf,profile);


    typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;

    rasterizer_type ras(ren);

    ras.round_cap(false);////可选

  

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

    agg::path_storage ps;

    ps.move_to(600,600);

    ps.line_to(600,100);

    ras.add_path(ps);


邮件的详细信息:

http://sourceforge.net/p/vector-agg/mailman/vector-agg-general/?viewmonth=200309&page=1




     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1963384,如需转载请自行联系原作者


相关文章
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
262 2
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
328 1
|
人工智能 算法 BI
【洛谷 P1803】凌乱的yyy _ 线段覆盖 题解(贪心算法+结构体排序)
**线段覆盖问题**: YYY 想在 NOIP 前参加最多比赛。给定 $n$ 场比赛的开始和结束时间,每场比赛必须连续且不能冲突。输入包含每场比赛的时间段,输出最多可参加的比赛数。$20\%$ 数据 $n\leq10$,$50\%$ 数据 $n\leq10^3$,$100\%$ 数据 $n\leq10^6$。解决方案:按结束时间排序比赛,若当前比赛开始时间晚于上一个结束时间,则计数加一。样例输入:3 场比赛,输出:2。AC C++ 代码实现了此算法。
166 0
|
算法 JavaScript 索引
Vue3渲染器之双端Diff算法
Vue3渲染器之双端Diff算法
220 0
Vue3渲染器之双端Diff算法
|
存储 算法 JavaScript
Vue3渲染器之快速Diff算法
Vue3渲染器之快速Diff算法
462 0
|
算法 JavaScript API
Vue3渲染器之简单Diff算法
Vue3渲染器之简单Diff算法
176 0
|
算法 Java
Java计算四边形中心点和两条线段交点算法
Java计算四边形中心点和两条线段交点算法
487 0
Java计算四边形中心点和两条线段交点算法
|
存储 算法 JavaScript
Vuejs设计与实现 —— 渲染器核心 Diff 算法(下)
Vuejs设计与实现 —— 渲染器核心 Diff 算法
239 0
|
算法 JavaScript 索引
Vuejs设计与实现 —— 渲染器核心 Diff 算法(上)
Vuejs设计与实现 —— 渲染器核心 Diff 算法
218 0

热门文章

最新文章