1. 程式人生 > >HTML5 網路拓撲圖 Canvas 效能優化

HTML5 網路拓撲圖 Canvas 效能優化

HTML5 中的 Canvas 對文字的渲染(fillText,strokeText)效能都不太好,比如設定字型(font)、文字旋轉(rotation),如果繪製較多的文字時,一些互動操作會手動很大的影響,操作起來沒那麼順暢,體驗將會極其差,這不是我們想要的結果,再進一步和圖片的繪製進行比較比較,你會發現,繪製圖片和繪製文字在效能上不是一個等級的,在效能上繪製圖片會好太多。

我們今天就來談談 HT for Web 效能相關的問題。在 HT 中,有很多地方可以設定文字,每個節點上面都可以設定兩個 label 和兩個 note 文字,如果全開啟的話,繪製一個節點就要附帶繪製 4 個文字,假如說繪製 文字的效能消耗是繪製圖片效能消耗的 3 倍的話,附帶繪製 4 個文字,就想當與多出 12 倍的效能消耗,這節點以多的話,可想而知,不管是哪個引擎都不可能 hold 得住這樣的效能消耗。

既然繪製文字的效能消耗無法避免,那麼我們要如何提高系統的整體效能呢?換個思路,繪製文字會有高效能消耗,導致操作上面的延遲和卡頓,那麼我是不是可以在操作時不繪製文字呢,將文字繪製所消耗的效能節省下來,用在其他的效能消耗上,這樣是不是就可以解決操作延遲和卡頓的問題呢?

我們不妨來試試,在 GraphView 中新增若干個 node、edge、group 等節點,並且每個節點上都顯示文字(包括線條,上圖所示),看看拓撲的縮放效果怎麼樣。沒次縮放都要等上兩三秒,效能實在是差得不行,這樣的應用肯定是不合格的。

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 檢視。

文字始終顯示的話,在效能上還是不行的,就如上面所說的,是不合格的。那麼我麼該如何優化,讓效能有質的提升呢?

。看碼:

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 時的效果,可以發現所有的文字都不見了,使用者操作起來也不會延遲和卡頓了現象,這樣使用者操作互動的效能問題也就解決了。

相關推薦

HTML5 網路拓撲圖 Canvas 效能優化

HTML5 中的 Canvas 對文字的渲染(fillText,strokeText)效能都不太好,比如設定字型(font)、文字旋轉(rotation),如果繪製較多的文字時,一些互動操作會手動很大的影響,操作起來沒那麼順暢,體驗將會極其差,這不是我們想要的結果,再進一

Canvas 效能優化

最近對 html5小遊戲有點興趣,因為我感覺將來這個東西或許是前端一個重要的應用場景,例如現在每到某些節假日,像支付寶、淘寶或者其他的一些 APP可能會給你推送通知,然後點進去就是一個小遊戲,基本上點進去的人,只要不是太抵觸,都會玩上一玩的,如果要是恰好 get

App的網路測試中效能優化方案

優化DNS解析和快取 由於我們的App網路服務主要基於TCP連線,為了將DNS時間降至最低,我們內建了Server IP列表,該列表可以在App啟動服務中下發更新。App啟動後的首次網路服務會從Server IP列表中取一個IP地址進行TCP連線,同時DNS解析會並

Canvas效能優化

1、Canvas是html5新增的畫布元素,允許我們使用Js來繪製圖形 2、Canvas最常見的用途是渲染動畫。 渲染動畫的基本原理無非是反覆的擦除和重繪。 為了動畫的流暢,留了一幀的時間,我們需要在16ms完成遊戲邏輯的處理,物件位置、狀態的計算以及把他們畫出來。一旦

快速開發基於 HTML5 網路拓撲圖應用--入門篇(一)

計算機網路的拓撲結構是引用拓撲學中研究與大小,形狀無關的點、線關係的方法。把網路中的計算機和通訊裝置抽象為一個點,把傳輸介質抽象為一條線,由點和線組成的幾何圖形就是計算機網路的拓撲結構。網路的拓撲結構反映出網中各實體的結構關係,是建設計算機網路的第一步,是實現各種網路協議的基礎,它對網路的效能,系統的可靠性

canvas效能優化——離屏渲染

零、寫在前面 最近在做一些canvas以及WebGL之類的動畫,突然發現做粒子動畫的時候在數量過多的時候很卡,效能特別低,所以瞭解了一下效能優化的一些方法,在這裡記錄一下,也希望得到跟多優化方法的分享以及錯誤的指正。 這是示例程式碼以及展示效果,另外可能根據

HTML5 電信網路拓撲圖效能優化

HTML5 中的 Canvas 對文字的渲染(fillText,strokeText)效能都不太好,比如設定字型(font)、文字旋轉(rotation),如果繪製較多的文字時,一些互動操作會手動很大的影響,操作起來沒那麼順暢,體驗將會極其差,這不是我們想要的結果,再進一步和圖片的繪製進行比較比較,你會發現

