1. 程式人生 > >3D拓撲自動佈局之Node.js篇

3D拓撲自動佈局之Node.js篇

上篇將3D彈力佈局的演算法執行在Web Workers後臺,這篇我們將進一步折騰,將演算法執行到真正的後臺:Node.js,事先申明Node.js篇和Web Workers篇一樣,在這個應用場景下並不能提高效能,純粹為了折騰好玩,當然也不會白玩,人生就在折騰中,只有折騰才能真正成長。


 

核心實現程式碼和Web Workers篇基本一致,唯一區別在於前後臺互動的方式上,worker通過postMessage和addEventListener('message' 就可以傳送和接收訊息,對於真正分離前後臺的Node.js自然沒那麼簡單了,我採用了Socket.io通訊框架,Socket.io讓長連線通訊變得無比簡單,和Web Workers的通訊幾乎一樣的容易了,Socket.io的用法下圖一目瞭然:


 

Node.js後臺程式碼如下,通過require引入HT和Socket.io相關類庫,io = require('socket.io').listen(8036)構建出一個監聽在8036埠的服務,通過io.sockets.on('connection'等著客戶端頁面來建立的socket通訊,通過socket.on('moveMap',監聽客戶端發過來的圖片節點拖拽變化資訊進行同步,通過 socket.emit('result', result);傳送自動佈局演算法的運算結果push到客戶端。

io = require('socket.io').listen(8036);
ht = require('ht.js').ht;
require("ht-forcelayout.js");
reloadModel = require("util.js").reloadModel;    

io.sockets.on('connection', function (socket) {    
    var dataModel = new ht.DataModel(),
        forceLayout = new ht.layout.Force3dLayout(dataModel);

    forceLayout.onRelaxed = function(){    
        var result = {};
        dataModel.each(function(data){
           if(data instanceof ht.Node){
               result[data._id] = data.p3();
           } 
        });
        socket.emit('result', result);
    };
    forceLayout.start();

    socket.on('moveMap', function (moveMap) {
        dataModel.sm().cs();
        for(var id in moveMap){
            var data = dataModel.getDataById(id);
            if(data){
                data.p3(moveMap[id]);
                dataModel.sm().as(data);
            }
        }     
    });
    socket.on('reload', function (data) {
        reloadModel(dataModel, data);   
    });           
});

 客戶端的程式碼需要通過引入Socket.io客戶端類庫,通過socket = io.connect('http://localhost:8036/')連結伺服器獲得握手鍊接socket物件,剩下的程式碼就是同socket.emit傳送客戶端拖拽資訊,以及socket.on監聽伺服器推送過來的自動佈局結果:

            g3d.mi(function(evt){
                if(evt.kind === 'betweenMove'){                
                    moveMap = {};
                    g3d.sm().each(function(data){
                        if(data instanceof ht.Node){
                            moveMap[data._id] = data.p3();
                        }
                    });
                    socket.emit('moveMap', moveMap);                
                }
            }); 

            socket = io.connect('http://localhost:8036/');                              
            socket.on('result', function (result) {
                for(var id in result){
                    var data = dataModel.getDataById([id]);
                    if(data && !g3d.isSelected(data)){
                        data.p3(result[id]);
                    }                
                } 
            });

幾個注意點:

1、首選和Web Workers一樣,跑在Node.js的類庫肯定不能操作window和document之類的頁面特定元素物件,從這點說很多考慮不周全的類庫會把自己限制死只能在頁面主執行緒執行,這點HT for Web考慮得很周到,不僅ht.js包括所有ht-forcelayout.js外掛都是可運在Web Workers和Node.js的非GUI環境,因為我也常需要ht.js執行在後臺直接將DataModel的資料和前臺進行JSON的資料格式轉換儲存。

2、Util.js定義的reloadModel函式我增加了this.reloadModel = reloadModel;的邏輯,這樣才能在Node.js後臺程式碼reloadModel = require("util.js").reloadModel; 這樣的方式得到該函式進行呼叫,細節可以參考 http://nodejs.org/api/modules.html 的章節

3、這個例子是有缺陷的,以下視訊播放過程你會發現,我打開了兩個頁面,這樣就會有兩個socket分別連線後臺Node.js,而Node.js預設是單執行緒的,如果正在一個請求函式密集運算處理,則其他請求只能排隊等待處理,這也是視訊中我拖拽一個頁面佈局是,另一個頁面無法操作的原因。當然你可以改進demo,採用http://nodejs.org/api/cluster.html的cluster方式,實現真正的後臺多核任務處理

相關推薦

3D自動佈局Node.js

上篇將3D彈力佈局的演算法執行在Web Workers後臺,這篇我們將進一步折騰,將演算法執行到真正的後臺:Node.js,事先申明Node.js篇和Web Workers篇一樣,在這個應用場景下並不能提高效能,純粹為了折騰好玩,當然也不會白玩,人生就在折騰中,只有折騰才能真正成長。   核心實現程式碼和W

前端 —— node.js摸爬打滾路(一)

turn lan name resp function oba ack val 括號 安裝: window下的安裝,node.js直接上官網下載:https://nodejs.org/en/ 選擇LTS,也就是版本號比較低的穩定版,下載下來後運行下載的文件進行安裝; 通

實戰系列 Node.js 玩轉 Java

liunx array github cal ddn 公眾 當前 eth pan 這些年以來,Node.js的興起,JavaScript已經從當年的“世界最被誤解的語言”變成了“世界最流行的語言”。且其發展之勢,從語言本身的進

vue node.js 02

模式 turn vue.js sudo aid 接受 sco 全局 放置 文檔 鋪墊 以前網頁制作web1.0 如今是web2.0-->交互式操作 前端工具 grunt gulp webpack :打包機 作用:將項目中的js,cs

NO--12模擬服務器端請求node.js

express span ini ner str number nal load image 最近幾天項目上線,工作比較忙,沒時間更博了,好在今天有點時間並且同事問道我一個問題,正好一塊解決 使用 Vue 寫項目肯定會遇到一個問題,如何模擬服務端請求數據,那這就需要用到

vuenode.js的簡單介紹

esp 模型 包管理器 mit app 開放 數據 src edge 一、什麽是node.js? 它是可以運行JavaScript的服務平臺,可以吧它當做一門後端程序,只是它的開發語言是JavaScript 二、安裝 1、node.js的特性: - 非阻塞IO模型 -

安全看得見,阿里雲效能監控 ARMS 全真3D實現一“屏”瞭然

微服務架構下,各類服務之間存在著錯綜複雜的依賴關係。一旦業務出現問題,追查問題源頭就好比大海撈針,沒有頭緒。但業務不等人,此時,在最短的時間內定位問題根源是開發和運維人員對微服務監控產品的核心訴求。 傳統的監控產品提供了表格(table)、表單(form)和儀表盤(dashboard)三種展現形式,因其侷限

阿里雲效能監控 ARMS 全真3D揭祕

摘要: 微服務架構下,各類服務之間存在著錯綜複雜的依賴關係。一旦業務出現問題,追查問題源頭就好比大海撈針,沒有頭緒。但業務不等人,此時,在最短的時間內定位問題根源是開發和運維人員對微服務監控產品的核心訴求。 傳統的監控產品提供了表格(table)、表單(form)和儀表盤(dashboard)三種展現形式,因

阿裏雲性能監控 ARMS 全真3D揭秘

直觀 主機名 服務架構 cfb ecs 折疊 oss 單元 哪些 摘要: 微服務架構下,各類服務之間存在著錯綜復雜的依賴關系。一旦業務出現問題,追查問題源頭就好比大海撈針,沒有頭緒。但業務不等人,此時,在最短的時間內定位問題根源是開發和運維人員對微服務監控產品的核心訴求。

排序(二) C++詳解

/* * 拓撲排序 * * 返回值: * -1 -- 失敗(由於記憶體不足等原因導致) * 0 -- 成功排序,並輸入結果 * 1 -- 失敗(該有向圖是有環的) */ int ListDG::topologicalSort() { i

排序(一) C語言詳解

/* * 拓撲排序 * * 引數說明: * G -- 鄰接表表示的有向圖 * 返回值: * -1 -- 失敗(由於記憶體不足等原因導致) * 0 -- 成功排序,並輸入結果 * 1 -- 失敗(該有向圖是有環的) */ int to

排序(三) Java詳解

/* * 拓撲排序 * * 返回值: * -1 -- 失敗(由於記憶體不足等原因導致) * 0 -- 成功排序,並輸入結果 * 1 -- 失敗(該有向圖是有環的) */ public int topologicalSort() { int

排序(Topologicalsort)Java實現

拓撲排序演算法介紹 拓撲排序解決的是一系列相互依賴的事件的排序問題,比如Ant中有很多的Task,而某些Task依賴於另外的Task,編譯之前需要清理空間,打包之前要先編譯,但其它一些Task處理順序可以調換(是無所謂前後,不是並行), 如何安排Task的執行順序就可以用拓

2018年JavascriptNode.JS經典教程 Node.js從理論到實戰視訊

適用人群 前端開發,前端工作,前端學習 課程概述 智慧社:Javascript之Node.JS-經典教程:從理論到實戰! 基礎部分(第1-6節) 模組化(第7-8節) 框架應用(第9-24節) 資料庫應用

Storm,元件spout、bolt,並行策略

軟體版本:Storm:0.9.3 ,Redis:2.8.19;jedis:2.6.2;參考:http://storm.apache.org/documentation/Understanding-the-parallelism-of-a-Storm-topology.html

vue學習node.js安裝

在學習vue的時候要運用到很多的es6的語法,整個執行環境要在node下,所以要事先安裝node,關於node的安裝有一篇很好的部落格詳細記錄了,地址:http://blog.csdn.net/tyr

電信網路拓撲圖自動佈局匯流排

在前面《電信網路拓撲圖自動佈局》一文中,我們大體介紹了 HT for Web 電信網路拓撲圖自動佈局的相關知識,但是都沒有深入地描述各種自動佈局的用法,我們今天在這邊就重點介紹匯流排的具體實現方案。 在 HT for Web 的連線手冊中,有說明可以自定義連線型別,通過 h

響應式佈局html5shiv.js/Respond.js

響應式佈局之 html5shiv.js / Respond.js html5shiv.js: 用於解決IE9以下版本瀏覽器對HTML5新增標籤不識別,並導致CSS不起作用的問題。 由於IE6/IE7/IE8還有很大一部分使用者

Node.js實操練習(一)Node.js+MySQL+RESTful

前言 最近學習了一下node.js相關的內容,在這裡初步做個小總結,說實話關於本篇部落格的相關內容,自己很久之前就已經有過學習,但是你懂的,“好記性不如爛筆筒”,學過的東西不做筆記的話,很容易就會忘記的一乾二淨,往往的結果就是自己又要重頭開始學習,這是一個非常痛苦的過程。沒有辦法,為了

前端每週清單半年盤點 Vue.js

前端每週清單專注前端領域內容,以對外文資料的蒐集為主,幫助開發者瞭解一週前端熱點;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源專案、巔峰人生等欄目。歡迎關注【前端之巔】微信公眾號(ID:frontshow),及時獲取前端每週清單;本文則是對於半年來發布的前端每週清單中的 Vue.js 相