`
xhload3d
  • 浏览: 205941 次
社区版块
存档分类
最新评论

HTML5 网络拓扑图性能优化

阅读更多

HTML5 中的 Canvas 对文本的渲染(fillText,strokeText)性能都不太好,比如设置字体(font)、文本旋转(rotation),如果绘制较多的文本时,一些交互操作会手动很大的影响,操作起来没那么顺畅,体验将会极其差,这不是我们想要的结果,再进一步和图片的绘制进行比较比较,你会发现,绘制图片和绘制文本在性能上不是一个等级的,在性能上绘制图片会好太多。

 

我们今天就来谈谈 HT for Web 性能相关的问题。在 HT 中,有很多地方可以设置文本,每个节点上面都可以设置两个 label 和两个 note 文本,如果全开启的话,绘制一个节点就要附带绘制 4 个文本,假如说绘制 文本的性能消耗是绘制图片性能消耗的 3 倍的话,附带绘制 4 个文本,就想当与多出 12 倍的性能消耗,这节点以多的话,可想而知,不管是哪个引擎都不可能 hold 得住这样的性能消耗。

 

既然绘制文本的性能消耗无法避免,那么我们要如何提高系统的整体性能呢?换个思路,绘制文本会有高性能消耗,导致操作上面的延迟和卡顿,那么我是不是可以在操作时不绘制文本呢,将文本绘制所消耗的性能节省下来,用在其他的性能消耗上,这样是不是就可以解决操作延迟和卡顿的问题呢?

 

我们不妨来试试,在 GraphView 中添加若干个 node、edge、group 等节点,并且每个节点上都显示文本(包括线条,上图所示),看看拓扑的缩放效果怎么样。没次缩放都要等上两三秒,性能实在是差得不行,这样的应用肯定是不合格的。

 

我们来看看具体的 Demo,链接:http://www.hightopo.com/demo/labelVisible/visible.html。接下来解析下具体代码的实现。

 

var init = function() {
    window.matchMedia('screen and (min-resolution: 2dppx)').
        addListener(function() {
            ht.Default.setDevicePixelRatio();
        });

    var g2d = new ht.graph.GraphView(),
        dm = g2d.dm();
    g2d.addToDOM();
    g2d.getLabel = function(data) {
        if (data.s('label'))
            return data.s('label');
        if (data instanceof ht.Edge)
            return 'from:' + data.getSourceAgent().toString() + 
                ' to:' + data.getTargetAgent().toString();
        return data.toString();
    };

    createNodes(dm);

    var autoLayout = new ht.layout.AutoLayout(g2d);
    autoLayout.setAnimate(true);
    autoLayout.layout('symmetric', function() {
        g2d.fitContent(true);
    });

    createFormPane(g2d, autoLayout);
};

  

上面的代码是页面初始化代码,首先先监听 media 的值变化,防止在不同的 devicePixelRatio 屏幕中切换 而导致页面不清晰,ht.Default.setDevicePixelRatio() 方法会更新 HT 系统中存放 devicePixelRatio 的变量,然后刷新页面上所有的 HT 组件,这样就可以保证页面一定不会不清晰。

 

接着是常见网络拓扑图 GraphView 组件,并将其添加到 DOM 中,重载 GraphView 的 getLabel 方法设置图元的文本,让每个节点都有文本。

 

接下来调用 createNodes 方法创建所有的节点,创建完代码后,创建一个 AutoLayout 来自动布局所有节点,自动布局为开发人员节省手动布局的时间,在效率上大大提升,在布局完后,让 GraphView 中的节点自适应屏幕,让所有节点都显示在当前页面中。

 

最后创建一个 FormPane 放在右上角,用于存放几个控制按钮及几个 ComboBox 选择项,可以让 GraphView 运行在不同的布局模式下,同时这些功能也可以用来检测页面性能,在布局的过程中是否流畅,具体的代码可以通过浏览器的 Sources 查看。

 

文本始终显示的话,在性能上还是不行的,就如上面所说的,是不合格的。那么我么该如何优化,让性能有质的提升呢?

 

在文章的开头有提到,我们可以采用在操作交互的过程中不绘制文本,来提升性能,让页面的呈现更加流畅。那么该怎么实现才能让操作交互过程中不绘制文本呢?具体 Demo 链接:http://www.hightopo.com/demo/labelVisible/invisible.html。看码:

 

var state = {};
g2d.isLabelVisible = function(data) {
    return !state.zooming && !state.panning && !state.autoLayout;
};
g2d.onAutoLayoutEnded = function() {
    state.autoLayout = false;
};
g2d.onZoomEnded = function() {
    state.zooming = false;
};
var timer = null;
g2d.mp(function(e) {
    if (e.property === 'zoom') {
        state.zooming = true;
        if (timer)
            clearTimeout(timer);
        timer = setTimeout(function() {
            timer = null;
            state.zooming = false;
            g2d.redraw();
        }, 100);
    }
});
g2d.mi(function(e) {
    if (e.kind === 'beginPan')
        state.panning = true;
    if (e.kind === 'endPan') {
        state.panning = false;
        g2d.redraw();
    }
});

 

首先 GraphView 提供了 isLabelVisible  的方法,让用户重载自定义文本的显示与否,state 变量是用来标记当前的操作状态,zooming 代表当前的 GraphView正在缩放,panning 代表当前的 GraphView 正在移动整个场景,autoLayout 代表正在做自动布局操作。

GraphView 的 mp(addPropertyChangeListener)方法是监听 GraphView的属性变化,当监听到 zoom 属性变化的时候,将 zooming 状态设置为 true,如果在 zoom 的过程中没有启动动画的话,就不会触发 onZoomEnded 回调,所以需要自己添加计时器,过段时间将 zooming 状态改掉,并且重新绘制下 GraphView。

 

GraphView 的 mi(addInteractorListener)方法是监听用户对 GraphView 的操作动作,在监听到 beginPan 时将 panning 状态设置为 true ,在监听到 endPan 是将 panning 状态设置为 false,并重绘 GraphView。

在 FormPane 中的一些操作会对 GraphView 中的节点进行自动布局,因此在 FormPane 中会设置 autoLayout 状态,由于代码比较多,我在这边就贴代码了。我们来看看,加上上面的代码后,对 GraphView 操作后的效果图:

 

 

上图是在缩放 GraphView 时的效果,可以发现所有的文本都不见了,用户操作起来也不会延迟和卡顿了现象,这样用户操作交互的性能问题也就解决了。

 

分享到:
评论

相关推荐

    js和html5实现网络拓扑图

    7. **性能优化**:对于大规模的网络拓扑图,性能是个挑战。优化渲染策略,如延迟加载、分批渲染,可以显著提升用户体验。 在实际项目中,根据具体需求,我们还可以扩展Qunee的功能,比如添加自定义的节点类型、连接...

    网络拓扑图实现js

    在Web项目中实现这样的功能,HTML5提供了强大的支持,特别是其Canvas API和SVG(Scalable Vector Graphics)技术,使得动态、交互式的网络拓扑图成为可能。 首先,我们要理解HTML5中的Canvas。Canvas是一个基于矢量...

    矢量Chart图表嵌入HTML5网络拓扑图的应用

    "矢量Chart图表嵌入HTML5网络拓扑图的应用"这一主题聚焦于如何利用矢量图表技术来创建交互式、可缩放的网络拓扑视图。 矢量图是一种基于数学描述的图像,它由点、线、曲线等基本元素构成,具有清晰度高、不失真的...

    快速开发基于 HTML5 网络拓扑图应用之 DataBinding 数据绑定篇

    在开发基于HTML5的网络拓扑图应用时,DataBinding(数据绑定)是核心功能之一,它连接着用户界面和应用程序的数据模型,使得两者之间的数据更新可以自动化进行,极大地简化了开发过程。在这个"快速开发基于HTML5网络...

    python网络拓扑可视化

    利用pygame,我们可以创建交互式的网络拓扑图,用户可以实时地改变节点的位置、颜色,以及边的颜色、粗细和权重。 在Python中,网络拓扑可视化通常涉及到以下几个核心知识点: 1. **数据结构**:首先,你需要一个...

    svg网络拓扑

    它允许开发者创建出清晰、细腻的图形,无论放大多少倍都能保持其高质量,这在绘制网络拓扑图时尤其重要,因为这些图通常需要进行缩放和交互操作。 在这个前端可视化工程中,SVG被用来构建网络拓扑图,可以显示...

    springboot+mongodb 水下网络拓扑发现系统

    模板根据接收到的数据生成相应的HTML,展示网络拓扑图,可能包括设备节点、连线以及状态信息。可以使用JavaScript库,如D3.js或cytoscape.js,来增强图形的交互性和可视化效果。 此外,为了提高系统的可扩展性和...

    jquery 拓扑图插件

    在拓扑图方面,jQuery插件往往提供了丰富的配置选项、交互功能以及良好的性能优化。 ### 3. 异步获取节点 在大型系统中,节点数量可能非常庞大,一次性加载所有节点可能会导致页面加载速度变慢。因此,支持异步...

    基于jTopo的拓扑图设计工具库

    jTopo就是这样一款专为JavaScript开发者设计的开源拓扑图设计工具库,它允许开发者创建和管理动态的、交互式的网络拓扑图。这个工具库基于JavaScript,支持在Web浏览器环境中运行,为用户提供了一种直观的方式来表示...

    jsgraph,纯javascript脚本画图,实现web拓扑图

    3. **拓扑图绘制**:jsgraph的核心功能之一就是绘制网络拓扑图。它可以用于展示服务器、路由器、交换机等网络设备之间的连接,帮助网络管理员理解和管理复杂的网络结构。 4. **自定义图形和样式**:通过jsgraph,你...

    jsPlumb 绘画拓扑图

    **jsPlumb 概述** jsPlumb 是一个开源JavaScript库,专为在Web应用程序中绘制连接图和拓扑图而设计。...在实践中不断优化和调整,你会发现 jsPlumb 是一个强大的工具,可以帮助你创建出富有表现力和交互性的拓扑图。

    纯css 拓扑特效

    纯CSS(Cascading Style Sheets)实现的网络拓扑特效是一种高效且轻量级的方法,无需依赖JavaScript或者其他复杂的图形库,就能创建出动态、交互式的网络拓扑图。这种技术在监控系统、网络管理软件以及教学示例中...

    topo 拓扑图例子

    5. **性能优化**:对于大型或复杂网络,性能优化至关重要。这可能包括使用Web Workers进行离线计算,使用适当的缓存策略,以及优化渲染算法以减少重绘。 6. **可扩展性**:一个优秀的拓扑图例子应具备良好的可扩展...

    网页模板——jQuery实现人事物关系拓扑图代码.zip

    网页模板中的jQuery实现人事物关系拓扑图代码是一种可视化技术,用于展示复杂的数据关系,尤其在组织结构、项目管理、网络架构等领域应用广泛。在这个压缩包中,包含了一个用于创建这种拓扑图的代码实现,可能包括...

    jtopo拓扑练习

    在IT领域,网络拓扑图是一种用于可视化网络设备、服务器、连接线路等元素布局的工具。它帮助管理员理解、规划和管理网络结构。在这个项目中,我们专注于使用`jtopo`这个开源库来创建和实践拓扑图的制作。`jtopo`是一...

    twaver拓扑

    【标题】"twaver拓扑" 是一个基于HTML5技术的图形化工具,主要用于创建和展示复杂的网络拓扑结构。这个工具提供了丰富的图形类型,能够适应多种应用场景,如IT网络架构、工业控制系统、流程图等。它允许用户通过图形...

    拓扑图,使用jtopo功能完善,灰常实用

    jtopo是一个强大的JavaScript库,专为绘制网络拓扑图而设计。它支持多种操作,包括连接节点、组织节点成组以及删除节点等,这些功能在描述中被提及。使用jtopo,开发人员可以在Web应用中轻松地创建交互式的拓扑图,...

    jtopo.rar (jtopo拓扑图两节点双线连接bug修复)

    在IT行业中,网络拓扑图是一种非常重要的工具,它用于可视化地表示计算机网络中的设备、服务器、线路等元素之间的关系。jtopo是一款基于JavaScript的开源拓扑图库,适用于Web应用中创建动态、交互式的网络拓扑图。在...

    js 配置项拓扑自动

    8. **性能优化**:随着节点和边的数量增加,渲染和操作拓扑图可能会变得性能密集。因此,项目可能采用了各种优化技术,如延迟渲染、分块加载、GPU加速等,以确保在大规模数据下的流畅性。 9. **模块化与封装**:...

Global site tag (gtag.js) - Google Analytics