快速建立 HTML5 Canvas 電信網路拓撲圖

前言電信網路拓撲圖確實實用性很強,最近有個專案是基於這個的,為了寫得豐富一點,還加了自動佈局已經屬性欄部分,不過這個 Demo 真的寫得很用心,稍微改改都能直接運用到專案中去,還可以進行資料互動,總之希望能對大家有所幫助。效果圖拓撲圖從上面的效果圖中我們可以看到,整個頁面分為

loading動畫的效能優化-摒棄Canvas,擁抱CSS3-實現點選特效

click-colorful 專案中有個活動頁載入時有個loading動畫,效果如上圖,連續綻放小球,問題就是太卡,經常出現一堆小球抱團卡住,遂進行優化 注意:(僅在頁面載入時卡頓,載入完畢,點選的時候不卡頓) 檢視程式碼發現改動畫時借用的animejs 官網中的效果,通過can

Linux效能優化 第七章 效能工具:網路

7.1 網路I/O介紹        Linux和其他主流作業系統中的網路流量被抽象為一系列的硬體和軟體層次。        鏈路層,也就是最低

面試被問之-----sql優化中in與exists的區別 Mysql中 in or exists not exists not in區別 (網路整理) Sql語句中IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

KVM總結-KVM效能優化網路效能優化

首先,我給大家看一張圖,這張圖是資料包從虛擬機器開始然後最後到物理網絡卡的過程。 我們分析下這張圖,虛擬機器有資料包肯定是先走虛擬機器自身的那張虛擬網絡卡,然後發到中間的虛擬化層,再然後是傳到宿主機裡的核心網橋中,最後傳到物理網絡卡,這個過程很好理解。 那麼我們要做網

VMware和VirtualBox中的網路介面卡型別及虛擬網路效能優化

AMD PCNet PCI II (Am79C970A); AMD PCNet FAST III (Am79C973,預設); Intel PRO/1000 MT Desktop (82540EM); Intel PRO/1000 T Server (82543GC); Intel PRO/100

Android進階——效能優化之儘量多使用AsyncTask進行短時間網路通訊

引言 對於我們Android 開發來說,網路操作應該是最普遍不過的操作了吧,因為沒有網路操作的APP應該就沒有存在的價值吧,往往網路操作這部分又通常是耗時的,所以為了良好的使用者體驗,我們必須把耗時操作放到非UI執行緒,而實現方式有很多種,比較常見的應該就是H

一張圖看懂HTML5的前端效能優化

      概述   1. PC優化手段在Mobile側同樣適用   2. 在Mobile側我們提出三秒種渲染完成首屏指標   3. 基於第二點,首屏載入3秒完成或使用Loading   4. 基於聯通3G網路平均338KB/s(2.71Mb/s),

HTML5第三彈:亦酷亦萌的網路拓撲圖

前言 前一篇3D機房好像有點火,看來輕量的Web 3D是大勢所趨,當時選擇WebGL而不是U3D真是灰常英明的抉擇。 3D雖然炫酷,但在真正的企業應用裡,資料、關係的呈現還是要回到傳統2D介面,而HTML5是目前的最佳選擇。像HTML5的canvas,雖然已

提高HTML5 canvas效能的幾種方法

簡介 HTML5 canvas 最初起源於蘋果(Apple)的一項實驗,現在已經成為了web中受到廣泛支援的2D快速模式繪圖(2D immediate mode graphic)的標準。許多開發者現在利用它來實現眾多的多媒體專案、視覺化醒目以及遊戲等等。然而,隨著我們

Android效能優化二 電量優化網路優化、物件池、bitmap解位元速率

大綱 電量優化、網路優化、Android Wear上如何做優化、使用物件池來提高效率、LRU Cache、Bitmap的縮放、快取、重用、PNG壓縮、自定義View的效能、提升設定alpha之後View的渲染效能,以及Lint、StictMode等工具的使用技巧 對於手機程

Android 效能優化典範(二)電量優化|網路優化(JobSchedule使用)|圖片壓縮快取| StictMode

1) Battery Drain and Networking對於手機程式,網路操作相對來說是比較耗電的行為。優化網路操作能夠顯著節約電量的消耗。在效能優化第1季裡面有提到過,手機硬體的各個模組的耗電量是不一樣的,其中移動蜂窩模組對電量消耗是比較大的,另外蜂窩模組在不同工作強度下,對電量的消耗也是有差異的。當

canvas效能優化(快取問題)

使用快取 使用快取就是用離屏canvas進行預渲染了。原理就是先繪製一個離屏canvas,然後再通過drawImage把離屏canvas畫到主canvas中。把離屏canvas當成一個快取區,需要重複繪製的畫面資料進行快取。減少呼叫canvas的API