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 的 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 时的效果,可以发现所有的文本都不见了,用户操作起来也不会延迟和卡顿了现象,这样用户操作交互的性能问题也就解决了。
相关推荐
7. **性能优化**:对于大规模的网络拓扑图,性能是个挑战。优化渲染策略,如延迟加载、分批渲染,可以显著提升用户体验。 在实际项目中,根据具体需求,我们还可以扩展Qunee的功能,比如添加自定义的节点类型、连接...
在Web项目中实现这样的功能,HTML5提供了强大的支持,特别是其Canvas API和SVG(Scalable Vector Graphics)技术,使得动态、交互式的网络拓扑图成为可能。 首先,我们要理解HTML5中的Canvas。Canvas是一个基于矢量...
在开发基于HTML5的网络拓扑图应用时,DataBinding(数据绑定)是核心功能之一,它连接着用户界面和应用程序的数据模型,使得两者之间的数据更新可以自动化进行,极大地简化了开发过程。在这个"快速开发基于HTML5网络...
"矢量Chart图表嵌入HTML5网络拓扑图的应用"这一主题聚焦于如何利用矢量图表技术来创建交互式、可缩放的网络拓扑视图。 矢量图是一种基于数学描述的图像,它由点、线、曲线等基本元素构成,具有清晰度高、不失真的...
利用pygame,我们可以创建交互式的网络拓扑图,用户可以实时地改变节点的位置、颜色,以及边的颜色、粗细和权重。 在Python中,网络拓扑可视化通常涉及到以下几个核心知识点: 1. **数据结构**:首先,你需要一个...
它允许开发者创建出清晰、细腻的图形,无论放大多少倍都能保持其高质量,这在绘制网络拓扑图时尤其重要,因为这些图通常需要进行缩放和交互操作。 在这个前端可视化工程中,SVG被用来构建网络拓扑图,可以显示...
模板根据接收到的数据生成相应的HTML,展示网络拓扑图,可能包括设备节点、连线以及状态信息。可以使用JavaScript库,如D3.js或cytoscape.js,来增强图形的交互性和可视化效果。 此外,为了提高系统的可扩展性和...
在拓扑图方面,jQuery插件往往提供了丰富的配置选项、交互功能以及良好的性能优化。 ### 3. 异步获取节点 在大型系统中,节点数量可能非常庞大,一次性加载所有节点可能会导致页面加载速度变慢。因此,支持异步...
jTopo就是这样一款专为JavaScript开发者设计的开源拓扑图设计工具库,它允许开发者创建和管理动态的、交互式的网络拓扑图。这个工具库基于JavaScript,支持在Web浏览器环境中运行,为用户提供了一种直观的方式来表示...
3. **拓扑图绘制**:jsgraph的核心功能之一就是绘制网络拓扑图。它可以用于展示服务器、路由器、交换机等网络设备之间的连接,帮助网络管理员理解和管理复杂的网络结构。 4. **自定义图形和样式**:通过jsgraph,你...
**jsPlumb 概述** jsPlumb 是一个开源JavaScript库,专为在Web应用程序中绘制连接图和拓扑图而设计。...在实践中不断优化和调整,你会发现 jsPlumb 是一个强大的工具,可以帮助你创建出富有表现力和交互性的拓扑图。
【标题】"twaver拓扑" 是一个基于HTML5技术的图形化工具,主要用于创建和展示复杂的网络拓扑结构。这个工具提供了丰富的图形类型,能够适应多种应用场景,如IT网络架构、工业控制系统、流程图等。它允许用户通过图形...
5. **性能优化**:对于大型或复杂网络,性能优化至关重要。这可能包括使用Web Workers进行离线计算,使用适当的缓存策略,以及优化渲染算法以减少重绘。 6. **可扩展性**:一个优秀的拓扑图例子应具备良好的可扩展...
纯CSS(Cascading Style Sheets)实现的网络拓扑特效是一种高效且轻量级的方法,无需依赖JavaScript或者其他复杂的图形库,就能创建出动态、交互式的网络拓扑图。这种技术在监控系统、网络管理软件以及教学示例中...
网页模板中的jQuery实现人事物关系拓扑图代码是一种可视化技术,用于展示复杂的数据关系,尤其在组织结构、项目管理、网络架构等领域应用广泛。在这个压缩包中,包含了一个用于创建这种拓扑图的代码实现,可能包括...
在IT领域,网络拓扑图是一种用于可视化网络设备、服务器、连接线路等元素布局的工具。它帮助管理员理解、规划和管理网络结构。在这个项目中,我们专注于使用`jtopo`这个开源库来创建和实践拓扑图的制作。`jtopo`是一...
jtopo是一个强大的JavaScript库,专为绘制网络拓扑图而设计。它支持多种操作,包括连接节点、组织节点成组以及删除节点等,这些功能在描述中被提及。使用jtopo,开发人员可以在Web应用中轻松地创建交互式的拓扑图,...
在IT行业中,网络拓扑图是一种非常重要的工具,它用于可视化地表示计算机网络中的设备、服务器、线路等元素之间的关系。jtopo是一款基于JavaScript的开源拓扑图库,适用于Web应用中创建动态、交互式的网络拓扑图。在...
Twaver是一个强大的数据可视化和网络建模工具,广泛应用于网络拓扑、流程图、组织结构等场景。5.9.0是该库的一个特定版本,可能包含了新功能、性能优化或错误修复。 描述简单明了,"twaver-html5-5.9.0-api"直接...