數據看板作為一個直觀性較強的實時數據展示平台,在各個行業項目中都極有可能使用到。而作為一個web的初生牛犢,第一次設計制作看板程序,在這個過程中算是踩了不少的坑。下面我將對自己的整個編程經歷分兩點進行總結。
第一點:實時數據請求
在進行看板項目編輯初期,由於想法太單純,想着還是采用基本的ajax數據請求技術,每隔幾秒鍾請求一次獲取到新數據,從而對頁面進行數據渲染,所以,在沒有跟后台開發人員進行更加合理的技術探討情況下便開始了看板設計。頁面布局設計完成之后,開始了實時數據請求渲染,然而,問題來了。一個看板分了七八個模塊,每隔模塊又是單獨的接口,在面對每隔兩三秒發出一次請求的情況下,終於,系統崩潰了。jquery的ajax請求技術,在每次請求的時候都會創建一個XMLHttpRequest對象,由於接口的堵塞,又導致了數據得不得更新。想着jquery的ajax數據請求有個complete回調函數,不管請求成功與否都會使用設個函數,於是,對代碼進行了修改。demo方式如下:
function getMessage () {
$.ajax({
url: 'urlAddress',
type: 'get',
async: true,
cache: false,
dataType: 'json',
success: function(){},
error: function(){},
complete: function (XTR, TS) {
XTR = null; // 釋放XMLHttpRequest對象
setTimeout(getMessage, 3000); // 使用setTimeout代替setInterval
}
})
}
經過請求代碼的改進,本以為完事了,結果然並卵,經過一段時間之后,頁面卡死,請求通道阻塞。於是度娘一下,了解到了問題的大郅所在。頻繁的請求占用着帶寬,頁面渲染也需要時間,函數執行計算公式也占用着時間,雖然這些時間使用不多,但是數據無法獲取更新,頁面又出現假死狀態。於是便跟后台商量着放棄ajax的實時請求,采用其他方法進行數據獲取。最終,結合編程語言,了解到了signalR的實時數據推送服務。從原來的主動請求變成了被動獲取數據,將前端壓力移交給了后台。
signalR實時數據推送web端方法如下:
// 在離屏 canvas 上繪制 var offscreencanvas = document.createElement('canvas'); // 寬高賦值為想要的圖片尺寸 offscreencanvas.width = dWidth; offscreencanvas.height = dHeight; // 裁剪 offscreencanvas.getContext('2d').drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); // 在視圖canvas中繪制 viewcontext.drawImage(canvas, x, y);
2、分層畫布
多個相互重疊的canvas根據變化程度分開渲染,越復雜的場景越適合。
3、一次性繪制
繪制操作的性能開銷較高,可以創建一個包含所有線條的路徑,然后通過單個繪制路徑調用進行繪制。
4、使用requestAnimationFrame執行動畫
5、清空畫布
6、減少使用canvas的API